2023-11-13 分類: 網(wǎng)站建設(shè)
是一個集中式單點(diǎn)緩存系統(tǒng),不具備集群功能。此操作主要由客戶端完成。
所以說到分布式,肯定會提到客戶端??聪聢D:
簡單來說,這里的客戶端做了一個路由功能,負(fù)責(zé)將不同的請求轉(zhuǎn)發(fā)到對應(yīng)的機(jī)器(實(shí)例)。
那么客戶端如何確定將特定請求轉(zhuǎn)發(fā)到哪臺機(jī)器?
在上面的場景中,我們可以在每次訪問數(shù)據(jù)時根據(jù)緩存key計(jì)算出hash值一致性hash算法php開源,然后根據(jù)實(shí)際的機(jī)器數(shù)量來定位我們想要的機(jī)器(這里只是舉例,實(shí)際環(huán)境往往更復(fù)雜),
而且,在存儲數(shù)據(jù)和獲取數(shù)據(jù)時,同一臺機(jī)器定位。它會滿足我們的需求嗎?
是的,正常情況下可以滿足我們的需求,為什么是正常的?
因?yàn)樵趯?shí)際生產(chǎn)環(huán)境中肯定會出現(xiàn)一些意外情況。比如上面三臺機(jī)器中的一臺突然宕機(jī)了,或者我想加一臺,會不會出現(xiàn)這個問題?起來了?
由于機(jī)器數(shù)量的變化,所有原來的緩存無法正確定位,無法再使用。這在一些高并發(fā)系統(tǒng)中往往是致命的。
有沒有更好的方法可以在機(jī)器宕機(jī)的情況下進(jìn)行平滑升級并盡可能保持正常運(yùn)行?
這個當(dāng)然有,就是我們接下來要講的一致性哈希算法。
當(dāng)我第一次看到一致性哈希算法這個詞時,我腦海中的第一反應(yīng)就是上面的實(shí)現(xiàn)。事實(shí)上,事實(shí)并非如此。更準(zhǔn)確地說,一致性哈希算法是一個全局概念模型,是集群部署中的一個很好的解決方案。
一致性哈希算法()早在1997年就已經(jīng)提出,目前在很多服務(wù)器中被廣泛使用,目前比較流行。
它的最終目標(biāo)是在移除或添加機(jī)器時最小化對現(xiàn)有鍵映射關(guān)系的影響。
以下是其實(shí)現(xiàn)原理的細(xì)目分類,網(wǎng)上已經(jīng)有詳細(xì)說明。
考慮到通常的hash算法是映射到一個32位的key值,也就是0~2^32-1次冪的數(shù)值空間;我們可以把這個空間看作是第一個(0)尾(2^32-1)個連接環(huán),如下圖1所示。
接下來考慮4個對象~,hash函數(shù)計(jì)算出的hash值key在環(huán)上的分布如圖2所示。
hash() = key1;
…………
hash() = key4;
基本思路
是將對象映射到相同的哈希值空間,并使用相同的哈希算法。
假設(shè)當(dāng)前有3個單元A、b、C,則映射結(jié)果如圖3所示,將它們排列在對應(yīng)的hash值的hash空間中。
hash(A) = 鍵 A;
…………
hash(C) = 鍵 C;
說到這里,順便提一下哈希計(jì)算。一般的方法可以使用機(jī)器的Ip地址或機(jī)器名作為hash輸入。
既然對象和對象都通過相同的哈希算法映射到哈希值空間,接下來要考慮的是如何將對象映射到它。
在這個環(huán)形空間中,如果從對象的key值開始順時針方向,直到遇到一個,那么就將對象存儲在this上,因?yàn)閷ο蟮膆ash值和hash值是固定的,所以這個必須是唯一的和確定的。你沒有找到對象的映射方法嗎? !
繼續(xù)上面的例子(見圖3),那么按照上面的方法,對象就會被存儲在A上;并對應(yīng)于 C;對應(yīng)b;
前面說過,先hash再計(jì)算余數(shù)的方法帶來的大問題是不能滿足單調(diào)性。當(dāng)有變化時,就會失敗,這會對后端服務(wù)器造成巨大的影響?,F(xiàn)在讓我們來分析和分析算法。 .
刪除
考慮假設(shè) b 掛斷了電話。根據(jù)上面提到的映射方法,只有那些沿著 b 逆時針遍歷直到下一個(C)的對象才會受到影響,這些對象原本是映射到 b 上的那些對象。
所以這里我們只需要改變對象,重新映射到C;見下圖
添加
考慮添加一個新的D,假設(shè)在這個循環(huán)的hash空間中,D在對象和之間進(jìn)行映射。此時,唯一受影響的將是那些沿 D 逆時針遍歷直到下一個 (b) 的對象(它們是最初映射到 C 的對象的一部分)。將這些對象重新映射到 D。
所以這里我們只需要改變對象,重新映射到D即可;見下圖
另一個考慮Hash算法的指標(biāo)是()一致性hash算法php開源,定義如下:
平衡
平衡意味著可以將哈希結(jié)果盡可能分配到所有的緩沖區(qū),從而可以使用所有的緩沖區(qū)空間。
哈希算法不保證絕對平衡。如果對象較少,則無法均勻映射對象。例如,在上面的例子中,當(dāng)只部署了A和C時,4個對象中,A只存儲,C存儲,和;分布很不均勻。
為了解決這種情況,引入了“虛擬節(jié)點(diǎn)”的概念,可以定義如下:
“虛擬節(jié)點(diǎn)”(node)是哈??臻g中一個實(shí)際節(jié)點(diǎn)的副本(),一個實(shí)際節(jié)點(diǎn)對應(yīng)幾個“虛擬節(jié)點(diǎn)”,這個對應(yīng)的數(shù)字也變成了“副本數(shù)”,“虛擬節(jié)點(diǎn)” “ ”在哈??臻g中按哈希值排列。
仍然以僅部署A和C的情況為例,如圖4所示,分布并不均勻?,F(xiàn)在我們引入虛擬節(jié)點(diǎn),將“復(fù)制次數(shù)”設(shè)置為2,即總共會有4個“虛擬節(jié)點(diǎn)”,A1、A2代表A; C1、C2代表C;假設(shè)一個更理想的情況,見下圖
此時對象與“虛擬節(jié)點(diǎn)”的映射關(guān)系為:
-> A2; -> A1; -> C1; -> C2;
所以對象和被映射到A,和被映射到C;平衡得到了很大的改善。
引入“虛擬節(jié)點(diǎn)”后,映射關(guān)系從{ -> node}轉(zhuǎn)化為{ -> node}。查詢對象時的映射關(guān)系如圖所示。
“虛擬節(jié)點(diǎn)”的hash計(jì)算可以采用在對應(yīng)節(jié)點(diǎn)的Ip地址加上數(shù)字后綴的方法。例如,假設(shè)A的Ip地址為202.168.14.241。
在引入“虛擬節(jié)點(diǎn)”之前,計(jì)算A的hash值:
Hash("202.168.14.241");
引入“虛擬節(jié)點(diǎn)”后,計(jì)算“虛擬節(jié)點(diǎn)”點(diǎn)A1和A2的hash值:
Hash("202.168.14.241#1"); // A1
Hash("202.168.14.241#2"); // A2
基本原則是這些。具體分布的理論分析應(yīng)該很復(fù)雜,但一般不使用。
上面有java版本的例子,可以參考。
轉(zhuǎn)載了一個pHp版本的實(shí)現(xiàn)代碼。
C 語言版本
查看本文的一致性哈希算法:
當(dāng)前文章:一個的單點(diǎn)緩存系統(tǒng)是什么?怎么確定把某個具體的請求轉(zhuǎn)發(fā)到對應(yīng)的
URL分享:http://www.rwnh.cn/news4/294204.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、小程序開發(fā)、品牌網(wǎng)站建設(shè)、微信小程序、商城網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容