分片规则概述

在数据切分处理中,特别是水平切分中,中间件最终要的两个处理过程就是数据的切分、数据的聚合。选择合适的切分规则,至关重要,因为它决定了后续数据聚合的难易程度,甚至可以避免跨库的数据聚合处理。
前面讲了数据切分中重要的几条原则,其中有几条是数据冗余,表分组(Table Group),这都是业务上规避跨库join的很好的方式,但不是所有的业务场景都适合这样的规则,因此本章将讲述如何选择合适的切分规则。

Mycat全局表

如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。
目前Mycat没有做全局表的数据一致性检查,后续版本1.4之后可能会提供全局表一致性检查,检查每个分片的数据一致性。
全局表的配置如下

<table name="t_area" primaryKey="id" type="global" dataNode="dn1,dn2" />

ER分片表

有一类业务,例如订单(order)跟订单明细(order_detail),明细表会依赖于订单,也就是说会存在表的主从关系,这类似业务的切分可以抽象出合适的切分规则,比如根据用户ID切分,其他相关的表都依赖于用户ID,再或者根据订单ID切分,总之部分业务总会可以抽象出父子关系的表。这类表适用于ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,避免数据Join跨库操作。
以order与order_detail例子为例,schema.xml中定义如下的分片配置,order,order_detail 根据order_id进行数据切分,保证相同order_id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取order所在的分片,然后将order_detail也插入到order所在的分片。

<table name="order" dataNode="dn$1-32" rule="mod-long"> <childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id" /> </table>

多对多关联

有一类业务场景是 “主表A+关系表+主表B”,举例来说就是商户会员+订单+商户,对应这类业务,如何切分?
从会员的角度,如果需要查询会员购买的订单,那按照会员进行切分即可,但是如果要查询商户当天售出的订单,那又需要按照商户做切分,可是如果既要按照会员又要按照商户切分,几乎是无法实现,这类业务如何选择切分规则非常难。目前还暂时无法很好支持这种模式下的3个表之间的关联。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储,未来Mycat版本中将考虑将中间表进行双向复制,以实现从A-关系表 以及B-关系表的双向关联查询如下图所示:

1 主键分片vs 非主键分片
当你没人任何字段可以作为分片字段的时候,主键分片就是唯一选择,其优点是按照主键的查询最快,当采用自动增长的序列号作为主键时,还能比较均匀的将数据分片在不同的节点上。
若有某个合适的业务字段比较合适作为分片字段,则建议采用此业务字段分片,选择分片字段的条件如下:

  • 尽可能的比较均匀分布数据到各个节点上;
  • 该业务字段是最频繁的或者最重要的查询条件。

常见的除了主键之外的其他可能分片字段有“订单创建时间”、“店铺类别”或“所在省”等。当你找到某个合适的业务字段作为分片字段以后,不必纠结于“牺牲了按主键查询记录的性能”,因为在这种情况下,MyCAT提供了“主键到分片”的内存缓存机制,热点数据按照主键查询,丝毫不损失性能。

<table name="t_user" primaryKey="user_id" dataNode="dn$1-32" rule="mod-long"> <childTable name="t_user_detail" primaryKey="id" joinKey="user_id" parentKey="user_id" /> </table>

对于非主键分片的table,填写属性primaryKey,此时MyCAT会将你根据主键查询的SQL语句的第一次执行结果进行分析,确定该Table 的某个主键在什么分片上,并进行主键到分片ID的缓存。第二次或后续查询mycat会优先从缓存中查询是否有id–>node 即主键到分片的映射,如果有直接查询,通过此种方法提高了非主键分片的查询性能。
本节主要讲了如何去分片,如何选择合适分片的规则,总之尽量规避跨库Join是一条最重要的原则,下一节将介绍Mycat目前已有的分片规则,每种规则都有特定的场景,分析每种规则去选择合适的应用到项目中。

Mycat常用的分片规则

1 分片枚举
通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下:

<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property><property name="type">0</property> <property name="defaultNode">0</property></function> partition-hash-int.txt 配置:10000=0
10010=1 DEFAULT_NODE=1

