一個(gè)的單點(diǎn)緩存系統(tǒng)是什么?怎么確定把某個(gè)具體的請求轉(zhuǎn)發(fā)到對應(yīng)的

2023-11-13    分類: 網(wǎng)站建設(shè)

是一個(gè)集中式單點(diǎn)緩存系統(tǒng),不具備集群功能。此操作主要由客戶端完成。

所以說到分布式,肯定會提到客戶端??聪聢D:

簡單來說,這里的客戶端做了一個(gè)路由功能,負(fù)責(zé)將不同的請求轉(zhuǎn)發(fā)到對應(yīng)的機(jī)器(實(shí)例)。

那么客戶端如何確定將特定請求轉(zhuǎn)發(fā)到哪臺機(jī)器?

在上面的場景中,我們可以在每次訪問數(shù)據(jù)時(shí)根據(jù)緩存key計(jì)算出hash值一致性hash算法php開源,然后根據(jù)實(shí)際的機(jī)器數(shù)量來定位我們想要的機(jī)器(這里只是舉例,實(shí)際環(huán)境往往更復(fù)雜),

而且,在存儲數(shù)據(jù)和獲取數(shù)據(jù)時(shí),同一臺機(jī)器定位。它會滿足我們的需求嗎?

是的,正常情況下可以滿足我們的需求,為什么是正常的?

因?yàn)樵趯?shí)際生產(chǎn)環(huán)境中肯定會出現(xiàn)一些意外情況。比如上面三臺機(jī)器中的一臺突然宕機(jī)了,或者我想加一臺,會不會出現(xiàn)這個(gè)問題?起來了?

由于機(jī)器數(shù)量的變化,所有原來的緩存無法正確定位,無法再使用。這在一些高并發(fā)系統(tǒng)中往往是致命的。

有沒有更好的方法可以在機(jī)器宕機(jī)的情況下進(jìn)行平滑升級并盡可能保持正常運(yùn)行?

這個(gè)當(dāng)然有,就是我們接下來要講的一致性哈希算法。

當(dāng)我第一次看到一致性哈希算法這個(gè)詞時(shí),我腦海中的第一反應(yīng)就是上面的實(shí)現(xiàn)。事實(shí)上,事實(shí)并非如此。更準(zhǔn)確地說,一致性哈希算法是一個(gè)全局概念模型,是集群部署中的一個(gè)很好的解決方案。

一致性哈希算法()早在1997年就已經(jīng)提出,目前在很多服務(wù)器中被廣泛使用,目前比較流行。

它的最終目標(biāo)是在移除或添加機(jī)器時(shí)最小化對現(xiàn)有鍵映射關(guān)系的影響。

以下是其實(shí)現(xiàn)原理的細(xì)目分類,網(wǎng)上已經(jīng)有詳細(xì)說明。

考慮到通常的hash算法是映射到一個(gè)32位的key值,也就是0~2^32-1次冪的數(shù)值空間;我們可以把這個(gè)空間看作是第一個(gè)(0)尾(2^32-1)個(gè)連接環(huán),如下圖1所示。

接下來考慮4個(gè)對象~,hash函數(shù)計(jì)算出的hash值key在環(huán)上的分布如圖2所示。

hash() = key1;

…………

hash() = key4;

基本思路

是將對象映射到相同的哈希值空間,并使用相同的哈希算法。

假設(shè)當(dāng)前有3個(gè)單元A、b、C,則映射結(jié)果如圖3所示,將它們排列在對應(yīng)的hash值的hash空間中。

hash(A) = 鍵 A;

…………

hash(C) = 鍵 C;

說到這里,順便提一下哈希計(jì)算。一般的方法可以使用機(jī)器的Ip地址或機(jī)器名作為hash輸入。

既然對象和對象都通過相同的哈希算法映射到哈希值空間,接下來要考慮的是如何將對象映射到它。

在這個(gè)環(huán)形空間中,如果從對象的key值開始順時(shí)針方向,直到遇到一個(gè),那么就將對象存儲在this上,因?yàn)閷ο蟮膆ash值和hash值是固定的,所以這個(gè)必須是唯一的和確定的。你沒有找到對象的映射方法嗎? !

繼續(xù)上面的例子(見圖3),那么按照上面的方法,對象就會被存儲在A上;并對應(yīng)于 C;對應(yīng)b;

前面說過,先hash再計(jì)算余數(shù)的方法帶來的大問題是不能滿足單調(diào)性。當(dāng)有變化時(shí),就會失敗,這會對后端服務(wù)器造成巨大的影響?,F(xiàn)在讓我們來分析和分析算法。 .

刪除

考慮假設(shè) b 掛斷了電話。根據(jù)上面提到的映射方法,只有那些沿著 b 逆時(shí)針遍歷直到下一個(gè)(C)的對象才會受到影響,這些對象原本是映射到 b 上的那些對象。

所以這里我們只需要改變對象,重新映射到C;見下圖

添加

考慮添加一個(gè)新的D,假設(shè)在這個(gè)循環(huán)的hash空間中,D在對象和之間進(jìn)行映射。此時(shí),唯一受影響的將是那些沿 D 逆時(shí)針遍歷直到下一個(gè) (b) 的對象(它們是最初映射到 C 的對象的一部分)。將這些對象重新映射到 D。

所以這里我們只需要改變對象,重新映射到D即可;見下圖

另一個(gè)考慮Hash算法的指標(biāo)是()一致性hash算法php開源,定義如下:

平衡

平衡意味著可以將哈希結(jié)果盡可能分配到所有的緩沖區(qū),從而可以使用所有的緩沖區(qū)空間。

哈希算法不保證絕對平衡。如果對象較少,則無法均勻映射對象。例如,在上面的例子中,當(dāng)只部署了A和C時(shí),4個(gè)對象中,A只存儲,C存儲,和;分布很不均勻。

為了解決這種情況,引入了“虛擬節(jié)點(diǎn)”的概念,可以定義如下:

“虛擬節(jié)點(diǎn)”(node)是哈??臻g中一個(gè)實(shí)際節(jié)點(diǎn)的副本(),一個(gè)實(shí)際節(jié)點(diǎn)對應(yīng)幾個(gè)“虛擬節(jié)點(diǎn)”,這個(gè)對應(yīng)的數(shù)字也變成了“副本數(shù)”,“虛擬節(jié)點(diǎn)” “ ”在哈??臻g中按哈希值排列。

仍然以僅部署A和C的情況為例,如圖4所示,分布并不均勻?,F(xiàn)在我們引入虛擬節(jié)點(diǎn),將“復(fù)制次數(shù)”設(shè)置為2,即總共會有4個(gè)“虛擬節(jié)點(diǎn)”,A1、A2代表A; C1、C2代表C;假設(shè)一個(gè)更理想的情況,見下圖

此時(shí)對象與“虛擬節(jié)點(diǎn)”的映射關(guān)系為:

-> A2; -> A1; -> C1; -> C2;

所以對象和被映射到A,和被映射到C;平衡得到了很大的改善。

引入“虛擬節(jié)點(diǎn)”后,映射關(guān)系從{ -> node}轉(zhuǎn)化為{ -> node}。查詢對象時(shí)的映射關(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)載了一個(gè)pHp版本的實(shí)現(xiàn)代碼。

C 語言版本

查看本文的一致性哈希算法:

當(dāng)前文章:一個(gè)的單點(diǎn)緩存系統(tǒng)是什么?怎么確定把某個(gè)具體的請求轉(zhuǎn)發(fā)到對應(yīng)的
URL分享:http://www.muchs.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)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營