java1234开源博客系统
博客信息

mycat水平分表取模分片实现

0
发布时间:『 2020-04-02 21:18』  博客类别:Mycat  阅读(2479) 评论(0)

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');

 QQ鎴浘20200327223004.jpg


 QQ鎴浘20200327223014.jpg


 

说明成功分片;

 

SELECT * FROM T_ORDER

QQ鎴浘20200327223047.jpg

 

sql查询,结果是mycat拼接后的结果;

 

删除所有镜像

docker rm -f $(docker ps -qa)

 

关键字:   无
关注Java1234微信公众号
博主信息
Java1234_小锋
(知识改变命运,技术改变世界)
Powered by Java1234 V3.0 Copyright © 2012-2016 Java知识分享网 版权所有