7.1 分库规则
- auto-sharding-long 范围约定:以500万为单位,实现分片规则,逻辑库A对应 dataNode-db1和db2. 1-500万保存在db1中, 500万零1到1000万保存在db2 中,1000万零1到1500万保存在db1中.依次类推.
- crc32slot规则:在CRUD操作时,根据具体数据的crc32算法计算,数据应该保存在 哪一个dataNode中
配置分片规则需要注意的地方
- id 中推荐配置主键列
- 所有的 tableRule 只能使用一次。如果需要为多个表配置相同的分片规则,那 么需要在此重新定义该规则。
- 在 crc32Slot 算法中的分片数量一旦给定,MyCat会将该分片数量和slot的取值 范围保存到文件中。在次修改分片数量时是不会生效的,需要将该文件删除。文 件位置位于 conf 目录中的 ruledata 目录中。
7.2 配置分库
在master中创建3个数据库
create database demo1 default character set utf8;
create database demo2 default character set utf8;
create database demo3 default character set utf8;
3个数据库中都要创建t_users表
CREATE TABLE `t_users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
修改Schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="suibian" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_users" dataNode="dn1,dn2,dn3" rule="crc32slot" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="demo1" />
<dataNode name="dn2" dataHost="localhost1" database="demo2" />
<dataNode name="dn3" dataHost="localhost1" database="demo3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.10.102:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.10.103:3306" user="root"password="root" />
</writeHost>
</dataHost>
</mycat:schema>
修改rule.xml
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>
测试
注意:
- 使用MyCat实现分库时,先在MyCat中定义逻辑库与逻辑表,然后在MyCat的链接中执行创建表的命令必须要在 MyCat中运行。因为MyCat在创建表时,会在表中添加一个新的列,列名为_slot。
- 使用MyCat插入数据时,语句中必须要指定所有的列。即便是一个完全项插入也不允许省略列名。