在《一致性詳解》的博文的開篇詞中提到,在高併發讀寫數據的場景中,咱們通常會對數據進行hash分片,從而分佈到不一樣的服務器中,那麼本文就談談經常使用的hash分片。算法
數據均勻分佈指的是數據須要儘量均勻的發佈在不一樣的節點上,不能其中一個或幾個節點佔有大部分數據,這樣分片的做用就大打折扣了。服務器
與數據均勻分佈相似,請求均勻分佈是指獲取數據的請求,可以大致均勻的分佈在各個節點上,不能請求大部分落在其中幾個分片上面。併發
數據穩定性是指當分片的容量不夠,擴容分片的時候,數據不會大範圍的從某些節點遷移到其餘節點。縮容時也同樣。函數
若是分片的各個節點的服務器性能不同,那麼性能差的節點應該少分配一些數據與請求;性能好的節點應該多分配一些請求。若是性能不一樣的節點,分配的數據與請求都差很少,其本質上就是一種不均勻。高併發
故障隔離咱們通常是經過備份節點數據實現的,可是若是節點都備份到一樣的服務器,若是服務器故障了那麼那個節點就不可用了。故咱們通常把備份的數據分佈到不一樣的機房,至少分佈到不一樣的機架。性能
性能穩定性是指,數據存儲和查詢的效率要有保證,不能由於節點的添加或者移除,形成存儲或訪問性能的嚴重降低。spa
哈希hash分片是指經過hash函數把數據映射到不一樣的節點上面,若是hash函數選的比較好的話,數據能夠比較均勻的分片到不一樣的節點上面。可是若是節點是異構的,那麼每一個節點都均勻分佈,那麼就不符合上文的節點異構性原則。並且若是節點擴容或者縮容,那麼就要掃描全部的數據,從新hash節點,此時須要遷移大量的節點,穩定性很差。好比原先有3個節點,若是擴容到了4個節點。那麼哈希函數就變成了hash(key)%3變成hash(key)%4。假設hash(key)的值爲0,1,2,3,4,5,6,7,8,9,那麼節點1分佈的數據是hash(key)值爲0,3,6,9,節點2爲1,4,7,節點3爲2,5,8。但若是擴容到4個節點了節點1分佈的是0,4,8,節點2爲1,5,9,節點3爲2,6,節點4爲3,7。能夠看到遷移了大量的數據。
因爲一致性有如上缺陷,故只適合於節點性能都差很少,數據變化不大的狀況。blog
帶虛擬節點的一致性哈希方法,核心思想是根據每一個節點的性能,爲每一個節點劃分不一樣數量的虛擬節點,並將這些虛擬節點映射到哈希環中,而後再按照一致性哈希算法進行數據映射和存儲。爲了演示方便,假設有20個虛擬節點,4個分片每一個分片的性能都差很少,實際咱們通常使用較多的虛擬節點如10240,其映射關係以下圖:
如今咱們須要擴容到5個分片,每一個分片的性能都差很少,則新的映射圖以下:
從圖中能夠看出:只遷移了20%的數據。可是有同窗可能會問,若是是大規模數據,好比幾十億條,那麼一次遷移也須要遷移很是多的數據,對性能的影響仍是很大。其實咱們實際應用中能夠分步遷移,一次遷移一部分,實際訪問的時候能夠先訪問舊的節點,若是命中了,那麼遷移到新的節點;若是沒有命中,則訪問新的節點。若是已經遷移了大部分,爲了性能能夠反過來,先訪問新節點。hash