偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一致性Hash(Consistent Hashing)原理剖析

開發(fā) 開發(fā)工具 前端
在業(yè)務開發(fā)中,我們常把數(shù)據(jù)持久化到數(shù)據(jù)庫中。如果需要讀取這些數(shù)據(jù),除了直接從數(shù)據(jù)庫中讀取外,為了減輕數(shù)據(jù)庫的訪問壓力以及提高訪問速度,我們更多地引入緩存來對數(shù)據(jù)進行存取。

前面一篇文章通過生活化的場景為例,來描述RPC中的一些核心且常用的技術(shù),(RPC是什么?為什么要學習RPC?)在負載均衡的時候,我們提到一個「一致性Hash」, 這個在RPC之外的許多場景也會使用到。

[[239351]]

引入

在業(yè)務開發(fā)中,我們常把數(shù)據(jù)持久化到數(shù)據(jù)庫中。如果需要讀取這些數(shù)據(jù),除了直接從數(shù)據(jù)庫中讀取外,為了減輕數(shù)據(jù)庫的訪問壓力以及提高訪問速度,我們更多地引入緩存來對數(shù)據(jù)進行存取。讀取數(shù)據(jù)的過程一般為:

加入緩存的數(shù)據(jù)讀取過程

圖1:加入緩存的數(shù)據(jù)讀取過程

對于分布式緩存,不同機器上存儲不同對象的數(shù)據(jù)。為了實現(xiàn)這些緩存機器的負載均衡,可以使用式子1來定位對象緩存的存儲機器:

  1. m = hash(o) mod n ——式子1 

其中,o為對象的名稱,n為機器的數(shù)量,m為機器的編號,hash為一hash函數(shù)。圖2中的負載均衡器(load balancer)正是使用式子1來將客戶端對不同對象的請求分派到不同的機器上執(zhí)行,例如,對于對象o,經(jīng)過式子1的計算,得到m的值為3,那么所有對對象o的讀取和存儲的請求都被發(fā)往機器3執(zhí)行。

如何利用Hash取模實現(xiàn)負載均衡

圖2:如何利用Hash取模實現(xiàn)負載均衡

式子1在大部分時候都可以工作得很好,然而,當機器需要擴容或者機器出現(xiàn)宕機的情況下,事情就比較棘手了。

當機器擴容,需要增加一臺緩存機器時,負載均衡器使用的式子變成:

  1. m = hash(o) mod (n + 1) ——式子2 

當機器宕機,機器數(shù)量減少一臺時,負載均衡器使用的式子變成:

  1. m = hash(o) mod (n - 1) ——式子3 

我們以機器擴容的情況為例,說明簡單的取模方法會導致什么問題。假設機器由3臺變成4臺,對象o1由式子1計算得到的m值為2,由式子2計算得到的m值卻可能為0,1,2,3(一個 3t + 2的整數(shù)對4取模,其值可能為0,1,2,3,讀者可以自行驗證),大約有75%(3/4)的可能性出現(xiàn)緩存訪問不***的現(xiàn)象。隨著機器集群規(guī)模的擴大,這個比例線性上升。當99臺機器再加入1臺機器時,不***的概率是99%(99/100)。這樣的結(jié)果顯然是不能接受的,因為這會導致數(shù)據(jù)庫訪問的壓力陡增,嚴重情況,還可能導致數(shù)據(jù)庫宕機。

一致性hash算法正是為了解決此類問題的方法,它可以保證當機器增加或者減少時,對緩存訪問***的概率影響減至很小。下面我們來詳細說一下一致性hash算法的具體過程。

一致性Hash環(huán)

一致性hash算法通過一個叫作一致性hash環(huán)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。這個環(huán)的起點是0,終點是2^32 - 1,并且起點與終點連接,環(huán)的中間的整數(shù)按逆時針分布,故這個環(huán)的整數(shù)分布范圍是[0, 2^32-1],如下圖3所示:

一致性Hash環(huán)

圖3:一致性Hash環(huán)

將對象放置到Hash環(huán)

假設現(xiàn)在我們有4個對象,分別為o1,o2,o3,o4,使用hash函數(shù)計算這4個對象的hash值(范圍為0 ~ 2^32-1):

 

  1. hash(o1) = m1  
  2. hash(o2) = m2  
  3. hash(o3) = m3  
  4. hash(o4) = m4 

 

把m1,m2,m3,m4這4個值放置到hash環(huán)上,得到如下圖4:

放置了對象的一致性Hash環(huán)

圖4:放置了對象的一致性Hash環(huán)

將機器放置到Hash環(huán)

使用同樣的hash函數(shù),我們將機器也放置到hash環(huán)上。假設我們有三臺緩存機器,分別為 c1,c2,c3,使用hash函數(shù)計算這3臺機器的hash值:

  1. hash(c1) = t1  
  2. hash(c2) = t2  
  3. hash(c3) = t3 

把t1,t2,t3 這3個值放置到hash環(huán)上,得到如下圖5:

放置了機器的一致性Hash環(huán)

圖5:放置了機器的一致性Hash環(huán)

為對象選擇機器

將對象和機器都放置到同一個hash環(huán)后,在hash環(huán)上順時針查找距離這個對象的hash值最近的機器,即是這個對象所屬的機器。

例如,對于對象o2,順序針找到最近的機器是c1,故機器c1會緩存對象o2。而機器c2則緩存o3,o4,機器c3則緩存對象o1。

在一致性Hash環(huán)上為對象選擇機器

