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 默認節點。