欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mycat常用的分片规格

程序员文章站 2024-02-19 11:31:58
...

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

分片规则定义在 /mycat/cong/partition-hash-int.txt 文件中,内容如下

# 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 节。