rule = "auto-sharding-long"
根据指定的字段(默认是主键字段)及其配置的范围(默认是500万)与数据节点的对应情况,来决定该数据属于哪一个分片 例如: id值在0~500万,就存储在第一台分片服务器; id值在500万~1000万,就存储在第二台服务器; ...
如何指定是哪个字段 在/usr/local/mycat/conf目录的schema.xml文件找到如下。primaryKey表示根据什么字段(id)来分片。rule表示分片规则(rang-long)。
<schema name="逻辑库名" checkSQLschema="true" sqlMaxLimit="100"> <table name="逻辑表名" dataNode="分片服务器名1,分片服务器名2,分片服务器名3" primaryKey="id" rule="rang-long"/></schema>底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(rang-long)
<tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule></tableRule>
如何指定范围分片的配置范围 在/usr/local/mycat/conf目录的autopartition-long.txt文件找到如下。M表示万,K表示千,即可修改范围
0-500M=0500M-1000M=11000M-1500M=2
rule = "mod-long"
根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片 例如: id值有0~7,也就是有5条数据。共有3台分片节点服务器。怎么判断哪个id值的数据会存到哪个节点服务器,如下 id为1的数据会存到第二台服务器,原因:1%3=1 id为2的数据会存到第三台服务器,原因:2%3=2 id为3的数据会存到第一台服务器,原因:3%3=0 id为4的数据会存到第二台服务器,原因:4%3=1 id为5的数据会存到第三台服务器,原因:5%3=2 id为6的数据会存到第一台服务器,原因:6%3=0 id为7的数据会存到第二台服务器,原因:7%3=1
如何指定是哪个字段 在/usr/local/mycat/conf目录的schema.xml文件找到如下。primaryKey表示根据什么字段(id)来分片。rule表示分片规则(mod-long)。
<schema name="逻辑库名" checkSQLschema="true" sqlMaxLimit="100"> <table name="逻辑表名" dataNode="分片服务器名1,分片服务器名2,分片服务器名3" primaryKey="id" rule="mod-long"/></schema>底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(mod-long)
<tableRule name="mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule></tableRule>
如何指定求模的节点数量 在/usr/local/mycat/conf目录的rule.xml文件找到如下。修改property的数量即可
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">3</property></function>
rule = "sharding-by-murmur"
根据指定字段的hash值来进行分片。所谓一致性哈希,指的是相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的 增加而改变原来数据的分区位置。简单说就把id值是一样的、或者hash函数是一样的,那么数据就会被划分到同一台分片服务器,即使以后 增加了或减少了分片服务器,我们的数据是不会改变存储位置的(原来在哪个分片服务器,就在哪个分片服务器)
如何指定是哪个字段 在/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(murmur)
<tableRule name="sharding-by-murmur"> <rule> <columns>id</columns> <algorithm>murmur</algorithm> </rule></tableRule>
如何指定hash分片 在/usr/local/mycat/conf目录的rule.xml文件找到如下
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"> <property name="seed">0</property> #默认是0 <property name="count">3</property> #例如有三台分片服务器,那么就指定为3,表示数据会存到3台服务器 <property name="virtualBucketTimes">160</property></function>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xml文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建guding数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use HASH;create table tb_order( id varchar(100) not null primary key, money int null, content varchar(200) null);INSERT INTO tb_order (id, money, content) VALUES ('b92fdaaf-6fc4-11ec-b831-482ae33c4a2d', 10, 'b92fdaf8-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b93482b6-6fc4-11ec-b831-482ae33c4a2d', 20, 'b93482d5-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b937e246-6fc4-11ec-b831-482ae33c4a2d', 50, 'b937e25d-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b93be2dd-6fc4-11ec-b831-482ae33c4a2d', 100, 'b93be2f9-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b93f2d68-6fc4-11ec-b831-482ae33c4a2d', 130, 'b93f2d7d-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b9451b98-6fc4-11ec-b831-482ae33c4a2d', 30, 'b9451bcc-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b9488ec1-6fc4-11ec-b831-482ae33c4a2d', 560, 'b9488edb-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b94be6e6-6fc4-11ec-b831-482ae33c4a2d', 10, 'b94be6ff-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b94ee10d-6fc4-11ec-b831-482ae33c4a2d', 123, 'b94ee12c-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b952492a-6fc4-11ec-b831-482ae33c4a2d', 145, 'b9524945-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b95553ac-6fc4-11ec-b831-482ae33c4a2d', 543, 'b95553c8-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b9581cdd-6fc4-11ec-b831-482ae33c4a2d', 17, 'b9581cfa-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b95afc0f-6fc4-11ec-b831-482ae33c4a2d', 18, 'b95afc2a-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b95daa99-6fc4-11ec-b831-482ae33c4a2d', 134, 'b95daab2-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b9667e3c-6fc4-11ec-b831-482ae33c4a2d', 156, 'b9667e60-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b96ab489-6fc4-11ec-b831-482ae33c4a2d', 175, 'b96ab4a5-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b96e2942-6fc4-11ec-b831-482ae33c4a2d', 180, 'b96e295b-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b97092ec-6fc4-11ec-b831-482ae33c4a2d', 123, 'b9709306-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b973727a-6fc4-11ec-b831-482ae33c4a2d', 230, 'b9737293-6fc4-11ec-b831-482ae33c4a2d');INSERT INTO tb_order (id, money, content) VALUES ('b978840f-6fc4-11ec-b831-482ae33c4a2d', 560, 'b978843c-6fc4-11ec-b831-482ae33c4a2d');
6、此时去datagrip软件,看我们的第一、二、三台服务器的hash数据库 会发现第一台服务器的tb_order表有相应数据 会发现第二台服务器的tb_order表有相应数据 会发现第三台服务器的tb_order表有相应数据 这些数据是按照一致性hash的规则,把数据分配到三台服务器
rule = "sharding-by-intfile-xxxx"
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点服务器上
如何指定枚举值 在/usr/local/mycat/conf目录的rule.xml文件找到如下
<tableRule name="sharding-by-intfile"> <rule> <columns>sharding_id</columns> <algorithm>hash-int</algorithm> </rule></tableRule><tableRule name="sharding-by-intfile-enumstatus"> <rule> <columns>status</columns> <algorithm>hash-int</algorithm> </rule></tableRule>底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="defaultNode">2</property> #2表示默认节点,作用当数据都不满足我们的枚举值,那数据就会存到第2台节点服务器 <property name="mapFile">partition-hash-int.txt</property> #partition-hash-int.txt表示映射文件</function>
如何修改映射文件,即修改枚举值对应的分片节点 在/usr/local/mycat/conf目录的partition-hash-int.txt文件找到如下。语法: 枚举值=哪台分片服务器
1=02=13=2表示如果数据的枚举值为1,那么就存储在第一台分片节点服务器; 枚举值为2就存储在第二台分片服务器; 枚举值为5就存储在第二台节点服 务器(因为上面我们指定了默认节点为2)
tip: 怎么指定枚举值以及对应的节点很简单,就看我们要导入什么数据,比如我们要导入一张tb_user表,表里面有一个字段是status,值要么 是0、要么是1、要么是3,那我们就可以把status字段的三个不同的只当做是枚举值,当某条数据的status为0,该数据就会存到第一台服务器, 当某条数据的status为1,该数据就会存到第二台服务器,当某条数据的status为2,该数据就会存到第三台服务器。
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xml、partition-hash-int.txt.txt文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建meiju数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use MEIJU;CREATE TABLE tb_user ( id bigint(20) NOT NULL COMMENT 'ID', username varchar(200) DEFAULT NULL COMMENT '姓名', status int(2) DEFAULT '1' COMMENT '1: 未启用, 2: 已启用, 3: 已关闭', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into tb_user (id,username ,status) values(1,'Tom',1);insert into tb_user (id,username ,status) values(2,'Cat',2);insert into tb_user (id,username ,status) values(3,'Rose',3);insert into tb_user (id,username ,status) values(4,'Coco',2);insert into tb_user (id,username ,status) values(5,'Lily',1);insert into tb_user (id,username ,status) values(6,'Tom',1);insert into tb_user (id,username ,status) values(7,'Cat',2);insert into tb_user (id,username ,status) values(8,'Rose',3);insert into tb_user (id,username ,status) values(9,'Coco',2);insert into tb_user (id,username ,status) values(10,'Lily',1);insert into tb_user (id,username ,status) values(11,'Lily2',5);
6、此时去datagrip软件,看我们的第一、二、三台服务器的meiju数据库 会发现第一台服务器的tb_order表有相应数据 会发现第二台服务器的tb_order表有相应数据 会发现第三台服务器的tb_order表有相应数据 这些数据是按照枚举的规则,把数据分配到三台服务器
rule = "sharding-by-substring"
运行阶段由应用自主决定路由到哪个分片,直接根据字符字串(必须是数字)计算分片号。例如指定的字符串是0,该数据就会存储到 第一台服务器上,指定的字符串是1,该数据就会存储到第二台服务器上,指定的字符串是2,该数据就会存储到第三台服务器上
在/usr/local/mycat/conf目录的rule.xml文件添加如下
<tableRule name="sharding-by-substring"> <rule> <columns>id</columns> <algorithm>sharding-by-substring</algorithm> </rule></tableRule><function name="sharding-by-substring" class="io.mycat.route.function.PartitionDirectBySubString"> <!-- 开始索引 --> <property name="startIndex">0</property> <!-- 截取长度 --> <property name="size">2</property> <!-- 分片数量 --> <property name="partitionCount">3</property> <!-- 默认分片,01开头的数据会放到第一台分片服务器,02会放到第二台,03会放到第三台,其他会放到第一台服务器--> <property name="defaultPartition">0</property></function>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建建zhiding数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use ZHIDING;CREATE TABLE tb_app ( id varchar(10) NOT NULL COMMENT 'ID', name varchar(200) DEFAULT NULL COMMENT '名称', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into tb_app (id,name) values('0000001','Testx00001');insert into tb_app (id,name) values('0100001','Test100001');insert into tb_app (id,name) values('0100002','Test200001');insert into tb_app (id,name) values('0200001','Test300001');insert into tb_app (id,name) values('0200002','TesT400001');insert into tb_app (id,name) values('0400002','TesT900001');
6、此时去datagrip软件,看我们的第一、二、三台服务器的meiju数据库 会发现第一台服务器的tb_app表有相应数据 会发现第二台服务器的tb_app表有相应数据 会发现第三台服务器的tb_app表有相应数据 这些数据是按照应用指定算法的规则,把数据分配到三台服务器
rule = "sharding-by-long-hash"
该算法类似于十进制的求模运算,但是为二进制的操作。例如,取id值的二进制(十位)与1111111111进行与运算。 最后的与运算结果一定在0000000000~11111111111,转换成10进制就是0~1024 我们可以把结果为0~255范围的数据放到第一台服务器,256~511放到第二台服务器,512~1023放到第三台服务器, 超过1024就会存储到第一台服务器
特点:
1、如果是求模,连续的值,分别分配到各个不同的分片; 但是此算法会将连续的值可能分配到相同的分片,降低了事务处理的难度
2、可以均匀分配,也可以非均匀分配
3、分片字段(默认是id字段)必须为数字类型
在/usr/local/mycat/conf目录的rule.xml文件找到并修改为如下
<function name="sharding-by-long-hash" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">2,1</property> <property name="partitionLength">256,512</property></function>在/usr/local/mycat/conf目录的rule.xml文件添加如下
<tableRule name="sharding-by-long-hash"> <rule> <columns>id</columns> <algorithm>sharding-by-long-hash</algorithm> </rule></tableRule>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建建guding_hash数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use GUDING_HASH;CREATE TABLE tb_longhash ( id int(11) NOT NULL COMMENT 'ID', name varchar(200) DEFAULT NULL COMMENT '名称', firstChar char(1) COMMENT '首字母', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into tb_longhash (id,name,firstChar) values(1,'七匹狼','Q');insert into tb_longhash (id,name,firstChar) values(2,'八匹狼','B');insert into tb_longhash (id,name,firstChar) values(3,'九匹狼','J');insert into tb_longhash (id,name,firstChar) values(4,'十匹狼','S');insert into tb_longhash (id,name,firstChar) values(5,'六匹狼','L');insert into tb_longhash (id,name,firstChar) values(6,'五匹狼','W');insert into tb_longhash (id,name,firstChar) values(7,'四匹狼','S');insert into tb_longhash (id,name,firstChar) values(8,'三匹狼','S');insert into tb_longhash (id,name,firstChar) values(9,'两匹狼','L');insert into tb_longhash (id,name,firstChar) values(269,'两匹狼2','L');insert into tb_longhash (id,name,firstChar) values(889,'两匹狼2','L');insert into tb_longhash (id,name,firstChar) values(1589,'两匹狼2','L');
6、此时去datagrip软件,看我们的第一、二、三台服务器的guding_hash数据库 会发现第一台服务器的tb_longhash表有相应数据 会发现第二台服务器的tb_longhash表有相应数据 会发现第三台服务器的tb_longhash表有相应数据 这些数据是按照应用固定hash算法的规则,把数据分配到三台服务器
rule = "sharding-by-stringhash"
截取字符串中的指定位置的子字符串,进行hash算法,算出分片。上一种分片规则是直接用字段值(数字类型的)与1111111111(二进制)进行 与运算,然后根据算出来的结果来决定某个数据会存储到哪台服务器。这节课讲的这种分片规则是截取字段值(字符串类型的)其中的子字符串, 再把截取出来的子字符串先转换为hash值(数字类型的),然后再跟1111111111(二进制)进行与运算,然后根据算出来的结果来决定某个数据 会存储到哪台服务器
在/usr/local/mycat/conf目录的rule.xml文件添加如下
<tableRule name="sharding-by-stringhash"> <rule> <columns>user_id</columns> <algorithm>sharding-by-stringhash</algorithm> </rule></tableRule><function name="sharding-by-stringhash" class="io.mycat.route.function.PartitionByString"> <property name="partitionLength">512</property> <!-- zero-based --> <property name="partitionCount">2</property> <property name="hashSlice">0:2</property></function>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建建zifuchuan_hash数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use ZIFUCHUAN_HASH;create table tb_strhash(name varchar(20) primary key,content varchar(100))engine=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO tb_strhash (name,content) VALUES('T1001', UUID());INSERT INTO tb_strhash (name,content) VALUES('ROSE', UUID());INSERT INTO tb_strhash (name,content) VALUES('JERRY', UUID());INSERT INTO tb_strhash (name,content) VALUES('CRISTINA', UUID());INSERT INTO tb_strhash (name,content) VALUES('TOMCAT', UUID());
6、此时去datagrip软件,看我们的第一、二台服务器的zifuchuan_hash数据库 会发现第一台服务器的tb_strhash表有相应数据 会发现第二台服务器的tb_strhash表有相应数据 这些数据是按照应用字符hash解析的规则,把数据分配到两台服务器
rule = "sharding-by-date"
指定一段时间,在指定周期,产生的数据就存储到哪个分片服务器。例如0~30天,周期10,也就是0~10天产生的数据会存储放到第一台 服务器,10~20天产生的数据会存储在第二台服务器,20~30天产生的数据会存储在第三台服务器。 注意: 例如我们只有三台服务器,有0~30天的数据需要分片存储,那周期必须为10,必须要刚好分完。否则报错 在/usr/local/mycat/conf目录的rule.xml文件添加如下
<tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date</algorithm> </rule></tableRule><function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2023-02-01</property> <property name="sEndDate">2023-02-30</property> <property name="sPartionDay">10</property></function>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建建date_fenpian数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use DATE_FENPIAN;create table tb_datepart( id bigint not null comment 'ID' primary key, name varchar(100) null comment '姓名', create_time date null);insert into tb_datepart(id,name ,create_time) values(1,'Tom','2023-02-01');insert into tb_datepart(id,name ,create_time) values(2,'Cat','2023-02-10');insert into tb_datepart(id,name ,create_time) values(3,'Rose','2023-02-11');insert into tb_datepart(id,name ,create_time) values(4,'Coco','2023-02-20');insert into tb_datepart(id,name ,create_time) values(5,'Rose2','2023-02-21');insert into tb_datepart(id,name ,create_time) values(6,'Coco2','2023-02-28');
注意数据必须要在这个范围内,如果插入3月的数据就会报错
6、此时去datagrip软件,看我们的第一、二、三台服务器的date_fenpian数据库 会发现第一台服务器的tb_datepart表有相应数据 会发现第二台服务器的tb_datepart表有相应数据 这些数据是按照按天分配的规则,把数据分配到三台服务器
rule = "sharding-by-month"
使用场景为按照月份来分片,每个自然月为一个分片。 例如1月的数据在第一台服务器存储,第2月在第二台,第3月在第三台,第4月在第一台,第5月在第二台,....,相当于前面的取模规则 注意:例如02-01 ~ 04-30,其中共三个自然月,那我们必须要有三台分片服务器,不然报错
在/usr/local/mycat/conf目录的rule.xml文件找到并修改为如下
<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <!-- 2月到5月,中间有3个自然月,所以会有三个分片。例如2月产生的数据会存储在第一台分片服务器,3月在第二台,4月在第三台 --> <property name="sBeginDate">2023-02-01</property> <property name="sEndDate">2023-04-30</property><!-- 4月只有30天,写成31会报错 --></function><tableRule name="sharding-by-month"> <rule> <!-- 根据create_time字段来分片 --> <columns>create_time</columns> <algorithm>partbymonth</algorithm> </rule></tableRule>
1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、在第一台服务器启动mycat
#停止cd /usr/local/mycat && bin/mycat stop#启动cd /usr/local/mycat && bin/mycat start#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建建month_fenpian数据库
5、在第一台服务器登录进mycat,并导入表结构和表数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456use MONTH_FENPIAN;create table tb_monthpart( id bigint not null comment 'ID' primary key, name varchar(100) null comment '姓名', create_time date null);insert into tb_monthpart(id,name ,create_time) values(1,'Tom','2023-02-01');insert into tb_monthpart(id,name ,create_time) values(2,'Cat','2023-02-10');insert into tb_monthpart(id,name ,create_time) values(3,'Rose','2023-02-26');insert into tb_monthpart(id,name ,create_time) values(4,'Coco','2023-03-20');insert into tb_monthpart(id,name ,create_time) values(5,'Rose2','2023-03-25');insert into tb_monthpart(id,name ,create_time) values(6,'Coco2','2023-03-10');insert into tb_monthpart(id,name ,create_time) values(7,'Coco3','2023-04-21');insert into tb_monthpart(id,name ,create_time) values(8,'Coco4','2023-04-10');insert into tb_monthpart(id,name ,create_time) values(9,'Coco5','2023-04-30');insert into tb_monthpart(id,name ,create_time) values(10,'CocoA','2023-05-10');insert into tb_monthpart(id,name ,create_time) values(11,'CocoB','2023-06-10');insert into tb_monthpart(id,name ,create_time) values(12,'CocoC','2023-07-10');
注意,我们虽然设置的是2~4月,但是不在这个范围内的也是可以插入的 例如5月的数据会在第一台服务器,6月的会在第二台服务器,7月的会在第三台服务器,...
注意,我们的范围是2~4月,里面涉及到是三个自然月,所以必须要有三台服务器,不然mycat启动不了,也就是报错
6、此时去datagrip软件,看我们的第一、二、三台服务器的month_fenpian数据库 会发现第一台服务器的tb_monthpart表有相应数据 会发现第二台服务器的tb_monthpart表有相应数据 这些数据是按照按自然月分配的规则,把数据分配到三台服务器