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