主页 > IT业界  > 

MySQL运维篇之Mycat分片规则

MySQL运维篇之Mycat分片规则
3.5.3、Mycat分片规则 3.5.3.1、范围分片

根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。

示例:

可以通过修改autopartition-long.txt自定义分片范围。

注意:

范围分片针对于数字类型的字段,不适用于字符串类型的字段。

3.5.3.2、取模分片

根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。

示例:

注意:

取模分片针对于数字类型的字段,不适用于字符串类型的字段。

3.5.3.3、一致性hash

所谓一致性hash,相同的hash因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。

示例:将tb_order表内的数据根据字段id进行一致性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');

3.5.3.4、枚举分片

通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。

示例:将tb_user表内的数据根据字段status进行枚举分片

在rule.xml中可以将name="sharding-by-intfile"的tableRule复制一份,进行重写,使其name=“sharding-by-intfile-enumstatus”,专门用于status字段。

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

此时插入一个数据,其status为4,此时会报错:

解决方案:给予找不到数据节点的数据一个默认节点

<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="defaultNode">2</property> <property name="mapFile">partition-hash-int.txt</property> </function>

结果:

3.5.3.5、应用指定算法

运行阶段由应用自主决定路由到哪个分片,直接根据字符子串(必须是数字)计算分片号。

示例:

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

3.5.3.6、固定分片hash算法

该算法类似于十进制的求模运算,但是为二进制的操作,例如,取id的二进制低10位与1111111111进行位&运算。

位&运算:同为1则为1,有一个0则为0

特点:

如果是求模,连续的值,分别分配到各个不同的分片;但是此算法会将连续的值可能分配到相同的分片,降低事务处理的难度。可以均匀分配,也可以非均匀分配。分片字段必须为数字类型。

示例:

注意:

分片长度加起来必须等于1024。

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'); 3.5.3.7、字符串hash解析算法

截取字符串中的指定位置的子字符串,进行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());

3.5.3.8、按(天)日期分片

示例:

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','2022-01-01'); insert into tb_datepart(id,name ,create_time) values(2,'Cat','2022-01-10'); insert into tb_datepart(id,name ,create_time) values(3,'Rose','2022-01-11'); insert into tb_datepart(id,name ,create_time) values(4,'Coco','2022-01-20'); insert into tb_datepart(id,name ,create_time) values(5,'Rose2','2022-01-21'); insert into tb_datepart(id,name ,create_time) values(6,'Coco2','2022-01-30'); insert into tb_datepart(id,name ,create_time) values(7,'Coco3','2022-01-31');

3.5.3.9、按自然月分片

使用场景为按照月份来分片,每个自然月为一个分片。

示例:

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','2022-01-01'); insert into tb_monthpart(id,name ,create_time) values(2,'Cat','2022-01-10'); insert into tb_monthpart(id,name ,create_time) values(3,'Rose','2022-01-31'); insert into tb_monthpart(id,name ,create_time) values(4,'Coco','2022-02-20'); insert into tb_monthpart(id,name ,create_time) values(5,'Rose2','2022-02-25'); insert into tb_monthpart(id,name ,create_time) values(6,'Coco2','2022-03-10'); insert into tb_monthpart(id,name ,create_time) values(7,'Coco3','2022-03-31'); insert into tb_monthpart(id,name ,create_time) values(8,'Coco4','2022-04-10'); insert into tb_monthpart(id,name ,create_time) values(9,'Coco5','2022-04-30');

标签:

MySQL运维篇之Mycat分片规则由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MySQL运维篇之Mycat分片规则