原創: 鍾悅算法
關於做者架構
鍾悅 - 資深DBLE用戶運維
某宇宙行資深架構師,在大型重點項目中使用 DBLE。3d
常年與 MySQL 糾纏不清,常常運用技術處理大企業病的技術or非技術問題的一個挨踢從業者。code
根據用戶定義的範圍與分片節點映射文件,直接定位目標分片。xml
1. 用戶在 rule.xml 中配置範圍定義文件路徑,文件中定義的各個範圍被加載到內存中,造成一個映射表中間件
2. 在 DBLE 的運行過程當中,用戶訪問使用這個算法的表時,WHERE 子句中的分片索引值會被提取出來,直接查映射表獲得分片編號blog
與MyCat的相似分片算法對比排序
中間件 | DBLE | MyCat |
---|---|---|
分片算法種類 | numberrange 分區算法 | 範圍約定 |
區別 | 寫具體的數值 | 可用K或M等數量替換付 |
開發注意點索引
【分片索引】1. 整型數字(能夠爲負數),取值範圍是長整型
【分片索引】2. 範圍包含其起點和終點,例如,範圍 1-100 包含 1 和 100(即 [1, 100])
【分片索引】3. 若是範圍與範圍之間存在重疊(例如 1-100 和 100-200 重疊於 100),不會引發異常,會命中在範圍配置文件mapFile中最早出現的那一個並按其執行
【分片索引】4. 不一樣範圍能夠映射到同一個分片上
0 - 99 = 0 100 - 199 = 0
【數據分佈】1. 沒法保證均勻
【數據分佈】2. 總分數量等於範圍配置文件 mapFile 中各範圍持有的分片數量之和
運維注意點
【擴容】1. 原有範圍(含默認節點)的數據太熱,須要拆分紅多個新的更小的範圍來擴展到不一樣MySQL節點時,須要對局部數據進行遷移
【縮容】1. 原有的幾個範圍的數據太冷,須要合併到同一個 MySQL 節點來節省資源時,須要對局部數據進行遷移
配置注意點
【配置項】1. 在 rule.xml 中,可配置項爲<property name="defaultNode">和<property name="mapFile">
【配置項】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 中的記錄的前後順序很是重要,目前的最佳實踐是人手確保範圍與範圍之間沒有重疊,並且按照數據查詢頻率,從高頻到低頻來順序填寫 mapFile