MyCat系列十八--数据分片之冷热分片
MyCat系列十八--数据分片之冷热分片
根据日期查询数据 冷热数据分布 ,最近 n 的到实时交易库查询,超过 n 的按照 m 天分片。
具体示例实现的步骤为如下(注:蓝色字体为本示例的相关内容):
- 新建表
CREATE TABLE `t_hotdate` (
`userid` int DEFAULT NULL,
`username` varchar(20) DEFAULT NULL,
`LoginTime` date DEFAULT NULL
) ENGINE=InnoDB;
- 配置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>
- 配置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,分别指向不同的服务器及其数据库,这里也就是数据分片的配置。本示例为了简单,配置到同一台服务器的不同数据库上。
- 验证
重启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
- 其它配置验证
在以上正确配置的基础上,我们修改一些标签的配置值为其它不同的值,进行一些验证。
注:以下修改仅限于提及的子标签配置,而其它配置保持不变。
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;