共计 2216 个字符,预计需要花费 6 分钟才能阅读完成。
文章来源:爱可生云数据库作者:余朝飞
DBLE 项目介绍
DBLE 官方网站:https://opensource.actionsky.com 可以详细了解 DBLE 的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础 DBLE 官方项目:https://github.com/actiontech… 如对源码有兴趣或者需要定制的功能的可以通过源码编译 DBLE 下载地址:https://github.com/actiontech… 建议下载最新的 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 算法。将表的详细拆分规则写在配置中,这是一种很 ” 傻 ” 的方式,但是这也是万不得已的一种选择,如果不通过配置文件的方式告诉中间件这些信息,那么中间件就无从得知底层具体的数据分布情况,也就达不到我们最终想要分库分表的目的了。