Mycat实战之连续分片
1 按照日期(天)分片:
从开始日期算起,按照天数来分片 例如,从2017-11-01,每10天一个分片且可以指定结束日期
注意事项:需要提前将分片规划好,建好,否则有可能日期超出实际配置分片数
1.1 修改配置文件
#修改rule.xml 添加按日期分片的的分配规则
vi rule.xml
<function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property> <!--日期格式-->
<property name="sBeginDate">2017-11-01</property> <!--开始日期-->
<property name="sPartionDay">10</property> <!--每分片天数-->
</function>
<tableRule name="sharding-by-date">
<rule> <columns>create_date</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
#修改schema.xml 添加逻辑表
vi schema.xml
<table name="mycatbydate" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-date"/>
#重新加载配置文件
[root@localhost conf]# mysql -h 192.168.2.130 -P9066 -utest -ptest
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (monitor)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql>
mysql> reload @@config;
Query OK, 1 row affected (0.08 sec)
Reload config success
1.2 创建表后插入数据并分析日志
mysql> create table mycatbydate(id int not null auto_increment primary key,
create_date datetime,datanode varchar(10));
mysql> insert into mycatbydate(create_date,datanode) values('2017-06-01',database());
分析mycat.log日志
1.3 查询语句1:分片字段是等值运算,分析mycat.log
mysql> select * from mycatbydate where create_date='2017-11-01';
+----+---------------------+----------+
| id | create_date | datanode |
+----+---------------------+----------+
| 1 | 2017-11-01 00:00:00 | db1 |
+----+---------------------+----------+
1 row in set (0.03 sec)
分析mycat.log日志
1.4 查询语句2:分片字段范围查询,分析explain和mycat.log
这里分别用 where 跟 betwwen and 的方式来测试一下范围查询
where
mysql> explain select * from mycatbydate
where create_date >='2017-11-01' and create_date <'2017-11-10';
+-----------+-------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+-------------------------------------------------------------+
| dn1 | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' |
| | AND create_date < '2017-11-10' LIMIT 100 |
| dn2 | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' |
| | AND create_date < '2017-11-10' LIMIT 100 |
| | SELECT * FROM mycatbydate WHERE create_date >= '2017-11-01' | |
| dn3 | AND create_date < '2017-11-10' LIMIT 100 |
+-----------+-------------------------------------------------------------+
3 rows in set (0.00 sec)
分析mycat.log日志
between and
mysql> explain select * from mycatbydate where create_date
BETWEEN '2017-11-01' AND '2017-11-10';
+-----------+---------------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------------+
| dn1 | SELECT * FROM mycatbydate WHERE create_date |
| | BETWEEN '2017-11-01' AND '2017-11-10' LIMIT 100 |
+-----------+---------------------------------------------------+
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
由于配置3个dn,每10天一个分片,从7月1日数据就无法插入,这种配置就存在数据超过实际分配个数,底层dn和实际数据要规划好
mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-12-01',database());
ERROR 1064 (HY000): Index: 6, Size: 3
mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-11-10',database());
Query OK, 1 row affected (0.01 sec)
mysql> insert into mycatbydate(create_date,datanode) values('2017-11-20',database());
Query OK, 1 row affected (0.00 sec)
mysql> insert into mycatbydate(create_date,datanode) values('2017-11-30',database());
Query OK, 1 row affected (0.00 sec)
#查询数据分布:
mysql> select * from mycatbydate order by datanode;
+----+---------------------+----------+
| id | create_date | datanode |
+----+---------------------+----------+
| 1 | 2017-11-01 00:00:00 | db1 |
| 2 | 2017-11-10 00:00:00 | db1 |
| 2 | 2017-11-20 00:00:00 | db2 |
| 2 | 2017-11-30 00:00:00 | db3 |
+----+---------------------+----------+
4 rows in set (0.08 sec)
解决方案:指定分区结束时间,这样分区可以重复使用
vi rule.xml
<function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property> <!--日期格式-->
<property name="sBeginDate">2017-06-01</property> <!--开始日期-->
<property name="sEndDate">2017-06-30</property> <!--结束日期-->
<property name="sPartionDay">10</property> <!--每分片天数-->
</function>
@@reload_config
#重新加载配置文件后可以正常插入数据:
mysql> insert into mycatbydate(id,create_date,datanode) values(2,'2017-12-01',database());
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
mysql> insert into mycatbydate(id,create_date,datanode) values(5,'2017-12-01',database());
Query OK, 1 row affected (0.18 sec)
mysql> insert into mycatbydate(id,create_date,datanode) values(6,'2018-01-01',database());
Query OK, 1 row affected (0.03 sec)
mysql> insert into mycatbydate(id,create_date,datanode) values(7,'2018-02-01',database());
Query OK, 1 row affected (0.03 sec)
mysql> insert into mycatbydate(id,create_date,datanode) values(8,'2018-03-01',database());
Query OK, 1 row affected (0.04 sec)
mysql> insert into mycatbydate(id,create_date,datanode) values(9,'2018-04-01',database());
Query OK, 1 row affected (0.04 sec)
mysql>
mysql>
mysql> select * from mycatbydate order by datanode;
+----+---------------------+----------+
| id | create_date | datanode |
+----+---------------------+----------+
| 5 | 2017-12-01 00:00:00 | db1 |
| 2 | 2017-11-10 00:00:00 | db1 |
| 1 | 2017-11-01 00:00:00 | db1 |
| 6 | 2018-01-01 00:00:00 | db1 |
| 7 | 2018-02-01 00:00:00 | db1 |
| 8 | 2018-03-01 00:00:00 | db1 |
| 9 | 2018-04-01 00:00:00 | db1 |
| 2 | 2017-11-20 00:00:00 | db2 |
| 2 | 2017-11-30 00:00:00 | db3 |
+----+---------------------+----------+
9 rows in set (0.14 sec)
2 按照自然月分片
每个自然月一个分片,需要提前将分片数规划好,建好,否则有可能日期超出实际配置分片数
2.1修改配置文件
#新增分配规则
vi rule.xml
<function name="partbymonth" class="org.opencloudb.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2017-11-01</property>
</function>
<tableRule name="sharding-by-month">
<rule>
<columns>create_date</columns>
<algorithm>partbymonth</algorithm>
</rule>
</tableRule>
#schema.xml增加逻辑表
<table name="mycatbymonth" primaryKey="ID" dataNode="dn$1-12" rule="sharding-by-month" />
<dataNode name="dn1" dataHost="192.168.124.55" database="db1" />
<dataNode name="dn2" dataHost="192.168.124.55" database="db2" />
<dataNode name="dn3" dataHost="192.168.124.55" database="db3" />
<dataNode name="dn4" dataHost="192.168.124.55" database="db4" />
<dataNode name="dn5" dataHost="192.168.124.55" database="db5" />
<dataNode name="dn6" dataHost="192.168.124.55" database="db6" />
<dataNode name="dn7" dataHost="192.168.124.55" database="db7" />
<dataNode name="dn8" dataHost="192.168.124.55" database="db8" />
<dataNode name="dn9" dataHost="192.168.124.55" database="db9" />
<dataNode name="dn10" dataHost="192.168.124.55" database="db10" />
<dataNode name="dn11" dataHost="192.168.124.55" database="db11" />
<dataNode name="dn12" dataHost="192.168.124.55" database="db12" />
2.2 mycat重新加载配置文件
mysql> reload @@config;
Query OK, 1 row affected (0.10 sec)
Reload config success
#查看逻辑表
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| customer |
| customer_addr |
| mycatbydate |
| mycatbymonth |
| orders |
| order_items |
| travelrecord |
| t_vote |
+------------------+
8 rows in set (0.00 sec)
2.3 创建表后插入数据
mysql>create table mycatbymonth(id int not null auto_increment primary key, create_date datetime,datanode varchar(10));
Query OK, 0 rows affected (0.20 sec)
-> ;
mysql> explain select * from mycatbymonth;
+-----------+--------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------+
| dn1 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn10 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn11 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn12 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn2 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn3 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn4 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn5 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn6 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn7 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn8 | SELECT * FROM mycatbymonth LIMIT 100 |
| dn9 | SELECT * FROM mycatbymonth LIMIT 100 |
+-----------+--------------------------------------+
12 rows in set (0.01 sec)
mysql> insert into mycatbymonth(id,create_date,datanode) values(1,'2017-11-24',database());
Query OK, 1 row affected (0.01 sec)
查看mycat日志
2.4 批量插入,验证插入分区,不能超过一年的数据。
#批量插入数据:
insert into mycatbymonth(id,create_date,datanode) values(1,'2017-01-01',database());
insert into mycatbymonth(id,create_date,datanode) values(2,'2017-01-24',database());
insert into mycatbymonth(id,create_date,datanode) values(3,'2017-02-01',database());
insert into mycatbymonth(id,create_date,datanode) values(4,'2017-03-01',database());
insert into mycatbymonth(id,create_date,datanode) values(5,'2017-04-01',database());
insert into mycatbymonth(id,create_date,datanode) values(6,'2017-05-01',database());
insert into mycatbymonth(id,create_date,datanode) values(7,'2017-06-01',database());
insert into mycatbymonth(id,create_date,datanode) values(8,'2017-07-01',database());
insert into mycatbymonth(id,create_date,datanode) values(9,'2017-08-01',database());
insert into mycatbymonth(id,create_date,datanode) values(12,'2017-12-01',database());
#报错的插入
mysql> insert into mycatbymonth(id,create_date,datanode) values(13,'2019-01-01','db1');
ERROR 1064 (HY000): Can't find a valid data node for specified
node index :MYCATBYMONTH -> CREATE_DATE -> 2019-01-01 -> Index : 24
2.5 查询验证,查询分区字段等值 以及范围查询同 按照日期(天)分片的方式 不赘述!
连续分片总结:
1、针对时间范围查询,采用between可以直接路由到对应分片,从而避免查询所有dn,只查询特定分片(具体原因还没有分
析),这个问题问过leaderUS,回复时,目前技术上还没法做到普通范围查询的优化。
2、插入数据存在超过分片情况,针对月分区,插入数据不能超过一年,针对天的,也存在日期超过分区问题
Mycat实战之连续分片的更多相关文章
- Mycat实战之离散分片
1 枚举分片(customer表) #### 1.1 修改配置信息加载配置文件 datanode hash-int vi partition-hash-int.txt db1=0 db2=1 [roo ...
- MYCAT实战之分片迁移
实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...
- Mycat实战之配置EP分片
ER分片介绍 以mycat逻辑库里面自带的例子,例如客户(CUSTOMER)跟订单(orders)以及订单条目(orders_item),订单条目依 赖订单表,订单表依赖客户,这样客户与订单以及订单条 ...
- mycat 连续分片 -> 按日期(天)分片
1,按日期(天)分片 按日期(天)分片:从開始日期算起,依照天数来分片 比如,从2016-01-01.每10天一个分片 注意事项:须要提前将分片规划好,建好.否则有可能日期超出实际配置分片数 2,加入 ...
- mycat 连续分片 -> 自己定义数字范围分片
1,自己定义数字范围分片 自己定义数字范围分片,提前规划好分片字段某个范围属于哪个分片,比方说将第一个500W的数据分片在第一个节点上面.第二个500W的数据分片在第二个节点上,依次类推 2,加入配置 ...
- Mycat实战之新增基于hash分片的表
1. 修改rule.xml hash分片规则 主要改两个地方: vi rule.xml 分片数量,这里改为3 对应 三个库 hash规则 默认是id列 这里为 PROVINCE 2. reload 加 ...
- 两种实现方式mycat多租户,枚举分片,注解拦截
第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式 /*!mycat:schema=[schemaName] */ 注意:这在navicat 里面是会报错的,请用命令行登陆myc ...
- linux中mycat的配置,分片,以及主从复制
1.1 安装环境 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 1.2 安装步骤 Mycat有windows.linux多种版本.本教程为lin ...
- Mycat安装及测试分片总结
1.安装jdk1.72.连接实际mysql数据库 用命令行工具或图形化客户端,连接mysql,创建DEMO所用三个分片数据库:(默认schema.xml中的配置需要三个库) CREATE databa ...
随机推荐
- pdb 源码索引符号服务器创建过程
pdb是调试程序必不可少的东西,它保存着一个exe或dll的调试信息,对pdb进行源码索引可以快速找到软件对应该版本的代码,本文以subversion版本控制服务器进行介绍 一.需要安装的软件 win ...
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...
- MySQL Multi-Range Read
MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO ...
- python基础之函数名称空间与作用域
- mcake活动维护常见问题记录【pc端】 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
★ ★ ★ ★ ★ ★ ★ ★ ★ ★pc端问题及解决方法 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ 问题一.pc.弹窗,背景兼容ie8的写法 ;;; -moz-opacity:.7;f ...
- JSON.stringify的三个参数
前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的. 参考资料: stringify stringify方法顾名思义,就是把JSON序列换, ...
- php调用API支付接口(转自刘68)
首先访问 https://charging.teegon.com/ 注册账号, 找到开发配置 记下client_id和client_secret. 点击 天工开放平台 点击天工收银 点击 S ...
- Java IO流读写文件的几个注意点
平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不 ...
- Android 进阶10:进程通信之 Messenger 使用与解析
读完本文你将了解: Messenger 简介 Messenger 的使用 服务端 客户端 运行效果 使用小结 总结 代码地址 Thanks 前面我们介绍了 AIDL 的使用与原理,这篇文章来介绍下 A ...
- 大白话讲解如何给github上项目贡献代码
本文献给对git很迷茫的新手,注意是新手,但至少会点基本操作,有点基本概念的新手,我不会从怎么用github和git是什么开始讲的.如果作为新手你看书又看不进去,原理又太复杂,又没有直接了当告诉我们怎 ...