上面columns 标识将要分片的表字段,algorithm 分片函数, 其中分片函数配置中,mapFile标识配置文件名称,type默认值为0,0表示Integer,非零表示String, 所有的节点配置都是从0开始,及0代表节点1

defaultNode 默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点 * 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点 * 如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到 * 不识别的枚举值就会报错, * like this:can’t find datanode for sharding column:column_name val:ffffffff 

2 固定分片hash算法
本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取id的二进制低10位,即id二进制&1111111111。 此算法的优点在于如果按照10进制取模运算,在连续插入1-10时候1-10会被分到1-10个分片,增大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。

<tableRule name="rule1">
<rule> <columns>user_id</columns><algorithm>func1</algorithm> </rule> </tableRule> <function name="func1" class="org.opencloudb.route.function.PartitionByLong"><property name="partitionCount">2,1</property><property name="partitionLength">256,512</property> </function>

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数, partitionCount 分片个数列表,partitionLength 分片范围列表 分区长度:默认为最大2^n=1024 ,即最大支持1024分区 约束 : count,length两个数组的长度必须是一致的。
1024 = sum((count[i]*length[i])). count和length两个向量的点积恒等于1024
用法例子: 本例的分区策略:希望将数据水平分成3份,前两份各占25%,第三份占50%。(故本例非均匀分区)
// |<———————1024———————————>|
// |<—-256—>|<—-256—>|<———-512————->|
// | partition0 | partition1 | partition2 |
// | 共2份,故count[0]=2 | 共1份,故count[1]=1 | int[] count = new int[] { 2, 1 }; int[] length = new int[] { 256, 512 }; PartitionUtil pu = new PartitionUtil(count, length);
// 下面代码演示分别以offerId字段或memberId字段根据上述分区策略拆分的分配结果

  int DEFAULT_STR_HEAD_LEN = 8; // cobar默认会配置为此值 long offerId = 12345; String memberId = "qiushuo"; // 若根据offerId分配,partNo1将等于0,即按照上述分区策略,offerId为12345时将会被分配到partition0中 int partNo1 = pu.partition(offerId); // 若根据memberId分配,partNo2将等于2,即按照上述分区策略,memberId为qiushuo时将会被分到partition2中 int partNo2 = pu.partition(memberId, 0, DEFAULT_STR_HEAD_LEN);

如果需要平均分配设置:平均分为4分片,partitionCount*partitionLength=1024

<function name="func1" class="org.opencloudb.route.function.PartitionByLong"> <property name="partitionCount">4</property> <property name="partitionLength">256</property> </function>

3 范围约定
此分片适用于,提前规划好分片字段某个范围属于哪个分片,
start <= range <= end.
range start-end ,data node index
K=1000,M=10000.

<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>

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数, rang-long 函数中mapFile代表配置文件路径 defaultNode 超过范围后的默认节点。 所有的节点配置都是从0开始,及0代表节点1,此配置非常简单,即预先制定可能的id范围到某个分片
0-500M=0
500M-1000M=1
1000M-1500M=2

0-10000000=0
10000001-20000000=1
4 取模
此规则为对分片字段求摸运算。

<tableRule name="mod-long">
<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>

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数, 此种配置非常明确即根据id进行十进制求模预算,相比固定分片hash,此种在批量插入时可能存在批量插入单事务插入多数据分片,增大事务一致性难度。

5 按日期(天)分片

此规则为按天分片

<tableRule name="sharding-by-date">
<rule> <columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule> </tableRule>
<function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sEndDate">2014-01-02</property>
<property name="sPartionDay">10</property> </function>

配置说明:
columns :标识将要分片的表字段
algorithm :分片函数
dateFormat :日期格式
sBeginDate :开始日期
sEndDate:结束日期
sPartionDay :分区天数,即默认从开始日期算起,分隔10天一个分区
如果配置了 sEndDate 则代表数据达到了这个日期的分片后后循环从开始分片插入。
Assert.assertEquals(true, 0 == partition.calculate(“2014-01-01”)); Assert.assertEquals(true, 0 == partition.calculate(“2014-01-10”)); Assert.assertEquals(true, 1 == partition.calculate(“2014-01-11”)); Assert.assertEquals(true, 12 == partition.calculate(“2014-05-01”));

