Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?( 三 )


(4)字符串hash解析:sharding-by-stringhash
(5)按日期(天)分片:sharding-by-date
(6)按单月小时拆分:sharding-by-hour
(7)自然月分片:sharding-by-month
在开始之前 。我们要创建下面的表来模拟几个sharding的场景,表名根据需求可以改变 。
create table shard_test(ID int primary key, name varchar(20),shard_date date);
主键范围分片
主键范围分片是参考了主键值 。按照主键值的分布来分布数据库在不同的库中 。我们先在对应的sharding节点上创建同样的表结构 。
关于sharding的策略 。需要修改rule.xml文件 。
常用的sharding策略已经在Mycat里面实现了 。如果要自行实现也可以定制 。比如下面的规则 。是基于主键字段ID来做sharding,分布的算法是rang-long,引用了function rang-long,这个function是在对应的一个Java类中实现的 。
<tableRule name=\"auto-sharding-long\">
<rule>
<columns>ID</columns>
<algorithm>rang-long</algorithm>
</rule>
<function name=\"rang-long\"
class=\"io.mycat.route.function.AutoPartitionByLong\">
<property name=\"mapFile\">autopartition-long.txt</property>
当然主键的范围是不固定的 。可以根据需求来定制 。比如按照一百万为单位 。或者1000位单位 。文件是 autopartition-long.txt 文件的内容默认如下 。模板里是分为了3个分片 。如果要定制更多的就需要继续配置了 。目前来看这个配置只能够承载15亿的数据量 。可以根据需求继续扩展定制 。
# range start-end ,data node index
【Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?】# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
插入一些数据来验证一下 。我们可以查看执行计划来做基本的验证 。配置无误 。数据就根据规则流向了指定的数据库下的表里 。
mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+
还有一个查看sharding效果的小方法 。比如我插入一个极大的值 。保证和其他数据不在一个分片上 。我们运行查询语句两次 。结果会有点变化 。
sharing的效果
mysql> select * from shard_auto;
+---------+------+------------+
| ID | name | shard_date |
+---------+------+------------+
| 1 | aa | 2017-09-06 |
| 2 | bb | 2017-09-06 |
| 5000001 | aa | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.00 sec)
稍作停顿 。继续运行 。
mysql> select * from shard_auto;
+---------+------+------------+
| ID | name | shard_date |
+---------+------+------------+
| 5000001 | aa | 2017-09-06 |
| 1 | aa | 2017-09-06 |
| 2 | bb | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.01 sec)
Hash分片
Hash分片其实企业级应用尤其广泛 。我觉得一个原因是通过这种数据路由的方式 。得到的数据情况是基本可控的 。和业务的关联起来比较直接 。很多拆分方法都是根据mod方法来平均分布数据 。
sharding的策略在rule.xml里面配置 。还是默认的mod-long规则 。引用了算法mod-long,这里是根据sharding的节点数来做的 。默认是3个 。
<tableRule name=\"mod-long\">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name=\"mod-long\" class=\"io.mycat.route.function.PartitionByMod\">
<!-- how many data nodes -->
<property name=\"count\">3</property>
</function>
比如查看两次insert的结果情况 。
mysql> explain insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode22 | insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date) |
+-----------+------------------------------------------------+
mysql> explain insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode23 | insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date) |

推荐阅读