经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL运维12-Mycat分库分表之按天分片
来源:cnblogs  作者:Se7eN_HOU  时间:2023/12/21 9:04:11  对本文有异议

一、按天分片

  指定一个时间周期,将数据写入一个数据节点中,例如:第1-10天的数据,写入到第一个数据节点中,第2-20天的数据写入到第二个节点中,第3-30天的数据节点写入到第三个数据节点中。    

  

  说明1:按天分片要配置一个起始日期,一个结束日期,一个分片间隔时间三个参数

  说明2:按天分片允许当前时间超出配置的开始时间和结束时间,超出时间范围仍然会按照分片间隔时间,继续在多个数据节点之间切换的

  说明3:该案例中分片的起始时间为2023-12-01,结束时间为2023-12-30,一共30天的时间。但是如果当前日期超过了这个时间段,该规则仍然可以用,继续按照分片间隔时间10天,继续分片。

  说明4:该案例中分片间隔时间为10,即10天。所以这里需要至少三个数据节点。因为分片时间范围是30天除以10天的间隔等于3,而如果只配置了两个分片服务器则会报错,因为第1-10天的数据写在了第一个分片服务器上,第10-20天的数据写入到了第二个分片数据库中,从第21天-30的数据,就会找不到分片服务器而报错。

  

二、准备工作

  逻辑库:hl_logs,先在各个数据节点上创建好数据库。

  

三、配置rule.xml

  1. <!-- rule.xml示例中没有,需要自己手动实现 -->
  2. <tableRule name="sharding-by-date">
  3. <rule>
  4. <columns>create_time</columns>
  5. <algorithm>sharding-by-date</algorithm>
  6. </rule>
  7. </tableRule>

  说明1:这个按照(天)日期分片,在rule.xml示例中也是没有写好的,需要自己实现。

  1. <!-- rule.xml示例中没有,需要自己手动实现 -->
  2. <function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
  3. <property name="dateFormat">yyyy-MM-dd</property>
  4. <property name="sBeginDate">2023-12-01</property>
  5. <property name="sEndDate">2023-12-30</property>
  6. <property name="sPartionDay">10</property>
  7. </function>

  说明2:这个按照(天)日期分片的function标签,在rule.xml示例中也是没有写好的,需要自己实现。

  说明3:dateFormat属性设置的分片日期的格式

  说明4:sBeginDate是分片的开始日期

  说明5:sEndDate是分片的结束日期

  说明6:sPartionDay是分片间隔时间

  说明7:如果当前时间超过了分片结束日期依然可以继续按照分片间隔时间,继续分片使用

四、配置schema.xml

  

  说明1:逻辑库为:hl_logs

  说明2:逻辑表为:tb_day

  说明3:分片规则为:"sharding-by-date"

  

  

  说明4:dn4对应的是dbhost1即192.168.3.90分片

  说明5:dn5对应的是dbhost2即192.168.3.91分片

  说明6:dn6对应的是dbhost3即192.168.3.92分片

五、配置server.xml

  

  说明1:在之前的文章中已经将tb_logs表添加到root用户的权限中了,所以这里不需要更改即可。

六、按(天)日期分片测试

  首先重启Mycat

  

  登录Mycat

  

  查看逻辑库和逻辑表

  

  这里的tb_day只是逻辑库,而在MySQL中还并没有tb_day这个表,需要在Mycat中创建

  1. create table tb_day(id int auto_increment primary key, name varchar(20), create_time varchar(19));

  

  插入数据进行测试:这里插入一组数据进行测试:

  1. insert into tb_day(name, create_time) values ("张三", "2023-12-02");
  2. insert into tb_day(name, create_time) values ("李四", "2023-12-12");
  3. insert into tb_day(name, create_time) values ("王五", "2023-12-22");
  4. insert into tb_day(name, create_time) values ("赵六", "2023-12-31");
  5. insert into tb_day(name, create_time) values ("侯七", "2024-01-01");
  6. insert into tb_day(name, create_time) values ("孙八", "2024-01-11");
  7. insert into tb_day(name, create_time) values ("周九", "2024-01-21");

  

  

  说明1:张三的创建时间为2023-12-02在2023-12-01 至 2023-12-10之间,所以张三在192.168.3.90第一个数据分片上。

  说明2:赵六的创建时间不在2023-12-01 至 2023-12-30的时间范围了,所以重新开始以10天为一周期的计算周期,而2023-12-31在新周期的第一个区间,所以赵六也在192.168.3.90第一个数据分片上。

  说明3:侯七的创建时间不在2023-12-01 至 2023-12-30的时间范围了,所以重新开始以10天为一周期的计算周期,而2024-01-01在新周期的第一个区间,所以侯七也在192.168.3.90第一个数据分片上。

  

  说明4:李四的创建时间为2023-12-12在2023-12-11 至 2023-12-20之间,所以张三在192.168.3.91第二个数据分片上。

  说明5:孙八的创建时间不在2023-12-01 至 2023-12-30的时间范围了,所以重新开始以10天为一周期的计算周期,而2024-01-11在新周期的第二个区间,所以孙八也在192.168.3.91第二个数据分片上。

  

  说明6:王五的创建时间为2023-12-22在2023-12-21 至 2023-12-30之间,所以王五在192.168.3.92第三个数据分片上。

  说明7:周九的创建时间不在2023-12-01 至 2023-12-30的时间范围了,所以重新开始以10天为一周期的计算周期,而2024-01-21在新周期的第三个区间,所以周九也在192.168.3.92第三个数据分片上。

  

  说明8:在Mycat上进行查询的数据是,所有数据节点的全集。按(天)日期分片是水平分库分表的一种方式。

 

原文链接:https://www.cnblogs.com/Se7eN-HOU/p/17914391.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号