6 取模范围约束

此种规则是取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点分布。

<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">256</property>
<property name="defaultNode">2</property>
<property name="mapFile">partition-pattern.txt</property> </function> 

partition-pattern.txt

 # id partition range start-end ,data node index###### first host configuration 1-32=0 33-64=1
65-96=2
97-128=3
######## second host configuration
129-160=4
161-192=5
193-224=6
225-256=7
0-0=7

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数,patternValue 即求模基数,defaoultNode 默认节点,如果配置了默认,则不会按照求模运算
mapFile 配置文件路径 :
配置文件中,1-32 即代表id%256后分布的范围,如果在1-32则在分区1,其他类推,如果id非数据,则会分配在defaoultNode 默认节点

String idVal = “0”;
Assert.assertEquals(true, 7 == autoPartition.calculate(idVal)); idVal = “45a”;Assert.assertEquals(true, 2 == autoPartition.calculate(idVal));

7 截取数字做hash求模范围约束
此种规则类似于取模范围约束,此规则支持数据符号字母取模。

 <tableRule name="sharding-by-prefixpattern"> <rule> <columns>user_id</columns> <algorithm>sharding-by-prefixpattern</algorithm> </rule> </tableRule> <function name="sharding-by-pattern" class="org.opencloudb.route.function.PartitionByPrefixPattern"> <property name="patternValue">256</property> <property name="prefixLength">5</property> <property name="mapFile">partition-pattern.txt</property> </function>

partition-pattern.txt

# range start-end ,data node index
# ASCII
# 8-57=0-9阿拉伯数字
# 64、65-90=@、A-Z
# 97-122=a-z
###### first host configuration
1-4=0 5-8=1 9-12=2 13-16=3
###### second host configuration
17-20=4 21-24=5 25-28=6 29-32=7 0-0=7

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数,patternValue 即求模基数,prefixLength ASCII 截取的位数
mapFile 配置文件路径 配置文件中,1-32 即代表id%256后分布的范围,如果在1-32则在分区1,其他类推
此种方式类似方式6只不过采取的是将列种获取前prefixLength位列所有ASCII码的和进行求模sum%patternValue ,获取的值,在范围内的分片数,

String idVal=“gf89f9a”; Assert.assertEquals(true, 0==autoPartition.calculate(idVal));
idVal=“8df99a”; Assert.assertEquals(true, 4==autoPartition.calculate(idVal));
idVal=“8dhdf99a”; Assert.assertEquals(true, 3==autoPartition.calculate(idVal));

8 应用指定
此规则是在运行阶段有应用自主决定路由到那个分片。

<tableRule name="sharding-by-substring"> <rule> <columns>user_id</columns> <algorithm>sharding-by-substring</algorithm> </rule> </tableRule> <function name="sharding-by-substring" class="org.opencloudb.route.function.PartitionDirectBySubString"> <property name="startIndex">0</property><!-- zero-based -->
<property name="size">2</property> <property name="partitionCount">8</property> <property name="defaultPartition">0</property> </function>

配置说明:
上面columns 标识将要分片的表字段,algorithm 分片函数 此方法为直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。
例如id=05-100000002 在此配置中代表根据id中从startIndex=0,开始,截取siz=2位数字即05,05就是获取的分区,如果没传默认分配到defaultPartition
9 截取数字hash解析
此规则是截取字符串中的int数值hash分片。

<tableRule name="sharding-by-stringhash"> <rule> <columns>user_id</columns> <algorithm>sharding-by-stringhash</algorithm> </rule> </tableRule> <function name="sharding-by-stringhash" class="org.opencloudb.route.function.PartitionByString"> <property name="partitionLength">512</property><!-- zero-based --> <property name="partitionCount">2</property> <property name="hashSlice">0:2</property> </function>

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数 函数中partitionLength代表字符串hash求模基数,
partitionCount分区数,
hashSlice hash预算位,即根据子字符串中int值 hash运算
hashSlice : 0 means str.length(), -1 means str.length()-1

