mycat分片方案

1. 連續分片

  優點:擴容無需遷移數據,範圍條件查詢資源消耗小。

  缺點:數據熱點問題,併發能力受限於分片節點。

  應用案例:按日期(天)分片;自定義數字範圍分片;自然月分片。

--自定義數字範圍分片:

  提前規劃好分片字段某個範圍屬於哪個分片。

  rule.xml的配置如下:

    <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
        <property name="defaultNode">0</property>
    </function>

  defaultNode:超過範圍後的默認節點。

  此配置非常簡單,即預先制定可能的id範圍到某個分片。

  autopartition-long.txt配置如下:

注意: 所有的節點配置都是從0開始,及0代表節點1。

 

第0-10000000個數據分到節點1,第10000001-20000000條數據分到節點2。

--按天分片:

從開始日期算起,按照天數來分片。

<function name=“sharding-by-date” class=“io.mycat.route.function.PartitionByDate"> 
<property name=“dateFormat”>yyyy-MM-dd</property> <!—日期格式--> 
<property name=“sBeginDate”>2014-01-01</property> <!—開始日期--> 
<property name=“sPartionDay”>10</property> <!—每分片天數--> 
</function>

--按自然月分片: 

從開始日期算起,按照自然月來分片。

<function name=“sharding-by-month” class=“io.mycat.route.function.PartitionByMonth">
 <property name=“dateFormat”>yyyy-MM-dd</property> <!—日期格式-->
 <property name=“sBeginDate”>2014-01-01</property> <!—開始日期--> 
</function>

  注意: 需要提前將分片規劃好,建好,否則有可能日期超出實際配置分片數。

--按單月小時分片:

最小粒度是小時,可以一天最多24個分片,最少1個分片,一個月完後下月從頭開始循環。

<function name="sharding-by-hour" class=“io.mycat.route.function.LatestMonthPartion"> 
<property name=“splitOneDay”>24</property> <!-- 將一天的數據拆解成幾個分片--> 
</function>

  注意:每個月月尾,需要手工清理數據。

2. 離散分片

  優點:數據分佈均勻,併發能力強,不受限分片節點。

  缺點:移植性差,擴容難。

  應用案例:枚舉分片;數字取模分片; 字符串hash分片; 一致性哈希分片;程序指定。

--枚舉分片:

通過在配置文件中配置可能的枚舉id,自己配置分片,本規則適用於特定的場景,比如有些業務需要按照省份或區縣來做保存,而全國省份區縣固定的。

<function name="hash-int" class=“io.mycat.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 配置:

mapFile 標識配置文件名稱

type 默認值爲0(0表示Integer,非零表示String)

defaultNode:枚舉分片時,如果碰到不識別的枚舉值,就讓它路由到默認節點。

--數字取模分片:

規則爲對分片字段十進制取模運算。數據分佈最均勻。

<function name="mod-long" class=“io.mycat.route.function.PartitionByMod"> 
<property name="count">3</property><!-- how many data nodes --> 
</function>

-- 字符串hash分片:

此規則是截取字符串中的int數值hash分片。

<function name="sharding-by-stringhash" class=“io.mycat.route.function.PartitionByString"> 
  <property name=length>512</property><!-- zero-based -->
  <property name="count">2</property> 
  <property name="hashSlice">0:2</property> 
</function>

  length 代表字符串hash求模基數,count分區數,其中length*count=1024

  hashSlice hash預算位,即根據子字符串中int值hash運算,0 代表 str.length(),-1 代表 str.length()-1,大於0只代表數字自身。

  可以理解爲substring(start,end),start爲0則只表示0。

  例1:值“45abc”,hash預算位0:2 ,取其中45進行計算

  例2:值“aaaabbb2345”,hash預算位-4:0 ,取其中2345進行計算

--一致性哈希分片:

此規則優點在於擴容時遷移數據量比較少,前提分片節點比較多,虛擬節點分配多些。

  虛擬節點少的缺點是會造成數據分佈不夠均勻;如果實際分片數量比較少,遷移量會比較多。

<function name="murmur" class=“io.mycat.route.function.PartitionByMurmurHash"> 
  <property name=“seed”>0</property><!-- 創建hash對象的種子,默認0-->
  <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片-->
  <property name="virtualBucketTimes">160</property> 
</ function>

  注意:

  一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍。

 

--應用指定分片:

規則爲對分片字段進行字符串截取,獲取的字符串即指定分片。

<function name="sharding-by-substring“ class="io.mycat.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>

  startIndex 開始截取的位置

  size 截取的長度

  partitionCount 分片數量

  defaultPartition 默認分片

  例如:id=05-100000002,在此配置中代表根據 id 中從 startIndex=0,開始,截取 siz=2 位數字即 05,05 就是獲取的分區,如果沒傳默認分配到 defaultPartition。

3. 綜合類分片

  兼併連續分片和離散分片。

  應用案例:範圍求模分片;取模範圍約束分片。

--範圍求模分片:

先進行範圍分片計算出分片組,組內再求模。

  優點是可以避免擴容時的數據遷移,又可以一定程度上避免範圍分片的熱點問題;分片組內使用求模可以保證組內數據比較均勻,分片組之間是範圍分片可以兼顧範圍查詢。

  最好事先規劃好分片的數量,數據擴容時按分片組擴容,則原有分片組的數據不需要遷移。由於分片組內數據比較均勻,所以分片組內可以避免熱點數據問題。 

<function name="rang-mod" class=“io.mycat.route.function.PartitionByRangeMod">
 <property name="mapFile">partition-range-mod.txt</property>
 <property name="defaultNode">32</property> 
</function>

partition-range-mod.txt

以下配置一個範圍代表一個分片組,=號後面的數字代表該分片組所擁有的分片的數量。

--取模範圍約束分片:

對指定分片列進行取模後再由配置決定數據的節點分佈。 

<function name="sharding-by-pattern" class=“io.mycat.route.function.PartitionByPattern">
 <property name="patternValue">256</property>
 <property name="defaultNode">2</property>
 <property name="mapFile">partition-pattern.txt</property>
</function>

patternValue 即求模基數,

defaoultNode 默認節點

partition-pattern.txt配置

1-32=0 
33-64=1 
65-96=2 
97-128=3 
128-256=4

配置文件中,1-32 即代表id%256後分布的範圍;如果id非數字,則會分配在defaoultNode 默認節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章