MyCat - 使用篇(2)

数据库路由中间件MyCat - 使用篇(2)

基本概念

3. 分片

3.1 分片节点(dataNode)

表被水平切分后,每个分片表所在的数据库就是一个分片节点。一个分片节点对应一个数据库(mysql数据库)。一个分片节点只能保存每个分片表的一个分片,因为db中不允许出现同名的表。

3.2 节点主机(dataHost)

分片节点究竟被放在那个主机上。对应mysql里的mysql实例:一台主机可以部署多个mysql实例,一个mysql实例可以有多个数据库。为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost).

分片规则

就决定分片表的记录如何分布在不同的分片节点上。分片规则有很多种,我们根据业务需要,并考虑到开发,维护以及扩容的难度,来决定用哪种分片方案。MyCat支持我们自己开发自己的分片规则,如何开发,我们后面会讲到(以下规则最好不要照搬,参考之后并按照自己的需要开发自己的分片方案):

1. 哈希取模:

这是最常见的一种分片方案,根据分片字段(一般是主键,因为按主键查找的场景偏多)的哈希值,对分片个数取模运算,根据结果决定记录到哪个分片上。 
一般分片个数最好为2的n次方,这样计算起来可以用取与运算(x%(2^n)=x&(2^n - 1)). 
好处:记录平均分布(除非id生成器故意生成取模正好只为同一个数的id),压力平均分布,数据没有倾斜 
坏处:扩容(增加分片)是个大问题,分片个数改变,基本很难迁移数据

2. 路由约定:

维护一个对应表配置文件,如下所示:

北京=0 上海=1 深圳=2 广州=2 default=312345

意思就是分片字段为北京的到分片0上,上海的到分片1上,深圳和广州的到分片2上,其他的到分片3上。 
如果某天发现北京的分片需要扩容,可以将北京的数据整体迁移到一个更大的分片上,之后重载配置。MyCat支持在线重载配置 
好处:扩容比较灵活 
坏处:数据容易有倾斜,扩容不是很灵活,而且,分片字段很难是常用查询字段(如果查询字段不是分片字段,就是全分片检索)

3.范围路由约定:

也是维护一个文件,如下所示:

0~1000w=01000w~2000w=1default=2123

就是指分片字段在0~1000w范围内的到分片0上。。。。。。 
好处:保证每个分片数据稳定,扩容也比较方便 
坏处:需要配合id生成器,否则按顺序自增会有压力集中在一个分片的问题。同时,扩容时同时要改变MyCat配置以及id生成器配置。及时做数据清理,id最好能复用,这个规则才能很好的应用。

4.哈希范围约定:

将哈希取模与范围路由结合。

0~15=0
16~31=1
32~47=2
48~63=31234

哈希取模后范围在0~15的流向分片1.。。。 
这样可以某种程度上减轻扩容的压力

5.部分字段:

有时候,我们并不想一个字段的所有内容都作为分片我们可以取某个字段的一部分作为分片依据。配合id生成器使用。

6.综合约定:

其实,我们可以结合id生成器,做一种既好扩容,又维护不复杂,又能平均分摊压力的方法。 
参考百X的某些项目,他们是项目开始就建64个库,每个库64张表。假设每张表1000w数据,那么一共能承受409.6亿的数据。。。从现在来看估计这个项目做到死也许都用不完。 
不过这给我们一个思路,我们根据项目需要估计未来n年的量,在项目一开始就分配这么多库。这些库可能在项目初期位于同一个实例上。在不够用时,我们把其中某几个库迁移到其他实例上。 
平均分摊压力在MyCat这里就需要用到哈希取模,或者我们可以让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,151234

意思就是,开头为北京的范围在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上。 
这样,在发现某个开头的分片不够用时,可以随时改变分片规则,同时不影响以前数据的访问。

时间: 2024-11-10 07:58:30

MyCat - 使用篇(2)的相关文章

