mysql05
mysql 数据切分
通过特定手段,将我们放到同一个数据库中的数据发散到多个数据库中,或分散到多个节点
优点
分散单台设备的负载
提高数据的安全性
缺点
增加了系统的复杂度
引入分布式事务
跨节点join
跨节点的排序分页
多数据管理
水平拆分
垂直拆分
多租户
独立数据库 隔离性最好 安全性最高 数据库备份和恢复方便,价格最高
共享数据库,独立数据架构
共享数据库 共享数据架构 隔离性最差 安全性最差,恢复性差,最便宜
数据切分策略
分片枚举
hash
范围约定
取模
按日期分片
分布式数据库
在物理上分布,逻辑上集中
把组件分布在网络的不同节点上,组件之间通过传递消息进行通信。核心就是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其对高并发或者大数据量的任务
特性
透明性
扩展性
可靠性
高性能
Mycat全局表
全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
全局表的查询操作,只从一个节点获取
全局表可以跟任何一个表进行 JOIN 操作
<table name="mytable" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3"/>
对Select操作,mycat会随机现在一个节点输出结果内容;
对Insert-Update-Delete操作,Mycat会操作所有节点
mycat er 表
mycat节点 192.168.239.140
修改schema.xml
1 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" 2 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 3 <heartbeat>select user()</heartbeat> 4 5 <writeHost host="hostM1" url="localhost:3306" user="scos" 6 password="scos"> 7 8 <readHost host="hostS2" url="localhost:3306" user="scos" password="scos" /> 9 </writeHost> 10 11 </dataHost>
./mycat console
customer表与子表orders和order_items的关系如下
1 <table name="customer" primaryKey="ID" dataNode="dn1,dn2" 2 rule="sharding-by-intfile"> 3 <childTable name="orders" primaryKey="ID" joinKey="customer_id" 4 parentKey="id"> 5 <childTable name="order_items" joinKey="order_id" 6 parentKey="id" /> 7 </childTable> 8 <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" 9 parentKey="id" /> 10 </table>
查看rule.xml
1 <tableRule name="sharding-by-intfile"> 2 <rule> 3 <columns>sharding_id</columns> 4 <algorithm>hash-int</algorithm> 5 </rule> 6 </tableRule>
mysql -u root -p -h192.168.239.140 -P8066
1 创建表 2 create table customer (id int PRIMARY KEY,name VARCHAR(10),sharding_id INT); 3 create table orders (id int PRIMARY KEY,name VARCHAR(10),customer_id INT); 4 create table order_items (id int PRIMARY KEY,order_id int ); 5 6 7 INSERT into customer (id,name,sharding_id) values (1,'xiaoming',10000); 8 explain INSERT into customer (id,name,sharding_id) values (1,'xiaoming',10000); 9 10 data_node dn1 11 12 insert into orders (id,name,customer_id) VALUES (1,'goods',1); 13 14 INSERT into order_items (id,order_id) VALUES(1,1);
mysql -uroot -proot 登陆
1 use db1 2 show tables; 3 4 customer employee orders
验证
1 INSERT into customer (id,name,sharding_id) values (2,'xiaoming',10000); 2 3 explain INSERT into customer (id,name,sharding_id) values (2,'xiaoming',10000); 4 5 data_node dn2
另一种方式,客户端组件分片
sharding JDBC
完