今天我們學習的是enum分片算法。
1.hash分區算法
2.stringhash分區算法
3.enum分區算法
4.numberrange分區算法
5.patternrange分區算法
6.date分區算法
7.jumpstringhash算法
enum分區算法的配置
<code><tablerule>
<rule>
<columns>code/<columns>
<algorithm>func_enum/<algorithm>
/<rule>
/<tablerule>
<function>
<property>partition.txt/<property>
<property>0/<property>
<property>0/<property>
/<function>/<code>
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。這裡不會因為錯誤而報錯。
枚舉在使用的時候,需要把已知的全部羅列出來。但是也有劣勢,就是可能羅列不全,在這個時候把不在枚舉定義範圍的數字存放到默認節點是一個沒有辦法的辦法,如果突然因為某個新版本上線,出現一些新的枚舉類型而沒有及時更新,會導致默認節點數據快速膨脹。此時就需要進行擴容,然後實現局部數據遷移。
閱讀更多 sandag 的文章