數(shù)據(jù)庫中間件的分片規(guī)則如何選擇,這篇文章告訴你
在做數(shù)據(jù)的分庫分表時,選擇合適分片規(guī)則是一件很重要的事情,如果分片規(guī)則選擇不合理,可能會導(dǎo)致以下兩種情況:
- 數(shù)據(jù)分布不均衡,系統(tǒng)產(chǎn)生單點故障
- 后期數(shù)據(jù)擴(kuò)容難
因此本文對常用數(shù)據(jù)分片規(guī)則進(jìn)行優(yōu)缺點以及適應(yīng)場景的介紹,希望對讀者朋友們有所幫助!

時間范圍分片
時間范圍分片要求分片鍵為時間類型字段,可以支持按年、按月、按日、按小時等范圍進(jìn)行數(shù)據(jù)分片

優(yōu)點:
此分片規(guī)則在擴(kuò)容時只需要添加節(jié)點,指定日期范圍,可以避免擴(kuò)容時的數(shù)據(jù)遷移
缺點:
負(fù)載不均衡,容易導(dǎo)致單節(jié)點故障,假設(shè):2016.1->2016.6這個時間段(上圖DB2節(jié)點),公司在做產(chǎn)品推廣,那么這個時間段的數(shù)據(jù)量會比較大,會導(dǎo)致DB2節(jié)點負(fù)載會比較高,而節(jié)點負(fù)載又比較低。
適應(yīng)場景:
具有時間屬性的數(shù)據(jù),適合做范圍分片,比如日志數(shù)據(jù),前期查詢頻率比較高,可以按照季度或者月份進(jìn)行范圍分割,后期不需要直接把整個節(jié)點遷移走或者進(jìn)行數(shù)據(jù)清空,如下圖,假如DB1所在數(shù)據(jù)不需要,直接遷移走即可。

如下圖是一個數(shù)據(jù)擴(kuò)容示例,假設(shè)之前的分片規(guī)則規(guī)劃至2016年底,那么為了支持2017年的數(shù)據(jù),只需要增加對應(yīng)節(jié)點、并修改分片規(guī)則即可(DB4節(jié)點),不需要遷移原有數(shù)據(jù)

數(shù)值范圍分片
數(shù)值范圍分片與時間范圍分片類似,唯一不同就是每個分片數(shù)據(jù)量相對均衡,熱點數(shù)據(jù)存在但是相對較少。
比如時間范圍分片2016.1-2016.6為一個分片,在此分片上產(chǎn)生數(shù)據(jù)是不可控的,假如這個時間段公司不搞促銷,那么這個分片數(shù)據(jù)可能為1w條,如果搞可能為1千萬。
但是數(shù)值范圍分片沒有此問題,因為在設(shè)置分片時,已規(guī)定了每個分片的數(shù)據(jù)量,所以數(shù)據(jù)分布比較均衡。

優(yōu)點:
- 此分片規(guī)則在擴(kuò)容時只需要添加節(jié)點,指定數(shù)值范圍,可以避免擴(kuò)容時的數(shù)據(jù)遷移。
- 數(shù)據(jù)量可控,可以均衡,也可以不均衡。
缺點:
無法解決熱點問題,如果某一段數(shù)據(jù)訪問QPS特別高,就會落到單節(jié)點上進(jìn)行操作。
適應(yīng)場景:
業(yè)務(wù)場景中熱點數(shù)據(jù)比較少的業(yè)務(wù)都可以使用,比如用戶系統(tǒng),以用戶ID進(jìn)行分片,用戶Id采用全局遞增模式。
取模分片
取模顧名思義就是對分片鍵值與對應(yīng)的節(jié)點數(shù)進(jìn)行取余,如下圖,假如分片鍵為6,節(jié)點數(shù)為3,那么6%3=0,那么此分片鍵應(yīng)該保存在DB1節(jié)點

取模分片擴(kuò)展又分為基礎(chǔ)分片和hash取模分片,具體如下:
- 基礎(chǔ)分片要求分片鍵類型為數(shù)值型或者值中必須帶有數(shù)字,然后進(jìn)行截取取余計算。
- hash取模分片不要求字段值中必須要有數(shù)字,因為不管是字符串還是其他值,需要先進(jìn)行hash計算,然后再進(jìn)行取模
優(yōu)點:
節(jié)點負(fù)載均衡,假設(shè)key是按照全局遞增,每次保存數(shù)據(jù)時與節(jié)點數(shù)進(jìn)行取模,保存至對應(yīng)的節(jié)點。
缺點:
在擴(kuò)容時需要全量遷移,因前期是按照規(guī)定的節(jié)點數(shù)取模存儲到各個節(jié)點的,如果后期新增節(jié)點,導(dǎo)致老數(shù)據(jù)按照新的節(jié)點數(shù)取模無法匹配到對應(yīng)的節(jié)點,如下圖:

因此所有的數(shù)據(jù)需要全部遷移重新分片,如下圖:

適應(yīng)場景:
適用于需要將數(shù)據(jù)均勻分布的場景,例如:銀行類客戶業(yè)務(wù)應(yīng)用,業(yè)務(wù)邏輯主體是客戶,可使用客戶對應(yīng)的表字段(例如客戶號)作為拆分鍵
一致性hash分片
之前文章介紹過一致性hash分片各種特性,具體可查看一致性HASH算法,看這一篇就夠了,這里只做簡單介紹
一致性哈希是指將「存儲節(jié)點」和「數(shù)據(jù)」都映射到一個首尾相連的哈希環(huán)上,增加或者移除一個節(jié)點,只影響該節(jié)點在哈希環(huán)上順時針相鄰的后繼節(jié)點,其它數(shù)據(jù)不會受到影響

但是一致性哈希算法不能夠均勻的分布節(jié)點,會出現(xiàn)大量請求都集中在一個節(jié)點的情況,在這種情況下進(jìn)行容災(zāi)與擴(kuò)容時,容易出現(xiàn)雪崩的連鎖反應(yīng),如下圖

因此需要增加虛擬節(jié)點來解決數(shù)據(jù)均衡分布的問題,如下圖:

優(yōu)點:
通過增加虛擬節(jié)點后數(shù)據(jù)分布相對均衡,節(jié)點不存在熱點問題。
缺點:
數(shù)據(jù)擴(kuò)容相對復(fù)雜,理論上一致性Hash在擴(kuò)容時只需要遷移相鄰節(jié)點部分?jǐn)?shù)據(jù)即可,但是為了保證節(jié)點的數(shù)據(jù)均衡,增加了虛擬節(jié)點,導(dǎo)致相鄰過多,那么數(shù)據(jù)擴(kuò)容變得就沒那么簡單,假設(shè)增加DB4節(jié)點的虛擬節(jié)點(紅色標(biāo)識),那么相鄰的DB1和DB3數(shù)據(jù)都需要遷移。

適應(yīng)場景:
適用于需要將數(shù)據(jù)均勻分布并且在擴(kuò)容時不需要大量遷移數(shù)據(jù)的場景。

