MyCat - 使用篇(3)

数据库路由中间件MyCat - 使用篇(3) 全局序列号 数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence). 全局序列号有很多实现的方式,比如本地配置文件,或者拿一个分片节点保存全局序列号,但是这么做都有单点故障的问题,从架构上看不推荐这么做. 全局序列号还是推荐用独立的id生成器服务去实现最佳! 安装准备 环境 Red Hat Enterprise Linux Serv

MyCat - 使用篇(4)

数据库路由中间件MyCat - 使用篇(4) 配置MyCat 3. 配置conf/rule.xml 1.4.1中的规则配置比较笨,1.5中优化了一些,将tableRule标签和function标签合并了,并且支持Velocity模板语言,更加灵活.这里先介绍1.4.1的: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd">

MyCat - 使用篇(5)

数据库路由中间件MyCat - 使用篇(5) 配置MyCat 4. 配置schema.xml schema.xml里面管理着MyCat的逻辑库.表,每张表使用的分片规则.分布在哪个DataNode以及DataSource上. 之前的例子:  <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:s

MyCat - 背景篇(2)

数据库路由中间件MyCat - 背景篇(2) MyCat的前世今生 如前文所说,Amoeba.Cobar.MyCat等属于同宗一脉.若Amoeba能继续下去,Cobar就不会出来:若Cobar那批人不是都走光了的话,MyCAT也不会再另起炉灶.Cobar之后,有很多类似中间件仿照其架构以及思路,针对特定的业务场景,设计出了不同的中间件.MyCat算是其中业务场景比较全面,使用配置比较简便,性能优秀,而且功能算是稳定的.同类的中间件,都是针对特定场景或者功能进行设计,像某科技的hot某中间件,性能

MyCat - 使用篇(1)

数据库路由中间件MyCat - 使用篇(1) 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单状态,客户可以随时查看运单状态的任务.一票快递可能有多个子母件. 因此,我们需要建立如下表:  我们现在按照业务将数据库垂直拆分成运单(3000tps,4000W数据),快递员(1500tps,100W数据),客户(1500tps,4000W数据记录),运单表和客户表均按照某种规则分片,平均分成两片.然后假设他们都通过MyCat统一管理.  1

MyCat - 源代码篇(14)

数据库路由中间件MyCat - 源代码篇(14) 5. 路由模块 真正取得RouteResultset的步骤:AbstractRouteStrategy的route方法: Created with Rapha?l 2.1.0Start处理一些路由之前的逻辑,返回真假?return nullsql拦截器拦截(就是用户自定义拦截一些语句并改写)是否需要checkSQLschema去掉schema name设置autocommit?是否是DDL语句rrs = DDL语句路由return rrssche

MyCat - 使用篇

Mycat水平拆分之十种分片规则: http://www.cnblogs.com/756623607-zhang/p/6656022.html 数据库路由中间件MyCat - 使用篇(5) 配置MyCat 4. 配置schema.xml schema.xml里面管理着MyCat的逻辑库.表,每张表使用的分片规则.分布在哪个DataNode以及DataSource上. 之前的例子:  <?xml version="1.0" encoding="UTF-8"?&g

MyCat - 源代码篇(11)

数据库路由中间件MyCat - 源代码篇(11) 4.配置模块 每个MyCatServer初始化时,会初始化: MyCatServer.java: public static final String NAME = "MyCat"; private static final long LOG_WATCH_DELAY = 60000L; private static final long TIME_UPDATE_PERIOD = 20L; private static final Myc

MyCat - 源代码篇(12)

数据库路由中间件MyCat - 源代码篇(12) 4.配置模块 4.2 schema.xml 接上一篇,接下来载入每个schema的配置(也就是每个MyCat中虚拟化的数据库的配置): XMLSchemaLoader.java private void loadSchemas(Element root) { NodeList list = root.getElementsByTagName("schema"); for (int i = 0, n = list.getLength();