mycat常用的分片规格
问:MYCAT如何处理高效处理E-R表(一对一,一对多)
答:MyCAT其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此解决了JION的效率和性能问题,子表的记录与所关联的父表记录存放在同一个数据分片上。
假如用户和订单两张表:user(id,name) 和 orders(id,user_id)。
在schema.xml进行配置:
<table name="user" dataNode="dn1,dn2" rule="mod-long">
<childTable name="orders" joinKey="user_id" parentKey="id"/>
</table>
这段配置将orders的user_id和tab_user的id关联起来,在对orders表进行插入操作时,将会判断插入数据的user_id处于哪一个分片,然后将数据插入该分片,这样便实现了将关联数据存放在一个分片的目的。当然,如果关联了更多的表,就继续在childTable下面配置childTable.问:MYCAT如何处理多对多关系的表
答:有一种业务是“主表A+关系表+主表B”,比如说:商户+订单+会员。
会员要查询购买的订单,商户要查询售出的订单,那么要做如何的切分。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即是“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储。
问:什么时候采取主键分片和非主键分片
答:当你没人任何字段可以作为分片字段的时候,主键分片就是唯一选择,其优点是按照主键的查询最快,当采
用自动增长的***作为主键时,还能比较均匀的将数据分片在不同的节点上。
若有某个合适的业务字段比较合适作为分片字段,则建议采用此业务字段分片,选择分片字段的条件如下:
1:尽可能的比较均匀分布数据到各个节点上;
2:该业务字段是最频繁的或者最重要的查询条件。
常见的除了主键之外的其他可能分片字段有“订单创建时间”、“店铺类别”或“所在省”等。
详解mycat的常见分片规则:
一:取模运算 mod-long
<tableRule name="mod-long">
<rule>
<columns>id</columns> <!-- 对应表中的字段 -->
<algorithm>mod-long</algorithm> <!--对应的函数名 -->
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- 3表示配置了三个mysql数据库节点 -->
<property name="count">3</property>
</function>
--此种配置根据 id 进行十进制求模预算,将id的值除去配置的count值,根据余数来决定数据插入那个数据库分片
二:分片枚举 hash-int
<tableRule name="sharding-by-intfile">
<rule>
<columns>province</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><!-- 对应的配置文件,在mycat/conf下 -->
<property name="type">1</property><!-- 0 代表配置的字段是Integer类型, 1 代表配置的字段是String类型 -->
<property name="defaultNode">0</property><!--默认数据库节点 -->
</function>
分片规则定义在 /mycat/cong/partition-hash-int.txt 文件中,内容如下
上海=0
安徽=1
当你插入数据中的省份字段=“上海”时会插入dn1数据库节点,=“安徽”会插入dn2数据库节点。
适合的应用场景:需要按照省份或区县来做保存,因为全国省份区县固定的。
三:范围约定 rang-long
<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><!-- 对应的配置文件,在mycat/conf下 -->
<property name="defaultNode">0</property>
</function>
columns 标识将要分片的表字段,algorithm 分片函数,rang-long 函数中 mapFile 代表配置文件路径defaultNode 超过范围后的默认节点。
所有的节点配置都是从 0 开始,及 0 代表节点 dn1
# range start-end ,data node index
M=100.
0-500M=0
500M-1000M=1
1000M-1500M=2
此配置非常简单,即预先制定可能的 id 范围到某个分片,当id值范围在0-500M之间就插入dn1数据库节点。
四:按日期分片
<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 则代表数据达到了这个日期的分片后后循环从开始分片插入。
五:固定分片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
即 2*256+1*512=1024。
以上配置将数据水平分成 3 份,前两份各占 25%,第三份占 50%,
如果想要平均分配,则配置如下 4*256=1024
<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">4</property>
<property name="partitionLength">256</property>
</function>
六:指定分区
<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
想了解更多可以去 http://www.mycat.io/document/Mycat_V1.6.0.pdf 查看 入门篇 -第十章-9.1 节。
下一篇: java通过文件头来判断文件类型