数据库路由中间件MyCat - 使用篇(2)
此文已由作者张镐薪授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
基本概念
3. 分片
3.1 分片节点(dataNode)
表被水平切分后,每个分片表所在的数据库就是一个分片节点。一个分片节点对应一个数据库(mysql数据库)。一个分片节点只能保存每个分片表的一个分片,因为db中不允许出现同名的表。 例如:
<dataNode name="test1" dataHost="test" database="db1" />
这就表示,名字为test1这个分片节点,对应test节点主机(MySQL实例)主机上的db1数据库
3.2 节点主机(dataHost)
分片节点究竟被放在那个主机上。对应mysql里的mysql实例:一台主机可以部署多个mysql实例,一个mysql实例可以有多个数据库。为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost). 例如:
<dataHost name="test" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select 1 from dual</heartbeat>
<writeHost host="master" url="10.202.4.181:3306" user="root"
password="sf123456">
<readHost host="slave" url="10.202.4.181:3307" user="root" password="sf123456"/>
</writeHost></dataHost>
这个会在之后的配置文件说明中细讲。
分片规则
就决定分片表的记录如何分布在不同的分片节点上。分片规则有很多种,我们根据业务需要,并考虑到开发,维护以及扩容的难度,来决定用哪种分片方案。 分片规则一般还涉及到全局id生成,这个之后会讲。 MyCat支持我们自己开发自己的分片规则,如何开发,我们后面会讲到(以下规则最好不要照搬,参考之后并按照自己的需要开发自己的分片方案):
1. 哈希取模:
这是最常见的一种分片方案,根据分片字段(一般是主键,因为按主键查找的场景偏多)的哈希值,对分片个数取模运算,根据结果决定记录到哪个分片上。 一般分片个数最好为2的n次方,这样计算起来可以用取与运算(x%(2^n)=x&(2^n - 1)). 好处:记录平均分布(除非id生成器故意生成取模正好只为同一个数的id),压力平均分布,数据没有倾斜 坏处:扩容(增加分片)是个大问题,分片个数改变,基本很难迁移数据 配置举例: rule.xml:
<tableRule name="mod-long-rule1">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule></tableRule><function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property></function>
可以看出,用java反射机制加载org.opencloudb.route.function.PartitionByMod这个类,在这个org.opencloudb.route.function的所有类都为分片算法,如何实现,将会在之后的rule.xml配置说明中提到。这个算法接收一个参数,其实就是分片个数。之后在tableRule标签中,规定是哪一列(字段)为分片字段,对应哪一算法。 在这里,就是用user_id对3取模之后的值作为该记录分布在哪一个分片节点上。
2. 路由约定:
rule.xml:
<tableRule name="file-map-rule1">
<rule>
<columns>address</columns>
<algorithm>file-map</algorithm>
</rule></tableRule><function name="file-map" class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-file-map.txt</property>
<property name="type">1</property>
<property name="defaultNode">0</property></function>
type为零则字段类型为整型,为1则为字符串类型。维护一个对应表配置文件partition-file-map.txt,如下所示: partition-file-map.txt:
北京=0 上海=1 深圳=2 广州=2 default=3
意思就是分片字段为北京的到分片0上,上海的到分片1上,深圳和广州的到分片2上,其他的到分片3上。 如果某天发现北京的分片需要扩容,可以将北京的数据整体迁移到一个更大的分片上,之后重载配置。MyCat支持在线重载配置 好处:扩容比较灵活 坏处:数据容易有倾斜,扩容不是很灵活,而且,分片字段很难是常用查询字段(如果查询字段不是分片字段,就是全分片检索)
3.范围路由约定:
也是维护一个文件,如下所示:
<tableRule name="auto-sharding-long">
<rule>
<columns>user_id</columns>
<algorithm>rang-long</algorithm>
</rule></tableRule><function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">0</property></function>
autopartition-long.txt
0~1000k=01000k~2000k=1default=2
就是指分片字段在0~1000k范围内的到分片0上。。。。。。 好处:保证每个分片数据稳定,扩容也比较方便 坏处:需要配合id生成器,否则按顺序自增会有压力集中在一个分片的问题。同时,扩容时同时要改变MyCat配置以及id生成器配置。及时做数据清理,id最好能复用,这个规则才能很好的应用。
4.哈希范围约定:
将哈希取模与范围路由结合。
<tableRule name="sharding-by-pattern">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-pattern</algorithm>
</rule></tableRule><function name="sharding-by-pattern"class="org.opencloudb.route.function.PartitionByPattern">
<property name="patternValue">64</property>
<property name="defaultNode">2</property>
<property name="mapFile">partition-pattern.txt</property></function>
0~15=0
16~31=1
32~47=2
48~63=3
哈希取模后范围在0~15的流向分片1.。。。 这样可以某种程度上减轻扩容的压力。
5.部分字段:
有时候,我们并不想一个字段的所有内容都作为分片我们可以取某个字段的一部分作为分片依据。配合id生成器使用。
6.综合约定(原创,非内置):
其实,我们可以结合id生成器,做一种既好扩容,又维护不复杂,又能平均分摊压力的方法。 参考百X的某些项目,他们是项目开始就建64个库,每个库64张表。假设每张表1000w数据,那么一共能承受409.6亿的数据。。。从现在来看估计这个项目做到死也许都用不完。 不过这给我们一个思路,我们根据项目需要估计未来n年的量,在项目一开始就分配这么多库。这些库可能在项目初期位于同一个实例上。在不够用时,我们把其中某几个库迁移到其他实例上。 我们可以让id生成器去做平均分布的事情。 比如下面这个id: 01-01-XXXASD1239091234 我们用第一个-之前的数字直接作为分片id,我们为了考虑到以后的业务增长,一开始就分配了64个库。id生成器先开始只会随机平均生成00~03开头的,之后业务增长到某个程度时,再按照需求多少在某个范围生成。
7.多重规则-可扩容哈希路由(原创,非内置)
是从分片字段中抽取一段做分片路由,再取另一段做自动哈希分片。同时再规定某个范围内是某个分片规则,另一范围是另一个分片规则。 id示例: 北京-A0000001 配置文件:
北京(A0000000~A9999999)=0,1,2,3,4
北京(B0000000)=5,6,7,8,9
上海(00000000~10000000)=10,11
上海=10,11,12,13,14,15
意思就是,开头为北京的范围在A0000000~A9999999的根据后面的哈希值对5取模平均分布在0,1,2,3,4分片节点上。开头为北京的范围在B0000000以上的根据后面的哈希值对5取模平均分布在5,6,7,8,9分片节点上。开头为上海的范围在00000000~10000000的根据后面的哈希值对2取模平均分布在10,11分片节点上,剩下的开头为上海的,对6取模平均分布在10,11,12,13,14,15上。 这样,在发现某个开头的分片不够用时,可以随时改变分片规则,同时不影响以前数据的访问。
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 客户端SDK测试思路
【推荐】 安装APK时SO库的选择策略
数据库路由中间件MyCat - 使用篇(2)的更多相关文章
- 数据库路由中间件MyCat - 背景篇(2)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MyCat的前世今生 如前文所说,Amoeba.Cobar.MyCat等属于同宗一脉.若Amoeba能继续下 ...
- 数据库路由中间件MyCat - 使用篇(1)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单 ...
- 数据库路由中间件MyCat - 源代码篇(13)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 4.配置模块 4.2 schema.xml 接上一篇,接下来载入每个schema的配置(也就是每个MyCat ...
- 数据库路由中间件MyCat - 使用篇(3)上篇
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 全局序列号 数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯 ...
- 数据库路由中间件MyCat - 源代码篇(7)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.4 FrontendConnection前端连接 构造方法: public Fronte ...
- 数据库路由中间件MyCat - 源代码篇(15)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. public static void handle(String stmt, ServerConnectio ...
- 数据库路由中间件MyCat - 源代码篇(14)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 对于表的dataNode对应关系,有个特殊配置即类似dataNode="distributed(d ...
- 数据库路由中间件MyCat - 源代码篇(1)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 进入了源代码篇,我们先从整体入手,之后拿一个简单流程前端连接建立与认证作为例子,理清代码思路和设计模式.然后 ...
- 数据库路由中间件MyCat - 使用篇(4)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 配置MyCat 3. 配置conf/rule.xml 1.5GA版本中的规则配置比较笨,2.0中优化了一些, ...
- 数据库路由中间件MyCat - 使用篇(3)下篇
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2. 配置conf/server.xml server.xml几乎保存了所有mycat需要的系统配置信息.其 ...
随机推荐
- split_brain
脑裂 系统中两个或多个部分开始独立工作
- ceph pool 管理
创建池 [root@node1 ~]# ceph osd pool create monitor pool 'monitor' created 查看池 [root@node1 ~]# ceph osd ...
- 【转载】基于注解的SpringMVC简单介绍
SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请 ...
- mysql 创建用户与授权
权限管理 我们都知道,最高权限管理者是 root 用户 , 它拥有着最高的权限操作,包括 : select(查询) ,update(修改) , delete(删除,有事没事都不要用这个,反正也不能给这 ...
- Android Weekly Notes Issue #275
Android Weekly Issue #275 September 17, 2017 Android Weekly Issue #275 本期内容包括给Google Map实现一个Marker A ...
- 在ubuntu怎样修改默认的编码格式
ubuntu修改系统默认编码的方法是: 1. 参考 /usr/share/i18n/SUPPORTED 编辑/var/lib/locales/supported.d/* gedit /var/lib/ ...
- MyBatis映射文件中用#和$传递参数的特点
在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...
- Zabbix监控华为交换机
一. 监控交换机首先要在交换机开通snmp协议. 有两种方式开通,web界面,及交换机的配置界面 Web界面开通: 交换机配置界面 有web界面的,使用web界面相对简单,本项目就是用web界面 ...
- java中interface 的特性
有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值的定义的集合.从本质上讲,接 ...
- forEach、for in 和for of的区别
forEach 不能使用break return 结束并退出循环 for in 和 for of 可以使用break return: for in遍历的是数组的索引(即键名),而for of遍历的是 ...