/* “2” -> (0,2) * “1:2” -> (1,2) * “1:” -> (1,0) * “-1:” -> (-1,0) * “:-1” -> (0,-1)
125
* “:” -> (0,0) */

例子:

String idVal=null; rule.setPartitionLength("512"); rule.setPartitionCount("2"); rule.init(); rule.setHashSlice("0:2"); // idVal = "0"; // Assert.assertEquals(true, 0 == rule.calculate(idVal)); // idVal = "45a"; // Assert.assertEquals(true, 1 == rule.calculate(idVal)); //last 4 rule = new PartitionByString(); rule.setPartitionLength("512"); rule.setPartitionCount("2"); rule.init(); //last 4 characters rule.setHashSlice("-4:0"); idVal = "aaaabbb0000"; Assert.assertEquals(true, 0 == rule.calculate(idVal)); idVal = "aaaabbb2359"; Assert.assertEquals(true, 0 == rule.calculate(idVal));

10 一致性hash
一致性hash预算有效解决了分布式数据的扩容问题。

<tableRule name="sharding-by-murmur">
<rule> <columns>user_id</columns> <algorithm>murmur</algorithm> </rule> </tableRule> <function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0-->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片-->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍--> <!--
<property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 --> <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 --> </function>

11 按单月小时拆分
此规则是单月内按照小时拆分,最小粒度是小时,可以一天最多24个分片,最少1个分片,一个月完后下月从头开始循环。 每个月月尾,需要手工清理数据。

<tableRule name="sharding-by-hour">
<rule> <columns>create_time</columns>
<algorithm>sharding-by-hour</algorithm>
</rule> </tableRule>
<function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion"> <property name="splitOneDay">24</property> </function>

配置说明:
columns: 拆分字段,字符串类型(yyyymmddHH) splitOneDay : 一天切分的分片数 LatestMonthPartion partion = new

LatestMonthPartion(); partion.setSplitOneDay(24); Integer val = partion.calculate("2015020100"); assertTrue(val == 0); val = partion.calculate("2015020216"); assertTrue(val == 40); val = partion.calculate("2015022823"); assertTrue(val == 27 * 24 + 23); Integer[] span = partion.calculateRange("2015020100", "2015022823"); assertTrue(span.length == 27 * 24 + 23 + 1); assertTrue(span[0] == 0 && span[span.length - 1] == 27 * 24 + 23); span = partion.calculateRange("2015020100", "2015020123");
assertTrue(span.length == 24); assertTrue(span[0] == 0 && span[span.length - 1] == 23);

12 范围求模分片
先进行范围分片计算出分片组,组内再求模 优点可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题 综合了范围分片和求模分片的优点,分片组内使用求模可以保证组内数据比较均匀,分片组之间是范围分片可以兼顾范围查询。 最好事先规划好分片的数量,数据扩容时按分片组扩容,则原有分片组的数据不需要迁移。由于分片组内数据比较均匀,所以分片组内可以避免热点数据问题。

<tableRule name="auto-sharding-rang-mod">
<rule> <columns>id</columns>
<algorithm>rang-mod</algorithm>
</rule> </tableRule>
<function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txt</property> <property name="defaultNode">21</property> </function>

配置说明: 上面columns 标识将要分片的表字段,algorithm 分片函数, rang-mod函数中mapFile代表配置文件路径 defaultNode 超过范围后的默认节点顺序号,节点从0开始。 partition-range-mod.txt range start-end ,data node group size 以下配置一个范围代表一个分片组,=号后面的数字代表该分片组所拥有的分片的数量。 0-200M=5 //代表有5个分片节点 200M1-400M=1 400M1-600M=4 600M1-800M=4 800M1-1000M=6
13 日期范围hash分片
思想与范围求模一致,当由于日期在取模会有数据集中问题,所以改成hash方法。
先根据日期分组,再根据时间hash使得短期内数据分布的更均匀
优点可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题
要求日期格式尽量精确些,不然达不到局部均匀的目的

 <tableRule name="rangeDateHash">
