mycat水平分表取模分片实现
我们首先修改schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<table name="t_user" primaryKey="id" dataNode="dn1" />
<table name="t_order" primaryKey="id" dataNode="dn2,dn3" rule="order-rule"/>
<!--<table name="t_product" primaryKey="id" dataNode="dn2" />-->
</schema>
<dataNode name="dn1" dataHost="host1" database="db_mall_user" />
<dataNode name="dn2" dataHost="host2" database="db_mall_order" />
<dataNode name="dn3" dataHost="host3" database="db_mall_order" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.20.0.7:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="172.20.0.8:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="host3" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM3" url="172.20.0.9:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
这里:
<table name="t_order" primaryKey="id" dataNode="dn2,dn3" rule="order-rule"/>
我们搞了两个数据点dn2和dn3 作为t_order表的两个分片 规则是 order-rule
再打开rule.xml
<tableRule name="order-rule">
<rule>
<columns>uId</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
加一个配置
这里 columns是规则字段 根据这个字段来实现分表;
algorithm是分表算法 我们用 mod-long 取模分片;
下方function有具体定义:
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
我们要把 count改成2 因为我们就搞了2个分片;
我们启动三个mysql
docker run -p 3306:3306 --name db_mall_user -d -v /home/mysql7/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql7/log/:/var/log --net extnetwork --ip 172.20.0.7 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
docker run -p 3307:3306 --name db_mall_order -d -v /home/mysql8/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql8/log/:/var/log --net extnetwork --ip 172.20.0.8 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
docker run -p 3308:3306 --name db_mall_order2 -d -v /home/mysql9/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql9/log/:/var/log --net extnetwork --ip 172.20.0.9 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
再启动mycat
docker run -p 8066:8066 -it -v /home/docker/mycat2/conf/:/home/mycat/conf/ -v /home/docker/mycat2/logs/:/home/mycat/logs/ --net extnetwork --ip 172.20.0.6 91a24c31abc1
172.20.0.7建 db_mall_user 数据库;
172.20.0.8 和172.20.0.9 建 db_mall_order 数据库
mycat执行:
CREATE TABLE `T_USER` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`userName` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` varchar(20) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `T_ORDER` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`pId` int(11) DEFAULT NULL COMMENT '商品编号',
`num` int(11) DEFAULT NULL COMMENT '购买数量',
`uId` int(11) DEFAULT NULL COMMENT '用户编号',
`orderDate` datetime DEFAULT NULL COMMENT '下单时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (1,1,1,1,'2020-03-16 22:10:25');
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (2,1,1,2,'2020-03-16 22:10:25');
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (3,1,1,2,'2020-03-16 22:10:25');
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (4,1,1,4,'2020-03-16 22:10:25');
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (5,1,1,5,'2020-03-16 22:10:25');
insert into `T_ORDER`(`id`,`pId`,`num`,`uId`,`orderDate`) values (6,1,1,5,'2020-03-16 22:10:25');
说明成功分片;
SELECT * FROM T_ORDER
sql查询,结果是mycat拼接后的结果;
删除所有镜像
docker rm -f $(docker ps -qa)
上一篇:mycat水平分表原则
下一篇:mycat全局自增ID