資料庫中介軟體分片演算法之enum
前言
最近挺焦慮的,不知道未來該做什麼,方向又是什麼。只能用別慌,月亮也正在大海的某處迷茫。
來安慰下自己。不過學習的初心咱們還是不要忘記。今天我們學習的是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中的
- 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"
後記
今天介紹的列舉演算法較為簡單。後續將繼續帶來剩下幾種演算法,謝謝支援