<algorithm>range-date-hash</algorithm>
</rule> </tableRule>
<function name="range-date-hash" class="org.opencloudb.route.function.PartitionByRangeDateHash">
<property name="sBeginDate">2014-01-01 00:00:00</property>
<property name="sPartionDay">3</property> <property name="dateFormat">yyyy-MM-dd HH:mm:ss</property><property name="groupPartionSize">6</property></function>

sPartionDay代表多少天分一个分片
groupPartionSize代表分片组的大小
14 冷热数据分片
根据日期查询日志数据 冷热数据分布 ,最近n个月的到实时交易库查询,超过n个月的按照m天分片。

<tableRule name="sharding-by-date">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-hotdate</algorithm>
</rule>
</tableRule>
<function name="sharding-by-hotdate" class="org.opencloudb.route.function.PartitionByHotDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sLastDay">10</property>
<property name="sPartionDay">30</property>
</function>

15 自然月分片
按月份列分区 ,每个自然月一个分片,格式 between操作解析的范例。

<tableRule name="sharding-by-month"> <rule> <columns>create_time</columns> <algorithm>sharding-by-month</algorithm> </rule> </tableRule> <function name="sharding-by-month" class="org.opencloudb.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2014-01-01</property> </function>

配置说明:
columns: 分片字段,字符串类型
dateFormat : 日期字符串格式
sBeginDate : 开始日期

PartitionByMonth partition = new PartitionByMonth(); partition.setDateFormat("yyyy-MM-dd"); partition.setsBeginDate("2014-01-01"); partition.init(); Assert.assertEquals(true, 0 == partition.calculate("2014-01-01")); Assert.assertEquals(true, 0 == partition.calculate("2014-01-10")); Assert.assertEquals(true, 0 == partition.calculate("2014-01-31")); Assert.assertEquals(true, 1 == partition.calculate("2014-02-01")); Assert.assertEquals(true, 1 == partition.calculate("2014-02-28")); Assert.assertEquals(true, 2 == partition.calculate("2014-03-1")); Assert.assertEquals(true, 11 == partition.calculate("2014-12-31")); Assert.assertEquals(true, 12 == partition.calculate("2015-01-31")); Assert.assertEquals(true, 23 == partition.calculate("2015-12-31"));

权限控制

1 远程连接配置(读、写权限)
目前Mycat对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。

<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">order</property>
<property name="readOnly">true</property> </user>
<user name="mycat2">
<property name="password">mycat</property>
<property name="schemas">order</property>
</user>

配置说明: 配置中name是应用连接中间件逻辑库的用户名。 mycat 中password是应用连接中间件逻辑库的密码。 order 中是应用当前连接的逻辑库中所对应的逻辑表。schemas中可以配置一个或多个。 true 中readOnly是应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。

多租户支持

单租户就是传统的给每个租户独立部署一套web + db 。由于租户越来越多,整个web部分的机器和运维成本都非常高,因此需要改进到所有租户共享一套web的模式(db部分暂不改变)。
基于此需求,我们对单租户的程序做了简单的改造实现web多租户共享。具体改造如下: 1.web部分修改: a.在用户登录时,在线程变量(ThreadLocal)中记录租户的id b.修改jdbc的实现:在提交sql时,从ThreadLocal中获取租户id, 添加sql 注释,把租户的schema 放到注释中。例如:/!mycat : schema = test_01 / sql ;
2.在db前面建立proxy层,代理所有web过来的数据库请求。proxy层是用mycat实现的,web提交的sql过来时在注释中指定schema, proxy层根据指定的schema转发sql请求。
3.Mycat配置:

<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">order</property>
<property name="readOnly">true</property> </user>
<user name="mycat2">
<property name="password">mycat</property>
<property name="schemas">order</property>
</user>

