赞
踩
(1)理论基础
分片:将原来单个数据库的数据切分后分散存储在不同的数据库节点
分片节点:分片以后数据存储的节点
分片键:分片依据的字段
分片算法:分片的规则,例如随机、取模、范围、哈希、枚举以及各种组合算法
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
MySQL分库分表主要有垂直分库、垂直分表、水平分库和水平分表4种:
1、垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
特点:
每个库的表结构都不一样。
每个库的数据也不一样。
所有库的并集是全量数据。
2、垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。特点:
每个表的结构都不一样。
每个表的数据也不一样,一般通过一列(主键/外键)关联。
所有表的并集是全量数据。
3、水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
特点:
每个库的表结构都一样。
每个库的数据都不一样。
所有库的并集是全量数据。
4、水平分表:以字段为依据,按照一定策略,将一表的数据拆分到多个表中。
特点:
每个表的表结构都一样。
每个表的数据都不一样。
所有表的并集是全量数据
(2)schema.xml配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- DB01:逻辑数据库,TB_ORDER: 逻辑表,dataNode中的dn1、dn2、dn3位三个逻辑节点,rule为分片规则 -->
<schema name="db01" checkSQLschema="true" sqlMaxLimit="100">
<table name="t_person" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<!-- 配置三个逻辑节点,dn1对应的主机是 dhost1,其中的物理数据库为db01 -->
<dataNode name="dn1" dataHost="dhost1" database="db01" />
<dataNode name="dn2" dataHost="dhost2" database="db02" />
<dataNode name="dn3" dataHost="dhost3" database="db03" />
<!-- 主句 dhost1 的物理配置 ,这里面需要配置MySQL的url、user、password等等-->
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://127.0.0.1:3306?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true" user="root" password="root">
</writeHost>
</dataHost>
<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://127.0.0.1:3306?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true" user="root" password="root">
</writeHost>
</dataHost>
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://127.0.0.1:3306?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true" user="root" password="root">
</writeHost>
</dataHost>
</mycat:schema>
(3)server.xml配置
<user name="root" defaultAccount="true">
<property name="password">root</property>
<property name="schemas">db01</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">db01</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
(4)分片规则
启动mycat服务、使用mycat连接MySQL、使用mycat创建表添加数据
db01:t_person:添加数据
id 为 1、2、3、5000000的数据添加到了ip为192.168.31.215的db01数据库中
id 为5000001的数据添加到了ip为192.168.31.215的db02数据库中
id 为15000000的数据添加到了ip为192.168.31.215的db03数据库中
分片原理如下:
1、分片规则配置在 schema.xml中 ,rule="auto-sharding-long" 就是分片规则
2、auto-sharding-long 为引用,具体规则在 conf/rule.xml 中配置
3、<columns>id</columns> 可以看出 时根据 id 列来分配的,分配算法为 rang-long,这里的rang-long也是一个引用,同样在这个文件中
4、可以看出具体的算法在 文件autopartition-long.txt 中,这个文件就在conf文件夹中
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
-- 能够看出,id 在 0到500M在 0 号逻辑库,等等。最大可以存储id = 1500M的数据,存放在 2号逻辑库。
-- 若此时存储 id = 15000001的数据会怎样呢?
mysql> insert into tb_order(`id`,`title`) values(15000001,"order_15000001");
ERROR 1064 (HY000): can't find any valid datanode :TB_ORDER -> ID -> 15000001
mysql>
-- 能够看出插入失败,若想插入成功,就需要修改分片规则了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。