圖6:在一致性Hash環(huán)上為對象選擇機器

處理機器增減的情況

對于線上的業(yè)務,增加或者減少一臺機器的部署是常有的事情。

例如,增加機器c4的部署并將機器c4加入到hash環(huán)的機器c3與c2之間。這時,只有機器c3與c4之間的對象需要重新分配新的機器。對于我們的例子,只有對象o4被重新分配到了c4,其他對象仍在原有機器上。如圖7所示:

增加機器后的一致性Hash環(huán)的結(jié)構(gòu)

圖7:增加機器后的一致性Hash環(huán)的結(jié)構(gòu)

如上文前面所述,使用簡單的求模方法,當新添加機器后會導致大部分緩存失效的情況,使用一致性hash算法后這種情況則會得到大大的改善。前面提到3臺機器變成4臺機器后,緩存***率只有25%(不***率75%)。而使用一致性hash算法,理想情況下緩存***率則有75%,而且,隨著機器規(guī)模的增加,***率會進一步提高,99臺機器增加一臺后,***率達到99%,這大大減輕了增加緩存機器帶來的數(shù)據(jù)庫訪問的壓力。

再例如,將機器c1下線(當然,也有可能是機器c1宕機),這時,只有原有被分配到機器c1對象需要被重新分配到新的機器。對于我們的例子,只有對象o2被重新分配到機器c3,其他對象仍在原有機器上。如圖8所示:

減少機器后的一致性Hash環(huán)的結(jié)構(gòu)

圖8:減少機器后的一致性Hash環(huán)的結(jié)構(gòu)

虛擬節(jié)點

上面提到的過程基本上就是一致性hash的基本原理了,不過還有一個小小的問題。新加入的機器c4只分擔了機器c2的負載,機器c1與c3的負載并沒有因為機器c4的加入而減少負載壓力。如果4臺機器的性能是一樣的,那么這種結(jié)果并不是我們想要的。

為此,我們引入虛擬節(jié)點來解決負載不均衡的問題。

將每臺物理機器虛擬為一組虛擬機器,將虛擬機器放置到hash環(huán)上,如果需要確定對象的機器,先確定對象的虛擬機器,再由虛擬機器確定物理機器。

說得有點復雜,其實過程也很簡單。

還是使用上面的例子,假如開始時存在緩存機器c1,c2,c3,對于每個緩存機器,都有3個虛擬節(jié)點對應,其一致性hash環(huán)結(jié)構(gòu)如圖9所示:

機器c1,c2,c3的一致性Hash環(huán)結(jié)構(gòu)

圖9:機器c1,c2,c3的一致性Hash環(huán)結(jié)構(gòu)

假設對于對象o1,其對應的虛擬節(jié)點為c11,而虛擬節(jié)點c11對象緩存機器c1,故對象o1被分配到機器c1中。

新加入緩存機器c4,其對應的虛擬節(jié)點為c41,c42,c43,將這三個虛擬節(jié)點添加到hash環(huán)中,得到的hash環(huán)結(jié)構(gòu)如圖10所示:

機器c1,c2,c3,c4的一致性Hash環(huán)結(jié)構(gòu)

圖10:機器c1,c2,c3,c4的一致性Hash環(huán)結(jié)構(gòu)

新加入的緩存機器c4對應一組虛擬節(jié)點c41,c42,c43,加入到hash環(huán)后,影響的虛擬節(jié)點包括c31,c22,c11(順時針查找到***個節(jié)點),而這3個虛擬節(jié)點分別對應機器c3,c2,c1。即新加入的一臺機器,同時影響到原有的3臺機器。理想情況下,新加入的機器平等地分擔了原有機器的負載,這正是虛擬節(jié)點帶來的好處。而且新加入機器c4后,只影響25%(1/4)對象分配,也就是說,***率仍然有75%,這跟沒有使用虛擬節(jié)點的一致性hash算法得到的結(jié)果是相同的。

總結(jié)

一致性hash算法解決了分布式環(huán)境下機器增加或者減少時,簡單的取模運算無法獲取較高***率的問題。通過虛擬節(jié)點的使用,一致性hash算法可以均勻分擔機器的負載,使得這一算法更具現(xiàn)實的意義。正因如此,一致性hash算法被廣泛應用于分布式系統(tǒng)中。

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2022-03-22 09:54:22

Hash算法

2020-09-10 16:50:32

mysqldump數(shù)據(jù)庫熱備

2022-11-10 07:49:09

hash算法代碼

2020-11-24 09:03:41

一致性MySQLMVCC

2021-05-19 21:50:46

Hash算法測試

2017-07-25 14:38:56

數(shù)據(jù)庫一致性非鎖定讀一致性鎖定讀

2024-04-10 10:34:34

Cache系統(tǒng)GPU

2016-02-15 10:46:40

JavaHash算法

2022-12-14 08:23:30

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數(shù)據(jù)

2021-11-12 08:38:26

一致性哈希算法數(shù)據(jù)結(jié)構(gòu)

2023-08-14 08:10:33

CPU緩存RFO

2021-06-30 21:13:49

CPUCache數(shù)據(jù)

2022-10-19 12:22:53

并發(fā)扣款一致性

2020-05-12 10:43:22

Redis緩存數(shù)據(jù)庫

2011-04-08 16:17:29

Hashing

2021-02-04 06:30:26

Python編程語言

2019-12-26 15:33:57

RedisHash架構(gòu)

2022-01-11 17:23:51

算法負載均衡Hash
點贊
收藏

51CTO技術(shù)棧公眾號