摘要:當時十分興奮,立即去找了關于一致性協議的文章來看。到了今天再去回想,發現對一致性協議的概念已經模糊不清了。一致性算法一致性哈希算法在年由麻省理工學院的等人在解決分布式中提出的,設計目標是為了解決因特網中的熱點問題,初衷和十分類似。
序
第一次知道一致性Hash協議是在方騰飛的技術文章實戰解析-論三年內快速成長為一名技術專家里看到的。
問:對于三十歲的程度員,如果還想再深入做技術,有什么建議?答:技術人員一定要有危機感,無論多大年紀仍然要持續的學習,我也已經三十多了,每周會花點時間學習點技術。
但是年紀大了,其實時間不會那么多,所以要提高學習的效率,掌握一些學習方法和方法論,并且要靜下心來持續的學習。
學技術什么時間都不晚,因為總有新技術冒出來,但是一些永遠不變的技術可以優先學習,比如各種協議(TCP,HTTP,一致性hash協議),實現原理,算法等。
當時十分興奮,立即去找了關于一致性hash協議的文章來看。到了今天再去回想,發現對一致性hash協議的概念已經模糊不清了。雖然關于一致性hash協議的文章數不勝數,但是還是需要用自己的語言來表達一遍,才能真正的理解這些技術概念,成為自己的東西。這也是寫這篇文章的理由。
什么是一致性Hash協議?一致性Hash協議是指滿足了以下4個條件的Hash算法:
均衡性(Balance)
單調性(Monotonicity)
分散性(Spread)
負載(Load)
均衡性均衡性是指Hash的結果應該盡可能的平均分配給所有的節點,實現負載均衡的效果,這也是最基本的特性。
單調性單調性是指在節點增加或減少的情況下,已Hash的結果與節點的映射關系盡量不發生變化。單調性低的Hash算法在節點增加或減少的時候會出現Hash的結果與節點的映射關系大量失效的情況,造成嚴重的性能問題或系統故障。
分散性分散性是指相同內容在不同客戶端Hash的結果是否一致。因為在分布式的環境下,不同客戶端可以看到的節點數可能是不同的,分散性高的Hash算法會導致相同的內容卻映射了多個節點。
負載負載是從節點角度出發,不同內容的Hash結果卻映射了同一個節點位置。
普通余數Hash算法即 Hash結果 % 節點數,非常的簡單和好用。雖然這種算法滿足了均衡性,但是單調性卻非常的差勁,一旦節點數有變動就會造成大量的Hash的結果與節點的映射關系失效
。只適用于節點數固定的場景。
一致性哈希算法在1997年由麻省理工學院的Karger等人在解決分布式Cache中提出的,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性哈希修正了CARP使用的簡單哈希算法帶來的問題,使得DHT可以在P2P環境中真正得到應用。
首先構造一個長度為2^32的整數環,然后將節點Hash的結果均勻映射到整數環上。
這時將內容映射到整數環上。
如圖所示,Hash的結果與節點的映射關系是根據Hash的結果按順時針遇到的第一個節點來判定的。這樣做是為了有良好的單調性,假如現在節點C故障了那么新的映射關系如下圖所示:
我們可以看到原本屬于節點C的映射現在都重新映射到了節點D上,這樣至少保證了大部分的映射可以正常工作。
保證良好的均衡性一致性Hash算法的均衡性取決于節點的位置是否分布均勻,如果是按上圖所示分布節點,那么很明顯節點D的壓力遠遠高于其他節點。不過即使節點已經分布均勻了,如果節點數量太少的話也很容易造成數據傾斜問題。
虛擬節點虛擬節點是用來解決節點數量過少造成的數據傾斜問題。顧名思義,通過虛擬出一些節點來增加總節點數,這樣就有良好的均衡性了。
后記原理雖然簡單實現起來卻挺麻煩,大家如果有興趣可以自己去實現一個版本。我雖然寫了個demo但感覺并不好,就不放上來獻丑了。計劃是一周寫一篇文章的,現在已經寫了5篇了,動力開始不足了。原因可能很多,比如不知道寫什么,肚子里墨水不多等。希望能堅持下去,為了更好的明天。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71723.html
摘要:五一致性算法的容錯性和可擴展性現假設不幸宕機,可以看到此時對象不會受到影響,只有對象被重定位到。綜上所述,一致性算法對于節點的增減都只需重定位環空間中的一小部分數據,具有較好的容錯性和可擴展性。 最近有小伙伴跑過來問什么是Hash一致性算法,說面試的時候被問到了,因為不了解,所以就沒有回答上,問我有沒有相應的學習資料推薦,當時上班,沒時間回復,晚上回去了就忘了這件事,今天突然看到這個,...
摘要:好的哈希算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。一致性哈希算法的基本實現原理是將機器節點和值都按照一樣的算法映射到一個的圓環上。 一致性 hash 分布式過程中我們將服務分散到若干的節點上,以此通過集體的力量提升服務的目的。然而,對于一個客戶端來說,該由哪個節點服務呢?或者說對某個節點來說他分配到哪些任務呢? 強哈希 考慮到單服務器不能承載,因此使用了分布式架構,最初...
摘要:通過虛擬節點優化一致性算法為了提高一致性算法的平衡性,我們首先能夠想到的是,增加節點數,但是機器畢竟是需要經費啊,不是說增就能隨意增,那就增加虛擬節點,這樣就沒毛病了。 一、案例分析(1)問題概述 假設我們的圖片數據均勻的分配在三臺服務(分別標注為服務器A,服務器B、服務器C)上面,現在我們要從里面取圖片,服務端在拿到這個請求后,怎么會指定,這張圖片是存在服務器A、服務器B,還是服務器...
摘要:最常見的,會把用戶的登錄信息用戶信息存儲在中,以保持登錄狀態。什么是一致性問題只要用戶不重啟瀏覽器,每次短連接請求,理論上服務端都能定位到,保持會話。在高可用時,如何保證路由的一致性,是今天將要討論的問題。 一、緣起 什么是session?服務器為每個用戶創建一個會話,存儲用戶的相關信息,以便多次請求能夠定位到同一個上下文。 Web開發中,web-server可以自動為同一個瀏覽器的訪...
閱讀 3422·2023-04-25 22:44
閱讀 926·2021-11-15 11:37
閱讀 1632·2019-08-30 15:55
閱讀 2639·2019-08-30 15:54
閱讀 1080·2019-08-30 13:45
閱讀 1430·2019-08-29 17:14
閱讀 1853·2019-08-29 13:50
閱讀 3402·2019-08-26 11:39