分佈式 | MyCat如何遷移到DBLE之分片算法對比解析:patternrange分片

原創做者: 鍾悅算法


關於做者架構

鍾 悅  -  資深DBLE用戶運維

某宇宙行資深架構師,在大型重點項目中使用 DBLE。spa

常年與 MySQL 糾纏不清,常常運用技術處理大企業病的技術or非技術問題的一個挨踢從業者。code

 

與 hash 算法的最終效果同樣,這個算法也是先求模獲得邏輯分片號,再根據邏輯分片號直接映射到物理分片的一種散列算法。xml

1. 用戶須要在 rule.xml 中給出 patternValue 來定義邏輯分片數量中間件

2. 在 DBLE 的啓動階段,讀取用戶在 rule.xml 中給出的 mapFile,獲得邏輯分片到物理分片的映射表blog

3. 在 DBLE 的運行過程當中,用戶訪問使用這個算法的表時,WHERE 子句中的分片索引值會被提取出來進行求模,獲得邏輯分片號排序

4. 再根據邏輯分片號,查映射表,直接獲得物理分片號索引

 

與MyCat的相似分片算法對比

中間件 DBLE MyCat
分片算法種類 patternrange 分區算法 取模範圍約束

兩種中間件的取模範圍分片算法使用上無差異

 

開發注意點

【分片索引】1. 必須是整型數字或整型數字的字符串(能夠爲負數)

【分片索引】2. 最大物理分片配置方法是,在 mapFile 文件中,爲每個邏輯分片指定單獨的物理分片

例如:

0=0
1=1
...

【分片索引】3.  最小物理分片配置方法是,在 mapFile 文件中,爲全部邏輯分片指定同一個物理分片

例如:

0-<邏輯分片數量>=0

【數據分佈】1. 與分片索引值相關而與 INSERT 前後無相關性,因此在直接使用時沒法保證數據分佈均勻,但若是分片索引自己連續遞增(交易流水號等),則能夠期待數據分佈較爲平均,但反作用會致使範圍語句

例如

SELECT ... WHERE shard_key BETWEEN 1 AND 100

變成跨分片查詢

 

運維注意點

【擴容】1. 預先過量分片,而且不改變 patternValue,能夠避免數據再平衡,只需進行涉及數據的遷移

【擴容】2. 若須要改變 patternValue,須要數據再平衡

【縮容】1. 預先過量分片,而且不改變 patternValue,能夠避免數據再平衡,只需進行涉及數據的遷移

【縮容】2. 若須要改變 patternValue,須要數據再平衡

 

配置注意點

【配置項】1. 在 rule.xml 中,可配置項爲 <property name="patternValue"> <property name="mapFile"><property name="defaultNode">

【配置項】2. 在 rule.xml 中配置 <property name="defaultNode"> 標籤,非必須配置項,不配置該項的話,用戶的分片索引值沒落在 mapFile 定義的範圍時,DBLE 會報錯; 若須要配置,必須爲非負整數,用戶的分片索引值沒落在 mapFile定義 的範圍時,DBLE 會路由至這個值的 MySQL 分片

【配置項】3. 在 rule.xml 中配置 <property name="mapFile"> 標籤,範圍映射文件的路徑:若在映射文件在 DBLE_HOME/conf 或其中,則可使用相對路徑的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 時,配置值就能夠簡寫爲 map/table_map.txt;映射文件在 DBLE_HOME/conf 目錄之外時,須要使用絕對路徑,但這種作法須要考慮用戶權限等問題,所以不建議把映射文件放在 DBLE_HOME/conf 外。

【配置項】4. 編輯 mapFile 所配置的文件

記錄格式爲:<邏輯分片範圍的最小值>-<邏輯分片範圍的最大值>=<物理分片編號>

邏輯分片範圍的最小值和邏輯分片範圍的最大值必須是整型數字,取值範圍爲 Java 的長整型範圍內,物理分片編號必須是非負整型數字,記錄之間以換行分隔,一行僅能有一條記錄,容許以 「//」 和 「#」 在行首來註釋該行

【配置項】5. 讀取 mapFile 時,DBLE 不會對其中的範圍記錄查重,也不會檢查範圍最小值和範圍最大值相互之間誰更大

【配置項】6. mapFile 中邏輯分片範圍的最小值很是重要,DBLE 讀取 mapFile 時會對範圍進行基於邏輯分片範圍的最小值的插入排序,目前的最佳實踐是人手確保範圍與範圍之間沒有重疊

相關文章
相關標籤/搜索