手把手基于Mycat实现MySQL数据拆分( 三 )


文章插图
 
 

根据查询结果在mycat上查询是两条数据,在stt201上是北京,在stt202上是天津
 
范围约定分片
比如我们的用户id,将0-100000、100001-200000等这些按照范围存储,适用于范围提前规定好的场景,我们这里使用一张支付信息表为例
配置schema.xml文件
【手把手基于Mycat实现MySQL数据拆分】配置rule.xml配置文件
order_id rang-long ...... autopartition-long.txt 0
修改autopartition-long.txt文件
注意:将原本有的配置删除
0-102 = 0 103-200=1
重启mycat,创建表,插入数据
CREATE TABLE payment_info( id INT AUTO_INCREMENT, order_id INT, payment_status INT, PRIMARY KEY (id) ); INSERT INTO payment_info(id,order_id,payment_status) VALUES (1,101,0); INSERT INTO payment_info(id,order_id,payment_status) VALUES (2,102,1); INSERT INTO payment_info(id,order_id,payment_status) VALUES (3,103,0); INSERT INTO payment_info(id,order_id,payment_status) VALUES (4,104,1);
手把手基于Mycat实现MySQL数据拆分

文章插图
 
 
我们可以看到在mycat上查询全量数据,在stt201上展示两条,在stt202上展示两条,并且数据分布也正确
 
按照日期分片
我们按照天进行划分,设定时间格式、范围
修改schema.xml配置文件
修改rule.xml配置文件
login_date shardingByDate ...... yyyy-MM-dd 2020-04-01 2020-04-04 2
重启Mycat,创建表插入数据
CREATE TABLE login_info( id INT AUTO_INCREMENT, user_id INT, login_date date, PRIMARY KEY (id) ); INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2020-04-01'); INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2020-04-02'); INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2020-04-03'); INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2020-04-04'); INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2020-04-05'); INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2020-04-06');
手把手基于Mycat实现MySQL数据拆分

文章插图
 
 
看到效果,stt201上四条数据因为超过结束日期重新开始分区,stt202上两条数据,大家可以按照自己的想法去操作,看看是否和自己预想的效果一样,好好体会体会!到此我们完成了基于Mycat的数据库切分操作以及常用的切分方式作为参考
 
全局序列
在分库分表的情况下,数据库自增主键已无法保证自增主键的唯一性,为此Mycat提供了全局序列,提供了本地配置和数据库配置多种实现方式
本地文件
此方式Mycat将sequence配置到文件中,当使用到sequence中的配置后,Mycat会更新该值
 
  • 优势:本地加载,读取速度较快
  • 弊端:抗风险性差,mycat宕机无法读取配置文件,重启之后序列会重新开始,造成重复
 
数据库方式(推荐使用)
利用数据库的一个表来进行累加,并不是每次生成序列都读写数据库,这样太慢,Mycat会预先加载一部分到Mycat内存中,这样大部分读写都在内存中完成,如果内存中号段用完Mycat再向数据库要一次
在dn1上创建MYCAT_SEQUENCE序列表
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY(name) )ENGINE=InnoDB;
创建函数获取当前sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval; END $ DELIMITER ;
创建函数设置sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = https://www.isolves.com/it/sjk/MYSQL/2022-11-01/value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END $ DELIMITER ;
创建函数获取下一个sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = https://www.isolves.com/it/sjk/MYSQL/2022-11-01/current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END $ DELIMITER ;


推荐阅读