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=0
500M-1000M=1
1000M-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 -p123456
use 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=0
2=1
3=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 -p123456
use 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 -p123456
use 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 -p123456
use 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 -p123456
use 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 -p123456
use 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 -p123456
use 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表有相应数据 这些数据是按照按自然月分配的规则,把数据分配到三台服务器