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

原創: 鍾悅java


關於做者算法

鍾悅 - 資深DBLE用戶架構

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

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

 

以每24小時做爲一份時間(而非天然日),根據用戶的配置有兩種工做模式**:帶狀模式**中,用戶僅定義開始日期時,從開始日期(含)開始,每份時間1個分片地無限增長下去;環狀模式中,用戶定義了開始日期和結束日期時,以結束日期(含)和開始日期(含)之間的時間份數做爲分片總數(分片數量固定),以相似取模的方式路由到這些分片裏。3d

1. DBLE 啓動時,讀取用戶在 rule.xml 配置的 sBeginDate 來肯定起始時間code

2. 讀取用戶在 rule.xml 配置的 sPartionDay 來肯定每一個 MySQL 分片承載多少天內的數據orm

3. 讀取用戶在 rule.xml 配置的 dateFormat 來肯定分片索引的日期格式xml

4. 在 DBLE 的運行過程當中,用戶訪問使用這個算法的表時,WHERE 子句中的分片索引值(字符串),會被提取出來嘗試轉換成 Java 內部的時間類型中間件

5. 而後求分片索引值與起始時間的差,除以 MySQL 分片承載的天數,肯定所屬分片

1. DBLE 啓動時,讀取用戶在 rule.xml 配置的起始時間 sBeginDate、終止時間 sEndDate 和每一個 MySQL 分片承載多少天數據 sPartionDay

2. 根據用戶設置,創建起以 sBeginDate 開始,每 sPartionDay 天一個分片,直到 sEndDate 爲止的一個環,把分片串聯串聯起來

3. 讀取用戶在 rule.xml 配置的 defaultNode

4. 在 DBLE 的運行過程當中,用戶訪問使用這個算法的表時,WHERE 子句中的分片索引值(字符串),會被提取出來嘗試轉換成 Java 內部的日期類型

5. 而後求分片索引值與起始日期的差:若是分片索引值不早於 sBeginDate(哪怕晚於 sEndDate),就以 MySQL 分片承載的天數爲模數,對分片索引值求模獲得所屬分片;若是分片索引值早於 sBeginDate,就會被放到 defaultNode 分片上

 

與MyCat的相似分片算法對比

中間件 DBLE MyCat
分片算法種類 date 分區算法 按日期(天)分片

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

 

開發注意點

【分片索引】1. 必須是字符串,並且 java.text.SimpleDateFormat 能基於用戶指定的 dateFormat 來轉換成 java.util.Date

【分片索引】2. 提供帶狀模式和環狀模式兩種模式

【分片索引】3. 帶狀模式以 sBeginDate(含)起,以 86400000 毫秒(24 小時整)爲一份,每 sPartionDay 份爲一個分片,理論上分片數量能夠無限增加,可是出現 sBeginDate 以前的數據並且沒有設定 defaultNode 的話,會路由失敗(若是有 defaultNode,則路由至 defaultNode)

【分片索引】4. 環狀模式以 86400000 毫秒(24 小時整)爲一份,每 sPartionDay 份爲一個分片,以 sBeginDate(含)到 sEndDate(含)的時間長度除以單個分片長度獲得恆定的分片數量,可是出現 sBeginDate 以前的數據並且沒有設定 defaultNode 的話,會路由失敗(若是有 defaultNode,則路由至 defaultNode)

【分片索引】5. 不管哪一種模式,分片索引字段的格式化字符串 dateFormat 由用戶指定

【分片索引】6. 不管哪一種模式,劃分不是以日曆時間爲準,沒法對應天然月和天然年,且會受閏秒問題影響

 

運維注意點

【擴容】1. 帶狀模式中,隨着 sBeginDate 以後的數據出現,分片數量的增長無需再平衡

【擴容】2. 帶狀模式沒有自動增添分片的能力,須要運維手工提早增長分片;若是路由策略計算出的分片並不存在時,會致使失敗

【擴容】3. 環狀模式中,若是新舊 [sBeginDate,sEndDate] 之間有重疊,須要進行部分數據遷移;若是新舊 [sBeginDate,sEndDate] 之間沒有重疊,須要數據再平衡

 

配置注意點

【配置項】1. 在 rule.xml 中,可配置項爲 <propertyname="sBeginDate"><propertyname="sPartionDay"><propertyname="dateFormat"><propertyname="sEndDate"><propertyname="defaultNode">

【配置項】2.在 rule.xml 中配置 <propertyname="dateFormat">,符合 java.text.SimpleDateFormat 規範的字符串,用於告知 DBLE 如何解析sBeginDate和sEndDate

【配置項】3.在 rule.xml 中配置 <propertyname="sBeginDate">,必須是符合 dateFormat 的日期字符串

【配置項】4.在 rule.xml 中配置 <propertyname="sEndDate">,必須是符合 dateFormat 的日期字符串;配置了該項使用的是環狀模式,若沒有配置該項則使用的是帶狀模式

【配置項】5.在 rule.xml 中配置 <propertyname="sPartionDay">,非負整數,該分片策略以 86400000 毫秒(24 小時整)做爲一份,而 sPartionDay 告訴 DBLE 把每多少份放在同一個分片

【配置項】6.在 rule.xml 中配置 <propertyname="defaultNode"> 標籤,非必須配置項,不配置該項的話,用戶的分片索引值沒落在 mapFile 定義

相關文章
相關標籤/搜索