1 按照日期(天)分片:

  1. 从开始日期算起,按照天数来分片 例如,从2017-11-01,每10天一个分片且可以指定结束日期
  2. 注意事项:需要提前将分片规划好,建好,否则有可能日期超出实际配置分片数

1.1 修改配置文件

  1. #修改rule.xml 添加按日期分片的的分配规则
  2. vi rule.xml
  3. <function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate">
  4. <property name="dateFormat">yyyy-MM-dd</property> <!--日期格式-->
  5. <property name="sBeginDate">2017-11-01</property> <!--开始日期-->
  6. <property name="sPartionDay">10</property> <!--每分片天数-->
  7. </function>
  8. <tableRule name="sharding-by-date">
  9. <rule> <columns>create_date</columns>
  10. <algorithm>sharding-by-date</algorithm>
  11. </rule>
  12. </tableRule>
  13. #修改schema.xml 添加逻辑表
  14. vi schema.xml
  15. <table name="mycatbydate" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-date"/>
  16. #重新加载配置文件
  17. [root@localhost conf]# mysql -h 192.168.2.130 -P9066 -utest -ptest
  18. Warning: Using a password on the command line interface can be insecure.
  19. Welcome to the MySQL monitor. Commands end with ; or \g.
  20. Your MySQL connection id is 20
  21. Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (monitor)
  22. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  23. Oracle is a registered trademark of Oracle Corporation and/or its
  24. affiliates. Other names may be trademarks of their respective
  25. owners.
  26. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  27. mysql>
  28. mysql>
  29. mysql> reload @@config;
  30. Query OK, 1 row affected (0.08 sec)
  31. Reload config success

1.2 创建表后插入数据并分析日志

  1. mysql> create table mycatbydate(id int not null auto_increment primary key,
  2. create_date datetime,datanode varchar(10));
  3. mysql> insert into mycatbydate(create_date,datanode) values('2017-06-01',database());

分析mycat.log日志

1.3 查询语句1:分片字段是等值运算,分析mycat.log

  1. mysql> select * from mycatbydate where create_date='2017-11-01';
  2. +----+---------------------+----------+
  3. | id | create_date | datanode |
  4. +----+---------------------+----------+
  5. | 1 | 2017-11-01 00:00:00 | db1 |
  6. +----+---------------------+----------+
  7. 1 row in set (0.03 sec)

分析mycat.log日志

1.4 查询语句2:分片字段范围查询,分析explain和mycat.log

这里分别用 where 跟 betwwen and 的方式来测试一下范围查询

where

  1. mysql> explain select * from mycatbydate
  2. where create_date >='2017-11-01' and create_date <'2017-11-10';
  3. +-----------+-------------------------------------------------------------+
  4. | DATA_NODE | SQL |
  5. +-----------+-------------------------------------------------------------+
  6. | dn1 | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' |
  7. | | AND create_date < '2017-11-10' LIMIT 100 |
  8. | dn2 | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' |
  9. | | AND create_date < '2017-11-10' LIMIT 100 |
  10. | | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' | |
  11. | dn3 | AND create_date < '2017-11-10' LIMIT 100 |
  12. +-----------+-------------------------------------------------------------+
  13. 3 rows in set (0.00 sec)

分析mycat.log日志

between and

  1. mysql> explain select * from mycatbydate where create_date
  2. BETWEEN '2017-11-01' AND '2017-11-10';
  3. +-----------+---------------------------------------------------+
  4. | DATA_NODE | SQL |
  5. +-----------+---------------------------------------------------+
  6. | dn1 | SELECT * FROM mycatbydate WHERE create_date |
  7. | | BETWEEN '2017-11-01' AND '2017-11-10' LIMIT 100 |
  8. +-----------+---------------------------------------------------+
  9. 1 row in set (0.00 sec)

分析mycat.log日志

总结:对于范围查询,where语句是没法优化,从而路由到相应的节点上,但是between and 可以优化,这个有咨询过 lead us,答复是目前代码做不到where优化。。。

1.5 插入限制以及解决方案

