數據庫中間件的分片規則如何選擇,這篇文章告訴你
在做數據的分庫分表時,選擇合適分片規則是一件很重要的事情,如果分片規則選擇不合理,可能會導致以下兩種情況:
- 數據分布不均衡,系統產生單點故障
- 后期數據擴容難
因此本文對常用數據分片規則進行優缺點以及適應場景的介紹,希望對讀者朋友們有所幫助!
時間范圍分片
時間范圍分片要求分片鍵為時間類型字段,可以支持按年、按月、按日、按小時等范圍進行數據分片
優點:
此分片規則在擴容時只需要添加節點,指定日期范圍,可以避免擴容時的數據遷移
缺點:
負載不均衡,容易導致單節點故障,假設:2016.1->2016.6這個時間段(上圖DB2節點),公司在做產品推廣,那么這個時間段的數據量會比較大,會導致DB2節點負載會比較高,而節點負載又比較低。
適應場景:
具有時間屬性的數據,適合做范圍分片,比如日志數據,前期查詢頻率比較高,可以按照季度或者月份進行范圍分割,后期不需要直接把整個節點遷移走或者進行數據清空,如下圖,假如DB1所在數據不需要,直接遷移走即可。
如下圖是一個數據擴容示例,假設之前的分片規則規劃至2016年底,那么為了支持2017年的數據,只需要增加對應節點、并修改分片規則即可(DB4節點),不需要遷移原有數據
數值范圍分片
數值范圍分片與時間范圍分片類似,唯一不同就是每個分片數據量相對均衡,熱點數據存在但是相對較少。
比如時間范圍分片2016.1-2016.6為一個分片,在此分片上產生數據是不可控的,假如這個時間段公司不搞促銷,那么這個分片數據可能為1w條,如果搞可能為1千萬。
但是數值范圍分片沒有此問題,因為在設置分片時,已規定了每個分片的數據量,所以數據分布比較均衡。
優點:
- 此分片規則在擴容時只需要添加節點,指定數值范圍,可以避免擴容時的數據遷移。
- 數據量可控,可以均衡,也可以不均衡。
缺點:
無法解決熱點問題,如果某一段數據訪問QPS特別高,就會落到單節點上進行操作。
適應場景:
業務場景中熱點數據比較少的業務都可以使用,比如用戶系統,以用戶ID進行分片,用戶Id采用全局遞增模式。
取模分片
取模顧名思義就是對分片鍵值與對應的節點數進行取余,如下圖,假如分片鍵為6,節點數為3,那么6%3=0,那么此分片鍵應該保存在DB1節點
取模分片擴展又分為基礎分片和hash取模分片,具體如下:
- 基礎分片要求分片鍵類型為數值型或者值中必須帶有數字,然后進行截取取余計算。
- hash取模分片不要求字段值中必須要有數字,因為不管是字符串還是其他值,需要先進行hash計算,然后再進行取模
優點:
節點負載均衡,假設key是按照全局遞增,每次保存數據時與節點數進行取模,保存至對應的節點。
缺點:
在擴容時需要全量遷移,因前期是按照規定的節點數取模存儲到各個節點的,如果后期新增節點,導致老數據按照新的節點數取模無法匹配到對應的節點,如下圖:
因此所有的數據需要全部遷移重新分片,如下圖:
適應場景:
適用于需要將數據均勻分布的場景,例如:銀行類客戶業務應用,業務邏輯主體是客戶,可使用客戶對應的表字段(例如客戶號)作為拆分鍵
一致性hash分片
之前文章介紹過一致性hash分片各種特性,具體可查看一致性HASH算法,看這一篇就夠了,這里只做簡單介紹
一致性哈希是指將「存儲節點」和「數據」都映射到一個首尾相連的哈希環上,增加或者移除一個節點,只影響該節點在哈希環上順時針相鄰的后繼節點,其它數據不會受到影響
但是一致性哈希算法不能夠均勻的分布節點,會出現大量請求都集中在一個節點的情況,在這種情況下進行容災與擴容時,容易出現雪崩的連鎖反應,如下圖
因此需要增加虛擬節點來解決數據均衡分布的問題,如下圖:
優點:
通過增加虛擬節點后數據分布相對均衡,節點不存在熱點問題。
缺點:
數據擴容相對復雜,理論上一致性Hash在擴容時只需要遷移相鄰節點部分數據即可,但是為了保證節點的數據均衡,增加了虛擬節點,導致相鄰過多,那么數據擴容變得就沒那么簡單,假設增加DB4節點的虛擬節點(紅色標識),那么相鄰的DB1和DB3數據都需要遷移。
適應場景:
適用于需要將數據均勻分布并且在擴容時不需要大量遷移數據的場景。