前言
最近挺焦慮的,不知道未來該做什么,方向又是什么。只能用別慌,月亮也正在大海的某處迷茫。
來安慰下自己。不過學習的初心咱們還是不要忘記。今天我們學習的是enum分片算法。
1.hash分區算法
2.stringhash分區算法
3.enum分區算法
4.numberrange分區算法
5.patternrange分區算法
6.date分區算法
7.jumpstringhash算法
enum分區算法的配置
<tableRule name="rule_enum">
<rule>
<columns>code</columns>
<algorithm>func_enum</algorithm>
</rule>
</tableRule>
<function name="enum" class="enum">
<property name="mapFile">partition.txt</property>
<property name="defaultNode">0</property>
<property name="type">0</property>
</function>
enum和之前的hash算法一樣。需要在rule.xml中配置tableRule和function。
- tableRule標簽,name對應的是規則的名字,而rule標簽中的columns則對應的分片字段,這個字段必須和表中的字段一致。algorithm則代表了執行分片函數的名字。
- function標簽,name代表分片算法的名字,算法的名字要和上面的tableRule中的
標簽相對應。class:指定分片算法實現類。property指定了對應分片算法的參數。不同的算法參數不同。 - mapFile:指定配置文件名。其格式將在下面做詳細說明。
- defaultNode:指定默認節點號。默認值為-1,不指定默認節點。
- type:指定配置文件中key的類型。0:整型; 其它:字符串。
mapfile文件格式配置如下:
a.type=0,
int1=node0
int2=node1
a.type=其他
string1=node0
string2=node1
1.啟動加載配置
當啟動的時候,會先根據type的值判斷是字符串還是數字。然后把mapfile中配置的值加載到內存中,形成一個映射表。
例如上面的配置中type=0,就可以判斷是數字,然后查看mapFile對應的文件partition.txt,可以查到:
10000=0
10010=1
也就是枚舉值10000,就存放在分片1上,而枚舉值10010,就存放在分片2上。
2.運行過程
當在運行的過程中,如果有用戶通過查詢code=10000或者是code=10001的時候,就會訪問這個枚舉算法。根據上面的映射表直接查詢得到分片的編號。
3.我們建表來測試一下。
通過創建test_enum表,我們插入三條數據,分別是code=10000,10010,10020,可以看到10000被存放在分片1上,10010被存放在分片2上。這個和我們在partition.txt中配置的文件一樣。當我們插入10020的時候,因為枚舉值不存在,它會選擇默認的分片節點dn1。這里不會因為錯誤而報錯。
枚舉在使用的時候,需要把已知的全部羅列出來。但是也有劣勢,就是可能羅列不全,在這個時候把不在枚舉定義范圍的數字存放到默認節點是一個沒有辦法的辦法,如果突然因為某個新版本上線,出現一些新的枚舉類型而沒有及時更新,會導致默認節點數據快速膨脹。此時就需要進行擴容,然后實現局部數據遷移。
注意事項
- mapfile文件不包含“=”的行將被跳過.
- 重復的枚舉值的分區數據節點以最后一個配置為准。
- 分片字段為該枚舉類型。
- 分片字段為NULL時,數據落在defaultNode節點上,若此時defaultNode沒有配置,則會報錯;當真實存在於mysql的字段值為not null的時候,報錯 "Sharding column can't be null when the table in MySQL column is not null"
后記
今天介紹的枚舉算法較為簡單。后續將繼續帶來剩下幾種算法,謝謝支持!