插入数据,如果超过30天数据提示ERROR 1064 (HY000): Index: 6, Size: 3

  1. 由于配置3dn,每10天一个分片,从71日数据就无法插入,这种配置就存在数据超过实际分配个数,底层dn和实际数据要规划好
  2. mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-12-01',database());
  3. ERROR 1064 (HY000): Index: 6, Size: 3
  4. mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-11-10',database());
  5. Query OK, 1 row affected (0.01 sec)
  6. mysql> insert into mycatbydate(create_date,datanode) values('2017-11-20',database());
  7. Query OK, 1 row affected (0.00 sec)
  8. mysql> insert into mycatbydate(create_date,datanode) values('2017-11-30',database());
  9. Query OK, 1 row affected (0.00 sec)
  10. #查询数据分布:
  11. mysql> select * from mycatbydate order by datanode;
  12. +----+---------------------+----------+
  13. | id | create_date | datanode |
  14. +----+---------------------+----------+
  15. | 1 | 2017-11-01 00:00:00 | db1 |
  16. | 2 | 2017-11-10 00:00:00 | db1 |
  17. | 2 | 2017-11-20 00:00:00 | db2 |
  18. | 2 | 2017-11-30 00:00:00 | db3 |
  19. +----+---------------------+----------+
  20. 4 rows in set (0.08 sec)

解决方案:指定分区结束时间,这样分区可以重复使用

  1. vi rule.xml
  2. <function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate">
  3. <property name="dateFormat">yyyy-MM-dd</property> <!--日期格式-->
  4. <property name="sBeginDate">2017-06-01</property> <!--开始日期-->
  5. <property name="sEndDate">2017-06-30</property> <!--结束日期-->
  6. <property name="sPartionDay">10</property> <!--每分片天数-->
  7. </function>
  8. @@reload_config
  9. #重新加载配置文件后可以正常插入数据:
  10. mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-12-01',database());
  11. ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
  12. mysql> insert into mycatbydate(id,create_date,datanode) values(5,'2017-12-01',database());
  13. Query OK, 1 row affected (0.18 sec)
  14. mysql> insert into mycatbydate(id,create_date,datanode) values(6,'2018-01-01',database());
  15. Query OK, 1 row affected (0.03 sec)
  16. mysql> insert into mycatbydate(id,create_date,datanode) values(7,'2018-02-01',database());
  17. Query OK, 1 row affected (0.03 sec)
  18. mysql> insert into mycatbydate(id,create_date,datanode) values(8,'2018-03-01',database());
  19. Query OK, 1 row affected (0.04 sec)
  20. mysql> insert into mycatbydate(id,create_date,datanode) values(9,'2018-04-01',database());
  21. Query OK, 1 row affected (0.04 sec)
  22. mysql>
  23. mysql>
  24. mysql> select * from mycatbydate order by datanode;
  25. +----+---------------------+----------+
  26. | id | create_date | datanode |
  27. +----+---------------------+----------+
  28. | 5 | 2017-12-01 00:00:00 | db1 |
  29. | 2 | 2017-11-10 00:00:00 | db1 |
  30. | 1 | 2017-11-01 00:00:00 | db1 |
  31. | 6 | 2018-01-01 00:00:00 | db1 |
  32. | 7 | 2018-02-01 00:00:00 | db1 |
  33. | 8 | 2018-03-01 00:00:00 | db1 |
  34. | 9 | 2018-04-01 00:00:00 | db1 |
  35. | 2 | 2017-11-20 00:00:00 | db2 |
  36. | 2 | 2017-11-30 00:00:00 | db3 |
  37. +----+---------------------+----------+
  38. 9 rows in set (0.14 sec)

2 按照自然月分片

  1. 每个自然月一个分片,需要提前将分片数规划好,建好,否则有可能日期超出实际配置分片数

2.1修改配置文件

  1. #新增分配规则
  2. vi rule.xml
  3. <function name="partbymonth" class="org.opencloudb.route.function.PartitionByMonth">
  4. <property name="dateFormat">yyyy-MM-dd</property>
  5. <property name="sBeginDate">2017-11-01</property>
  6. </function>
  7. <tableRule name="sharding-by-month">
  8. <rule>
  9. <columns>create_date</columns>
  10. <algorithm>partbymonth</algorithm>
  11. </rule>
  12. </tableRule>
  13. #schema.xml增加逻辑表
  14. <table name="mycatbymonth" primaryKey="ID" dataNode="dn$1-12" rule="sharding-by-month" />
  15. <dataNode name="dn1" dataHost="192.168.124.55" database="db1" />
  16. <dataNode name="dn2" dataHost="192.168.124.55" database="db2" />
  17. <dataNode name="dn3" dataHost="192.168.124.55" database="db3" />
  18. <dataNode name="dn4" dataHost="192.168.124.55" database="db4" />
  19. <dataNode name="dn5" dataHost="192.168.124.55" database="db5" />
  20. <dataNode name="dn6" dataHost="192.168.124.55" database="db6" />
  21. <dataNode name="dn7" dataHost="192.168.124.55" database="db7" />
  22. <dataNode name="dn8" dataHost="192.168.124.55" database="db8" />
  23. <dataNode name="dn9" dataHost="192.168.124.55" database="db9" />
  24. <dataNode name="dn10" dataHost="192.168.124.55" database="db10" />
  25. <dataNode name="dn11" dataHost="192.168.124.55" database="db11" />
  26. <dataNode name="dn12" dataHost="192.168.124.55" database="db12" />

