MyCat系列十三--数据分片之日期范围hash分片

MyCat系列十三--数据分片之日期范围hash分片

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

MyCat系列十三--数据分片之日期范围hash分片

思想和范围取模分片一样,先根据日期进行范围分片求出分片组,再根据时间hash使得短期内数据分布的更均匀 ;

优点 : 可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题

注意 : 要求日期格式尽量精确些,不然达不到局部均匀的目的

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

  1. 新建表

CREATE TABLE `t_datehash` (

`userid` int DEFAULT NULL,

`username` varchar(20) DEFAULT NULL,

`LoginTime` datetime DEFAULT NULL

) ENGINE=InnoDB ;

  1. 配置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>

  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_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,分别指向不同的服务器及其数据库,这里也就是数据分片的配置。本示例为了简单,配置到同一台服务器的不同数据库上。

  1. 验证

重启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

分片未找到,导致插入失败。也可以看出,如果想正确插入数据,则需要构建相应的分片。

  1. 其它配置验证

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

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

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;

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

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