MyCat系列十八--数据分片之冷热分片

MyCat系列十八--数据分片之冷热分片

解决方案goocz2025-06-12 11:29:455A+A-

MyCat系列十八--数据分片之冷热分片

根据日期查询数据 冷热数据分布 ,最近 n 的到实时交易库查询,超过 n 的按照 m 天分片。

具体示例实现的步骤为如下(注:蓝色字体为本示例的相关内容):

  1. 新建表

CREATE TABLE `t_hotdate` (

`userid` int DEFAULT NULL,

`username` varchar(20) DEFAULT NULL,

`LoginTime` date DEFAULT NULL

) ENGINE=InnoDB;

  1. 配置rule.xml

2.1 配置tableRule 标签

编辑rule.xml文件,增加或者修改如下:

<tableRule name="hotdate-test">

<rule>

<columns>LoginTime</columns>

<algorithm>hotdate-test</algorithm>

</rule>

</tableRule>

2.2 配置function 标签

编辑rule.xml文件,增加或者修改如下:

<function name="hotdate-test" class="io.mycat.route.function.PartitionByHotDate">

<property name="dateFormat">yyyy-MM-dd</property>

<property name="sLastDay">10</property>

<property name="sPartionDay">30</property>

</function>

冷热分片算法的相关property 子标签含义如下:

2.2.1 dateFormat

日期字符串格式。

例如:

<property name="dateFormat">yyyy-MM-dd</property>

2.2.2 sLastDay

热数据的天数。

例如:

<property name="sLastDay">10</property>

2.2.3 sPartionDay

冷数据的分片天数。

例如:

<property name="sPartionDay">30</property>

  1. 配置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" randomDataNode="true">

<table name="t_hotdate" dataNode="dn1,dn2,dn3,dn4" rule="hotdate-test"></table>

</schema>

<dataNode name="dn1" dataHost="localhost" database="db_user_1" />

<dataNode name="dn2" dataHost="localhost" database="db_user_2" />

<dataNode name="dn3" dataHost="localhost" database="db_user_3" />

<dataNode name="dn4" dataHost="localhost" database="db_user_4" />

<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<heartbeat>select user()</heartbeat>

<writeHost host="localhost" url="localhost:3306" user="root"

password="123456">

</writeHost>

</dataHost>

</mycat:schema>

dataNode:数据节点,配置了dn1,dn2,dn3,dn4,分别指向不同的服务器及其数据库,这里也就是数据分片的配置。本示例为了简单,配置到同一台服务器的不同数据库上。

  1. 验证

重启MyCat服务。然后,我们进行如下SQL语句执行验证:

insert into t_hotdate(userid,username,LoginTime)

values (1,'吴敏','2025-05-13')

,(2,'张丽丽','2025-05-12')

,(3,'王洁','2025-05-11')

,(4,'李梦','2025-05-10')

,(5,'赵雪','2025-05-09')

,(6,'张军','2025-05-08')

,(7,'王钢','2025-05-07')

,(8,'李贸','2025-05-06')

,(9,'赵屏儿','2025-05-05')

,(10,'齐特','2025-05-04')

,(11,'钱素素','2025-05-03')

,(12,'孙珂','2025-04-04')

,(13,'李月月','2025-04-03')

,(14,'李少平','2025-03-05')

,(15,'赵清','2025-03-04');

select * from t_hotdate;

在MySQL的服务器上进行查询,如下所示:

select * from db_user_1.t_hotdate;

select * from db_user_2.t_hotdate;

select * from db_user_3.t_hotdate;

select * from db_user_4.t_hotdate;

从以上查询结果,可以看到数据的分片存储情况,接下来,让我们手工分析一下是否正确。

今天是2025-05-13,按照上面的规则配置,往前推10天为2025年05月04日,则2025年05月04日之前的数据为冷数据,冷数据的分片规则为30天一个分片,即2025年04月04日至2025年05月03日的数据放入第1个分片,2025年03月05日至2025年04月03日的数据放入第2个分片...以此类推,如果数据库分区不够,则在保存的时候会抛出以下异常。例如,继续插入冷数据:

insert into t_hotdate(userid,username,LoginTime)

values (16,'吴敏','2025-01-01');

将会报告如下错误:

ERROR 1064 (HY000): Can't find a valid data node for specified node index :T_HOTDATE -> LOGINTIME -> 2025-01-01 -> Index : 5

  1. 其它配置验证

在以上正确配置的基础上,我们修改一些标签的配置值为其它不同的值,进行一些验证。

注:以下修改仅限于提及的子标签配置,而其它配置保持不变。

5.1 sLastDay & sPartionDay

编辑rule.xml文件,进行平均分片。如下所示:

<property name="sLastDay">5</property>

<property name="sPartionDay">7</property>

重启MyCat服务。然后,我们进行如下SQL语句执行验证:

delete from t_hotdate;

insert into t_hotdate(userid,username,LoginTime)

values (1,'吴敏','2025-05-13')

,(2,'张丽丽','2025-05-12')

,(3,'王洁','2025-05-11')

,(4,'李梦','2025-05-10')

,(5,'赵雪','2025-05-09')

,(6,'张军','2025-05-08')

,(7,'王钢','2025-05-02')

,(8,'李贸','2025-05-01')

,(9,'赵屏儿','2025-04-25')

,(10,'齐特','2025-04-24')

,(11,'钱素素','2025-04-18');

在MySQL的服务器上进行查询,如下所示:

select * from db_user_1.t_user2;

select * from db_user_2.t_user2;

select * from db_user_3.t_user2;

select * from db_user_4.t_user2;

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5