rule.xml的tableRule標籤配置表的分片規則
<tableRule name="hash-mode-5_id">
<rule>
<columns>id</columns>
<algorithm>hash-mode-5</algorithm>
</rule>
</tableRule>
name指定分片規則名字,唯一性;
columns指定用於分片的mysql實體表的字段,
algorithm指定使用的分片算法,取自標籤定義的函數,函數的實現是編寫在java代碼中的
rule.xml的function標籤配置表的分片算法
<function name="hash-mod-5" class="io.mycat.route.function.PartitionByHashMod" >
<property name="count">5</property>
</function>
定義了hash-mod-5使用io.mycat.route.function.PartitionByHashMod"這個java類來實現分片算法 ,count是其參數
常用分片算法以及rule.xml中的配置
1.簡單取模-PartitionByMod
適用於根據整數字段進行分片,取模的值對應分片庫的序號,比如某條記錄的id=100, mod 3 = 1,那這條記錄就在分片db2(分片節點的序號從0開始)上
簡單取模算法簡單,存儲均勻,但是伸縮不方便
<tableRule name="users">
<rule>
<columns>users_Fid</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
2.哈希取模-PartitionByHashMod
針對非整數字段,通過哈希算法得到一個整數值,然後再進行取模分片
通過哈希取模,因爲哈希得到的整數值是隨機的,所以數據更具分散性,但是多條記錄的分片字段的值相同的時候它們哈希取模的值也相同,會被儲存到同一分片,比如有100條訂單記錄,其中98條是用戶A的,其他分別是B、C的,如果根據用戶名字段進行哈希取模分片,那麼A的98條記錄都會集中在同一分片中,只有其它2條在別的分片中,造成數據存儲不均勻
<tableRule name="users">
<rule>
<columns>users_Fname</columns>
<algorithm>hash-mod</algorithm>
</rule>
</tableRule>
<function name="hash-mod" class="io.mycat.route.function.PartitionByHashMod">
<property name="count">3</property>
</function>
3.枚舉分片-PartitionByFileMap
人爲指定分片字段值對應哪個分片節點,比如:根據所在城市字段Fcity_id進行分片,直接通過mapFile配置城市id和db一一對應,所在城市的記錄就存在對應的db中
<tableRule name="users">
<rule>
<columns>users_Fcity_id</columns>
<algorithm>map-city</algorithm>
</rule>
</tableRule>
<function name="map-city" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-map-city.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
partition-map-city.txt這個mapFile文件放在/usr/local/mycat/conf/目錄下,
type屬性指定枚舉值類型:0表示整型,非0表示字符串型
defaultNode屬性配置是否使用默認的節點:<0不使用,>=0使用(具體的節點值在mapFile中定義)
4.字符串範圍取模分片-PartitionByPrefixPattern
根據指定字符串的前N個字符確定分片,比如根據訂單號的前3個字符來分片存儲
訂單號前3位是ABC,進行模運算:mod(ASCII(A)+ASCII(B)+ASCII©,128)=70
邏輯順序:
首先,計算ABC的ascii碼值之和=65+66+67=198;
然後,根據一個自定義的基數取模,198%128=70
最後,將取模的值匹配mapFile中設置(0-63=0 64-127=1)的對應的分片DB2
<tableRule name="bill">
<rule>
<columns>Fbid</columns>
<algorithm>prefixpattern-mod</algorithm>
</rule>
</tableRule>
<function name="prefixpattern-mod" class="io.mycat.route.function.PartitionByPrefixPattern">
<property name="patternValue">128</property>
<property name="prefixLength">3</property>
<property name="mapFile">prefix-partition-pattern.bill.txt</property>
</function>
patternValue屬性是取模基數
prefixLength屬性是取分片字段的前幾個字符來運算