Mycat 分片规则---不以规矩,不能成方圆相关推荐

  1. mycat分片规则详解+实例演示

    mycat分片规则 1.环境准备 : 2.分片规则 2.1 取模分片 2.2 范围分片 2.3 枚举分片 2.4 范围求模算法 2.5 固定分片hash算法 2.6 取模范围算法 2.7 字符串has ...

  2. MySQL运维篇之Mycat分片规则

    3.5.3.Mycat分片规则 3.5.3.1.范围分片 根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片. 示例: 可以通过修改autopartition-long.tx ...

  3. MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语

    1 MyCat分片规则 数据切分中重要的几条原则,其中有几条数据冗余,表分组(Table Group). 1.1全局表 如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或数据量 ...

  4. Mycat分片规则详解

    1.分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <tab ...

  5. mycat 分片规则

    传统的分片策略都是基于单表,或者分片基于主键进行分配,或者某些场景下需要多个表依赖于一个分片,或者分片的字段并不是主键. a.  对于传统的数据库分片方式都是基于单个表格,对于表关联这种操作,则很难处 ...

  6. 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则

    目录 一.范围分片 1. 介绍 2. 配置 schema.xml逻辑表配置: schema.xml数据节点配置: rule.xml分片规则配置: 二.取模分片 1. 介绍 2. 配置 schema.x ...

  7. Mycat(三)——几种分片规则 分库 一致性hash的原理及使用

    文章目录 Mycat分片规则 取模 分库 schema.xml 分片枚举 schema.xml 测试 问题: 固定hash分片 优点 范围约定分片 按日期分区 按天分 一致性HASH 解决什么问题? ...

  8. MyCAT常用分片规则之分片枚举

    MyCAT支持多种分片规则,下面测试的这种是分片枚举.适用场景,列值的个数是固定的,譬如省份,月份等. 在这里,需定义三个值,规则均是在rule.xml中定义. 1. tableRule 2. fun ...

  9. mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

    一.前言 本文将基于主从复制,读写分离的环境基础上进行一个简单的分片(分库分表)配置 二.Mycat分片配置 mycat分片主要在scheam.xml,rule.xml这2个表中配置 ① scheam ...

最新文章

  1. 不用数学也能讲清贝叶斯理论的马尔可夫链蒙特卡洛方法?这篇文章做到了
  2. JavaScript实用的一些技巧
  3. 如何使用scrapy的item来封装数据
  4. linux find 排除某目录或文件 执行
  5. 编译调试 .NET Core 5.0 Preview 并分析 Span 的实现原理
  6. Android音频处理 PCM格式
  7. ubuntu 18.04使用aqt安装QT5.12
  8. IOS-40-测试环境与正式环境的代码通过标示符来区分
  9. 数字电路技术可能出现的简答题_数字电子技术基础期末考试题
  10. PE 022 Names score
  11. 如何将long类型的时间变量转变为标准时间
  12. idea如何全局搜索关键字_IntelliJ 的搜索和全局搜索怎么用
  13. [4G+5G专题-144]: 测试-频谱分析仪工作原理与测试结果分析
  14. 武汉坚守第六十三天——七九已满疫未退,印度大法上棍棒
  15. 用python制作飞机大战_Python制作AI且mini版飞机大战
  16. 华为云服务器 网站 要备案吗6,云服务器网站需要备案吗
  17. (考研湖科大教书匠计算机网络)第一章概述-第二节:三种交换方式(电路交换、报文交换和分组交换)
  18. java 游戏 弓箭手 法师 战士_酷酷爱魔兽战士弓箭手法师阵容搭配及职业特点介绍...
  19. 浅显易懂的Java入门(一)【基本程序设计】
  20. 深入浅出 TCP/IP 协议栈

热门文章

  1. GhostNet代码解析
  2. 台式计算机BIOS怎么查,怎么查看bios版本|查询电脑主板bios版本的方法
  3. 立象Argox条码打印机CP-2140M开发
  4. ER 和 数据库关系模式
  5. 不要想在任何事上都占上风
  6. 计算视觉与机器学习类资讯~
  7. 识别户口本易语言代码
  8. [附源码]java毕业设计图书管理系统论文
  9. CIU软考联盟:软件设计师上午试题解析-操作系统篇
  10. 快速矩阵乘法的研究——中