文章来源:爱可生云数据库
作者:余朝飞
DBLE项目介绍
DBLE官方网站:https://opensource.actionsky.com
可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础
DBLE官方项目:https://github.com/actiontech/dble
如对源码有兴趣或者需要定制的功能的可以通过源码编译
DBLE下载地址:https://github.com/actiontech/dble/releases
建议下载最新的releases版本,下载tar压缩包即可,如有源码编译需求的,可以下载源码包
DBLE的主要配置文件
上一篇"DBLE Schema.xml 配置解析"详细介绍了DBLE之中关于Scema.xml的配置,本篇文章将继续为大家讲解一下DBLE中Rule.xml文件的配置。
DBLE的配置文件都在conf目录里面,常用的几个配置文件如下:
文件 | 说明 |
---|---|
server.xml | DBLE server相关参数定义,包括dble性能,定时任务,端口,用户配置等;本文主要涉及到访问用户的配置 |
schema.xml | DBLE具体分片定义,规定table和schema以及dataNode之间的关系,指定每个表格使用哪种类型的分片方法,定义每个dataNode的连接信息等 |
rule.xml | DBLE实际用到的分片算法的配置 |
rule.xml配置解析
其中rule.xml是日常配置分片算法的时候最常用到的配置文件,我们通过思维导图的方式给大家整理了DBLE的rule.xml的配置,需要注意的是思维导图不能代替看文档,导图只能起着概括归纳的作用,详细的细节还请参考官方文档。
rule.xml举例
从分片的数据在各个数据节点分布来看,分片可分为连续分片和离散分片,连续分片就是将一定范围内的数据全部分布在某一DataNode, 离散分布则是通过hash取模等方法将数据打散较为均匀地分布在各个DataNode。
分片 | 连续分片 | 离散分片 |
---|---|---|
优点 | 并发访问能力有限,扩容迁移代价小 | 并发访问能力增强 范围条件查询性能提升 |
缺点 | 存在数据热点的可能性,并发访问能力受限于单一或少量DataNode | 数据扩容比较困难,需要对整体数据做重新分布。 |
举例 | date,numberrange | hash, stringhash, patternrange |
注:hash,patternrange分片方式如果配置
分片区间
足够宽的话也是可以当做连续分片的。
以下我以PatternRange算法为例,讲解一下如何配置该拆分算法,比如当前有一张表tasK_log
已经有1000万的数据,这张表又因为需要和其他表进行关联查询,单表太大进行关联时异常缓慢,因此我们需要对这张表做拆分, 将这张表分别放在三个分片上,dn1,dn2,dn3。
- schema.xml中的配置如下
<table name="tasK_log" dataNode="dn1,dn2,dn3" rule="three_node_range" />
- rule.xml中配置如下:
<?xml version="1.0"?>
<!DOCTYPE dble:rule SYSTEM "rule.dtd">
<dble:rule xmlns:dble="http://dble.cloud/">
<tableRule name="three_node_range">
<rule>
<columns>id</columns>
<algorithm>three_node_range</algorithm>
</rule>
</tableRule>
<function name="three_node_range" class="PatternRange">
<property name="mapFile">partition.txt</property>
<property name="patternValue">1024</property>
<property name="defaultNode">0</property>
</function>
</dble:rule>
- mapfile partition.txt定义如下:
[root@localhost ~]# cat partition.txt
0-255=0
256-511=1
512-1024=2
查找路由时,将id字段与patternValue取模,即计算M = id % patternValue,
- 如果M在0-255之间,在数据落在dn1分片。
- 如果M在256-511之间,在数据落在dn2分片。
- 如果M在512-1024之间,则数据落在dn3分片。
- 如果都匹配不上,则落在默认节点defaultNode dn1分片(理论上在这个例子中是不可能匹配不上的)
关于每一种拆分算法的详细介绍请参加官方文档介绍。
总结
rule.xml定义实际用到的拆分算法以及该拆分算法对应到的逻辑库使用使用算法,熟悉各种拆分算法的详细配置及其适用场景,才方便我们在众多数据拆分场景选择并配置合适的拆分规则,同时这也是适用分库分表中间件的第一步,并且实地演示了一个小小的拆分例子,使用到了patternrange算法。
将表的详细拆分规则写在配置中,这是一种很"傻"的方式,但是这也是万不得已的一种选择,如果不通过配置文件的方式告诉中间件这些信息,那么中间件就无从得知底层具体的数据分布情况,也就达不到我们最终想要分库分表的目的了。