原創做者: 鍾悅算法
關於做者架構
鍾 悅 - 資深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 時會對範圍進行基於邏輯分片範圍的最小值的插入排序,目前的最佳實踐是人手確保範圍與範圍之間沒有重疊