MyCat系列十三--数据分片之日期范围hash分片
MyCat系列十三--数据分片之日期范围hash分片
思想和范围取模分片一样,先根据日期进行范围分片求出分片组,再根据时间hash使得短期内数据分布的更均匀 ;
优点 : 可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题
注意 : 要求日期格式尽量精确些,不然达不到局部均匀的目的
具体示例实现的步骤为如下(注:蓝色字体为本示例的相关内容):
- 新建表
CREATE TABLE `t_datehash` (
`userid` int DEFAULT NULL,
`username` varchar(20) DEFAULT NULL,
`LoginTime` datetime DEFAULT NULL
) ENGINE=InnoDB ;
- 配置rule.xml
2.1 配置tableRule 标签
编辑rule.xml文件,增加或者修改如下:
<tableRule name="range-date-hash-test">
<rule>
<columns>LoginTime</columns>
<algorithm>range-date-hash-test</algorithm>
</rule>
</tableRule>
2.2 配置function 标签
编辑rule.xml文件,增加或者修改如下:
<function name="range-date-hash-test" class="io.mycat.route.function.PartitionByRangeDateHash">
<property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>
<property name="sBeginDate">2025-01-01 00:00:00</property>
<property name="groupPartionSize">2</property>
<property name="sPartionDay">10</property>
</function>
日期范围hash分片算法的相关property 子标签含义如下:
2.2.1 dateFormat
日期字符串格式。
例如:
<property name="dateFormat">yyyy-MM-dd</property>
2.2.2 sBeginDate
开始日期。
例如:
<property name="sBeginDate">2025-01-01</property>
2.2.2 groupPartionSize
代表分片组的大小。
例如:
<property name="groupPartionSize">2</property>
2.2.2 sPartionDay
代表多少天分一个分片。
例如:
<property name="sPartionDay">10</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_datehash" dataNode="dn1,dn2,dn3,dn4" rule="range-date-hash-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_datehash(userid,username,LoginTime)
values (1,'张丽丽','2025-01-01 05:10:52')
,(2,'王洁','2025-01-5 12:05:22')
,(3,'李梦','2025-01-11 18:30:30')
,(4,'赵雪','2025-01-15 20:25:30');
select * from t_datehash;
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_datehash;
select * from db_user_2.t_datehash;
select * from db_user_3.t_datehash;
select * from db_user_4.t_datehash;
检查所有的4个分片,可以看到数据的分片存储情况是正确的。
当继续插入如下数据时:
insert into t_datehash(userid,username,LoginTime)
values (5,'高明','2025-01-21 00:00:00');
报告如下错误:
ERROR 1064 (HY000): Can't find a valid data node for specified node index :T_DATEHASH -> LOGINTIME -> 2025-01-21 00:00:00 -> Index : 5
分片未找到,导致插入失败。也可以看出,如果想正确插入数据,则需要构建相应的分片。
- 其它配置验证
在以上正确配置的基础上,我们修改一些标签的配置值为其它不同的值,进行一些验证。
注:以下修改仅限于提及的子标签配置,而其它配置保持不变。
5.1 sPartionDay
编辑rule.xml文件,增加或者修改如下:
<property name="sPartionDay">20</property>
重启MyCat服务。然后,我们进行如下SQL语句执行验证:
delete from t_datehash;
insert into t_datehash(userid,username,LoginTime)
values (1,'张丽丽','2025-01-01 05:10:52')
,(2,'王洁','2025-01-5 12:05:22')
,(3,'李梦','2025-01-11 18:30:30')
,(4,'赵雪','2025-01-15 20:25:30');
在MySQL的服务器上进行查询,如下所示:
select * from db_user_1.t_datehash;
select * from db_user_2.t_datehash;
select * from db_user_3.t_datehash;
select * from db_user_4.t_datehash;