mycat水平切分(分庫分表)規則配置rule.xml

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屬性是取分片字段的前幾個字符來運算

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