2.2 mycat重新加载配置文件

  1. mysql> reload @@config;
  2. Query OK, 1 row affected (0.10 sec)
  3. Reload config success
  4. #查看逻辑表
  5. mysql> show tables;
  6. +------------------+
  7. | Tables in TESTDB |
  8. +------------------+
  9. | customer |
  10. | customer_addr |
  11. | mycatbydate |
  12. | mycatbymonth |
  13. | orders |
  14. | order_items |
  15. | travelrecord |
  16. | t_vote |
  17. +------------------+
  18. 8 rows in set (0.00 sec)

2.3 创建表后插入数据

  1. mysql>create table mycatbymonth(id int not null auto_increment primary key, create_date datetime,datanode varchar(10));
  2. Query OK, 0 rows affected (0.20 sec)
  3. -> ;
  4. mysql> explain select * from mycatbymonth;
  5. +-----------+--------------------------------------+
  6. | DATA_NODE | SQL |
  7. +-----------+--------------------------------------+
  8. | dn1 | SELECT * FROM mycatbymonth LIMIT 100 |
  9. | dn10 | SELECT * FROM mycatbymonth LIMIT 100 |
  10. | dn11 | SELECT * FROM mycatbymonth LIMIT 100 |
  11. | dn12 | SELECT * FROM mycatbymonth LIMIT 100 |
  12. | dn2 | SELECT * FROM mycatbymonth LIMIT 100 |
  13. | dn3 | SELECT * FROM mycatbymonth LIMIT 100 |
  14. | dn4 | SELECT * FROM mycatbymonth LIMIT 100 |
  15. | dn5 | SELECT * FROM mycatbymonth LIMIT 100 |
  16. | dn6 | SELECT * FROM mycatbymonth LIMIT 100 |
  17. | dn7 | SELECT * FROM mycatbymonth LIMIT 100 |
  18. | dn8 | SELECT * FROM mycatbymonth LIMIT 100 |
  19. | dn9 | SELECT * FROM mycatbymonth LIMIT 100 |
  20. +-----------+--------------------------------------+
  21. 12 rows in set (0.01 sec)
  22. mysql> insert into mycatbymonth(id,create_date,datanode) values(1,'2017-11-24',database());
  23. Query OK, 1 row affected (0.01 sec)

查看mycat日志

2.4 批量插入,验证插入分区,不能超过一年的数据。

  1. #批量插入数据:
  2. insert into mycatbymonth(id,create_date,datanode) values(1,'2017-01-01',database());
  3. insert into mycatbymonth(id,create_date,datanode) values(2,'2017-01-24',database());
  4. insert into mycatbymonth(id,create_date,datanode) values(3,'2017-02-01',database());
  5. insert into mycatbymonth(id,create_date,datanode) values(4,'2017-03-01',database());
  6. insert into mycatbymonth(id,create_date,datanode) values(5,'2017-04-01',database());
  7. insert into mycatbymonth(id,create_date,datanode) values(6,'2017-05-01',database());
  8. insert into mycatbymonth(id,create_date,datanode) values(7,'2017-06-01',database());
  9. insert into mycatbymonth(id,create_date,datanode) values(8,'2017-07-01',database());
  10. insert into mycatbymonth(id,create_date,datanode) values(9,'2017-08-01',database());
  11. insert into mycatbymonth(id,create_date,datanode) values(12,'2017-12-01',database());
  12. #报错的插入
  13. mysql> insert into mycatbymonth(id,create_date,datanode) values(13,'2019-01-01','db1');
  14. ERROR 1064 (HY000): Can't find a valid data node for specified
  15. node index :MYCATBYMONTH -> CREATE_DATE -> 2019-01-01 -> Index : 24

2.5 查询验证,查询分区字段等值 以及范围查询同 按照日期(天)分片的方式 不赘述!

连续分片总结:

  1. 1、针对时间范围查询,采用between可以直接路由到对应分片,从而避免查询所有dn,只查询特定分片(具体原因还没有分
  2. 析),这个问题问过leaderUS,回复时,目前技术上还没法做到普通范围查询的优化。
  3. 2、插入数据存在超过分片情况,针对月分区,插入数据不能超过一年,针对天的,也存在日期超过分区问题

