數據庫中間件分片算法之enum

前言

最近挺焦慮的,不知道將來該作什麼,方向又是什麼。只能用別慌,月亮也正在大海的某處迷茫。來安慰下本身。不過學習的初心我們仍是不要忘記。今天咱們學習的是enum分片算法。node

1.hash分區算法
2.stringhash分區算法
3.enum分區算法
4.numberrange分區算法
5.patternrange分區算法
6.date分區算法
7.jumpstringhash算法mysql

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=node1sql

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。這裏不會由於錯誤而報錯。
枚舉在使用的時候,須要把已知的所有羅列出來。可是也有劣勢,就是可能羅列不全,在這個時候把不在枚舉定義範圍的數字存放到默認節點是一個沒有辦法的辦法,若是忽然由於某個新版本上線,出現一些新的枚舉類型而沒有及時更新,會致使默認節點數據快速膨脹。此時就須要進行擴容,而後實現局部數據遷移。code

注意事項

  1. mapfile文件不包含「=」的行將被跳過.
  2. 重複的枚舉值的分區數據節點以最後一個配置爲準。
  3. 分片字段爲該枚舉類型。
  4. 分片字段爲NULL時,數據落在defaultNode節點上,若此時defaultNode沒有配置,則會報錯;當真實存在於mysql的字段值爲not null的時候,報錯 "Sharding column can't be null when the table in MySQL column is not null"

後記

今天介紹的枚舉算法較爲簡單。後續將繼續帶來剩下幾種算法,謝謝支持!xml

相關文章
相關標籤/搜索