mycat分片規則
阿新 • • 發佈:2017-11-01
ext 擴容 難題 begin att func 跨庫 -a 方法 配置:schema文件rule字段,rule文件name字段
(1)分片枚舉:sharding-by-intfile
(2)主鍵範圍:auto-sharding-long
(3)一致性hash:sharding-by-murmur
(4)字符串hash解析:sharding-by-stringhash
(5)按日期(天)分片:sharding-by-date
(6)按單月小時拆分:sharding-by-hour
(6)自然月分片:sharding-by-month
--------常見的10種分片方法--------
1、枚舉法
<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<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)。此種分片規則理解為枚舉分區,會比較適合於取值固定的場合,比如說性別(0,1),省份(固定值)。
優點:
用逗號分隔可以把多個值放在一個分區裏面。
缺點:
其他非枚舉情況不適合。
枚舉分區:sharding-by-intfile
2、範圍約定
<tableRule name="auto-sharding-long">
<rule>
<columns>user_id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
理解:
切分規則根據文件(autopartition-long.txt)。一種範圍切分的方式,制定基準列的取值範圍,然後把這一範圍的所有數據都放到一個DN上面。
優點:
適用於整體數量可知或總數量為固定值的情況。
缺點:
dn劃分節點是事先建好的,需要擴展時比較麻煩。
潛在的問題,如果在短時間發生海量的順序插入操作,而每一個DN(分庫)設定的數量比較高(比如說一個DN設定的放1000W條數據),那麽在這個時候,會出現某一個DN(分庫)IO壓力非常高,而其他幾個DN(分庫)完全沒有IO操作,就會出現類似於DB中常見的熱塊/熱盤的現象。
3、求模法
<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
理解:
切分規則根據配置中輸入的數值n。此種分片規則將數據分成n份(通常dn節點也為n),從而將數據均勻的分布於各節點上。
優點:
這種策略可以很好的分散數據庫寫的壓力。比較適合於單點查詢的情景。
缺點:
一旦出現了範圍查詢,就需要MyCAT去合並結果,當數據量偏高的時候,這種跨庫查詢+合並結果消耗的時間有可能會增加很多,尤其是還出現了order by的時候。
4、固定分片hash算法
<tableRule name="rule1">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.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兩個數組的長度必須是一致的。
優點:
這種策略比較靈活,可以均勻分配也可以非均勻分配,各節點的分配比例和容量大小由count,length兩個參數決定。
缺點:
跟求模法類似。
5、日期列分區法
<tableRule name="sharding-by-date">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<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>
理解:
切分規則根據配置中輸入的各項值。配置中配置了格式,開始日期,分區天數,即默認從開始日期算起,分隔10天一個分區。
6、通配取模
<tableRule name="sharding-by-pattern">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-pattern</algorithm>
</rule>
</tableRule>
<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>
理解:
切分規則根據配置中輸入的數值以及文件(partition-pattern.txt)。patternValue 即求模基數,defaoultNode 默認節點,如果不配置了默認,則默認是0即第一個結點。配置文件中,1-32 即代表id%256後分布的範圍,如果在1-32則在分區1,其他類推,如果id非數字數據,則會分配在defaoultNode 默認節點配置文件中,1-32 即代表id%256後分布的範圍,如果在1-32則在分區1,其他類推,如果id非數字數據,則會分配在defaoultNode 默認節點。
優點:
這種策略可以很好的分散數據庫寫的壓力。比較適合於單點查詢的情景。
缺點:
一旦出現了範圍查詢,就需要MyCAT去合並結果,當數據量偏高的時候,這種跨庫查詢+合並結果消耗的時間有可能會增加很多,尤其是還出現了order by的時候。
7、ASCII求模通配
<tableRule name="sharding-by-prefixpattern">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-prefixpattern</algorithm>
</rule>
</tableRule>
<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPrefixPattern">
<property name="patternValue">256</property>
<property name="prefixLength">5</property>
<property name="mapFile">partition-pattern.txt</property>
</function>
理解:
切分規則根據配置中輸入的數值及文件(partition-pattern.txt)。patternValue 即求模基數,prefixLength ASCII 截取的位數。此種方式類似方式6通配取模只不過采取的是將列種獲取前prefixLength位列所有ASCII碼的和進行求模sum%patternValue ,獲取的值,在通配範圍內的也就是分片數。
8、編程指定
<tableRule name="sharding-by-substring">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-substring</algorithm>
</rule>
</tableRule>
<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>
理解:
此方法為直接根據字符子串(必須是數字)計算分區號(由應用傳遞參數,顯式指定分區號)。
例如id=05-100000002在此配置中代表根據id中從startIndex=0,開始,截取siz=2位數字即05,05就是獲取的分區,如果沒傳默認分配到defaultPartition。
9、字符串拆分hash解析
<tableRule name="sharding-by-stringhash">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-stringhash</algorithm>
</rule>
</tableRule>
<function name="sharding-by-substring" 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分區數,hashSlice hash預算位
即根據子字符串 hash運算。
10、一致性hash
<tableRule name="sharding-by-murmur">
<rule>
<columns>user_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<function name="murmur" class="io.mycat.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>
優點:
一致性hash預算有效解決了分布式數據的擴容問題,前1-9中id規則都多少存在數據擴容難題,而10規則解決了數據擴容難點
上述整理的分片規則,部分驗證、詳細的理解以及優缺點信息還未補全,希望能與大家共同學習探討填補空缺。
mycat分片規則