Mycat实战之连续分片的更多相关文章

  1. Mycat实战之离散分片

    1 枚举分片(customer表) #### 1.1 修改配置信息加载配置文件 datanode hash-int vi partition-hash-int.txt db1=0 db2=1 [roo ...

  2. MYCAT实战之分片迁移

    实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...

  3. Mycat实战之配置EP分片

    ER分片介绍 以mycat逻辑库里面自带的例子,例如客户(CUSTOMER)跟订单(orders)以及订单条目(orders_item),订单条目依 赖订单表,订单表依赖客户,这样客户与订单以及订单条 ...

  4. mycat 连续分片 -&gt; 按日期(天)分片

    1,按日期(天)分片 按日期(天)分片:从開始日期算起,依照天数来分片 比如,从2016-01-01.每10天一个分片 注意事项:须要提前将分片规划好,建好.否则有可能日期超出实际配置分片数 2,加入 ...

  5. mycat 连续分片 -&gt; 自己定义数字范围分片

    1,自己定义数字范围分片 自己定义数字范围分片,提前规划好分片字段某个范围属于哪个分片,比方说将第一个500W的数据分片在第一个节点上面.第二个500W的数据分片在第二个节点上,依次类推 2,加入配置 ...

  6. Mycat实战之新增基于hash分片的表

    1. 修改rule.xml hash分片规则 主要改两个地方: vi rule.xml 分片数量,这里改为3 对应 三个库 hash规则 默认是id列 这里为 PROVINCE 2. reload 加 ...

  7. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  8. linux中mycat的配置,分片,以及主从复制

    1.1    安装环境 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 1.2  安装步骤 Mycat有windows.linux多种版本.本教程为lin ...

  9. Mycat安装及测试分片总结

    1.安装jdk1.72.连接实际mysql数据库 用命令行工具或图形化客户端,连接mysql,创建DEMO所用三个分片数据库:(默认schema.xml中的配置需要三个库) CREATE databa ...

随机推荐

  1. 使用ettercap构建arp欺骗构建

    0.准备: 安装:ettercap apt-get install cmake libncurses5-dev libssl-dev libpcap-dev libnet1-dev git clone ...

  2. L138 Cryptocurrency Exchanges at Risk of Manipulation

    Several cryptocurrency exchanges are plagued by poor market surveillance, pervasive conflicts of int ...

  3. pg_rewind 源端时间线发生改变 同步失败

    master-standby情况下,发生如下行为: 1.master停掉后,standby做为新的master(可能存在部分事物没有同步到standby中). 2.新master运行过程中出错,进行恢 ...

  4. poscms用法总结(非定制开发,不涉及后台代码)

    这些天几个企业站仿下来,对poscms的用法多少有些了解了,在这个记录一下,好记性不如烂笔头嘛. 1.静态文件目录和模板文件目录 这两个目录分别放置css/js/image等静态文件和html模板文件 ...

  5. git pull VS git fetch&merge

    使用git fetch和git pull都可以更新远程仓库的代码到本地,但是它们之间还是有区别. git fetch  git fetch origin master git log -p maste ...

  6. Celery分布式应用

    最近有应用需要部署到不同的服务器上运行,但是有没有PBS这样的调度系统,就想起来Python的调度神器 Celery.现在针对我的实际应用做一些记录. 1. 安装 因为我并不注重结果而是把命令拿到不同 ...

  7. ROS中使用ABB Yumi IRB14000的一些资料汇总

    目前,ABB RobotStudio 已经更新到6.05.01了,可至官网下载. 使用ABB RobotStudio和ROS进行联合调试,请参考下文: http://blog.csdn.net/Zha ...

  8. C/C++ 安全编码 —— 指针与内存

    1. 仿踩内存 if (buf[len - 1] != 0x5A) { return; }

  9. [HAL]5.中断里调用HAL_Delay()进入死循环的原因

    中断里调用HAL_Delay()进入死循环的原因  摘自:http://blog.csdn.net/alwxkxk/article/details/47204677 CUBE生成的程序中, SysTi ...

  10. 排序算法总结(C#版)

    算法质量的衡量标准: 1:时间复杂度:分析关键字比较次数和记录的移动次数: 2:空间复杂度:需要的辅助内存: 3:稳定性:相同的关键字计算后,次序是否不变. 简单排序方法 .直接插入排序 直接插入排序 ...