問題
raft 的局限:寫請求只能在 Leader 節(jié)點(diǎn)上進(jìn)行處理,集群性能約等于單機(jī)
普通 hash (取余)分集群問題:集群數(shù)量發(fā)送變更的時(shí)候就需要做數(shù)據(jù)遷移重新映射,由于集群擴(kuò)容前后數(shù)量不一致導(dǎo)致 hash 計(jì)算后得到結(jié)果不一致
一致性 hash
本質(zhì)是對 2 的 32 次方取模運(yùn)算,將整個(gè)哈希值空間組成一個(gè)虛擬的圓環(huán),也就是哈希環(huán)。下面看圖說話。
key 如何定位

image.png
一開始根據(jù)取模后可以計(jì)算出 abc 節(jié)點(diǎn)在環(huán)上的位置
key1 訪問時(shí)也可以計(jì)算出在環(huán)上的位置
然后順時(shí)針向前走,就能找到對應(yīng) key 所對應(yīng)的節(jié)點(diǎn)
節(jié)點(diǎn)移除

image.png
當(dāng)節(jié)點(diǎn)移除時(shí)原先的 key 會(huì)繼續(xù)順時(shí)針向前找到對應(yīng)的新節(jié)點(diǎn)
-
會(huì)影響的 key 是從 A 到 B 原先的 key,但是原來的 B 到 C 和 C 到 A 之前的數(shù)據(jù)不會(huì)被影響
節(jié)點(diǎn)新增

image.png
新節(jié)點(diǎn)加入后,原先的 key 可能順時(shí)針走到新的節(jié)點(diǎn)上
-
會(huì)影響的同樣為從 A 到 B 原先的 key,但并不是全部
虛擬節(jié)點(diǎn)

image.png
- 對于同一個(gè)節(jié)點(diǎn)增加一個(gè)或多個(gè)虛擬節(jié)點(diǎn)來讓整個(gè)哈希環(huán)分布更加均勻
- 這樣對應(yīng)的 key 在訪問的時(shí)候不會(huì)猶豫環(huán)中的空間過于密集從而冷熱不均
總結(jié)
- 哈希環(huán)利用環(huán)的性質(zhì)讓節(jié)點(diǎn)的增減變化只會(huì)影響到部分?jǐn)?shù)據(jù)的路由
- 相對應(yīng)的如果要做數(shù)據(jù)遷移也會(huì)影響到更少的數(shù)據(jù)
- 通過虛擬節(jié)點(diǎn)的加入還能減少節(jié)點(diǎn)訪問的冷熱不均的問題