Redis分布式算法原理

傳統(tǒng)分布式算法

傳統(tǒng)的分布式算法通常是采用hash取模的方式來處理數(shù)據(jù)與服務器節(jié)點的映射關系店展。

舉個栗子

假設有個圖片為test.jpg榛瓮,現(xiàn)在有3個服務器,我們稱之為0服務器七冲、1服務器背镇、2服務器。首先我們對這張圖片進行hash丰刊,可以拿到一個散列值隘谣,用散列值對3進行取模,取模結果為0或者1或者2啄巧。如果結果是0則將圖片存入0服務器節(jié)點上寻歧,如果是1則存入1服務器節(jié)點掌栅,如果是2則存入2服務器節(jié)點。

按照上述的方式熄求,此時假設我們有4個redis節(jié)點渣玲,分別是redis0、redis1弟晚、redis2忘衍、redis3。有20個數(shù)據(jù)卿城,這20個數(shù)據(jù)的hash結果分別為1-20枚钓。然后對4進行取模,取模的結果就是對應數(shù)據(jù)存儲的redis節(jié)點瑟押。最終數(shù)據(jù)的分配情況如圖所示搀捷。

項目運行時我們發(fā)現(xiàn)redis節(jié)點不夠用了,所以新增了一個節(jié)點多望,或者是說發(fā)現(xiàn)redis集群負載非常低嫩舟,我們可以刪除一個節(jié)點來節(jié)省資源。現(xiàn)在的場景是增加了一個節(jié)點怀偷,我們重新將這20個數(shù)據(jù)進行取模放置到5個redis節(jié)點中家厌。
如圖,其中1椎工、2饭于、3、20這四個數(shù)據(jù)在4個redis節(jié)點和5個redis節(jié)點中存儲的服務器是一樣的维蒙。所以新增了一個redis節(jié)點之后還能獲取到這4個數(shù)據(jù)掰吕,因為存儲位置沒有發(fā)生變化。

結論

20個數(shù)據(jù)在新增了一個服務器節(jié)點后只有4個數(shù)據(jù)命中颅痊,命中率是:4/20 = 20%殖熟。
當然這里只是舉例,實際生成環(huán)境數(shù)據(jù)量可能是百萬級斑响、千萬級吗讶,在實際的生產環(huán)境中可能對cache節(jié)點會有所調整,比如刪除一個cache節(jié)點恋捆,增加一個cache節(jié)點照皆。那么使用傳統(tǒng)的hash算法取模的方式將會對后臺服務器造成巨大的沖擊。很多緩存都沒有命中沸停,如果你的業(yè)務代碼是穿透型的膜毁,那就會穿過cache直擊db,很容易把數(shù)據(jù)庫搞垮。接下來就看一下Consistent hashing一致性算法的精髓所在瘟滨。

Consistent hashing

一致性hash算法候醒,Consistent hashing算法早在1997年就在論文《Consistent hashing and random trees》提出。
設計目標是為了解決因特網(wǎng)中的熱點(Hot spot)問題杂瘸,現(xiàn)在一致性hash算法在分布式系統(tǒng)中也得到了廣泛應用倒淫。

環(huán)形hash空間

通常hash算法都是將value映射在一個32位的key值當中。而一致性哈希則將整個哈希值空間組織成一個虛擬的圓環(huán)败玉,取值范圍是從0-2^32-1(即哈希值是一個32位無符號整形)敌土。

把對象映射到hash空間

這里的對象就是我們真實存儲的數(shù)據(jù),以4個為例运翼,分別為object1~object4返干。通過hash函數(shù)計算出hash值,分別為key1~key4血淌,這四個值肯定會落在環(huán)形hash空間上矩欠。

把cache映射到hash空間

基本思想就是將對象和cache都映射到同一個hash數(shù)值空間中,并且使用相同的hash算法悠夯。即hash(cache A)=key A;
cache就是實際的緩存服務器節(jié)點癌淮,以3個為例,對cache的hash計算一般的方法可以使用cache的機器的IP地址或者機器名作為hash輸入沦补,也可以引入更多的因子乳蓄,比如端口號等。最終cache通過同一個hash算法也落在對象所在的相同的環(huán)形hash空間上策彤。

把對象映射到cache

接下來就是要考慮如何把對象映射到cache上栓袖,具體的做法就是找到對象所在環(huán)形空間的位置匣摘,順時針出發(fā)店诗,碰到的第一個cache節(jié)點就作為該對象的存儲節(jié)點。因為對象的hash和cache的hash都是固定的音榜,因此某個對象存儲的cache必然是唯一并且確定的庞瘸。這樣就找到了數(shù)據(jù)映射到cache的一個方案(如圖虛線箭頭所示)。

移除Cache

在實際的生產環(huán)境中通常對cache節(jié)點會有所調整赠叼,我們來看下一致性哈希算法是如何處理的擦囊。
比如我們移除cache B,此時只有object4無法命中嘴办,但是還是可以通過這個算法繼續(xù)找到新的cache節(jié)點cache C瞬场,object4就會存儲到cache C上。所以對于移除cache B來說涧郊,它影響的范圍僅僅是它和逆時針到達的第一個cahce節(jié)點即cache A之間的數(shù)據(jù)(如圖所示的透明區(qū)域)贯被,對于環(huán)形的其他數(shù)據(jù)節(jié)點都不會影響,影響范圍是非常小的。

添加Cache

比如我們在cache B和cache C之間新增了一個cache D彤灶,相應的object2就得更換存儲的cache節(jié)點看幼,連接到了新的cache D上。對于添加的cache D其影響的范圍是它和逆時針到達的第一個cahce節(jié)點即cache B之間的數(shù)據(jù)(如圖所示的透明區(qū)域)幌陕。
所以對于cache變動诵姜,無論是添加cache節(jié)點還是刪除cache節(jié)點,它影響的范圍都是很小的搏熄。當然這里還有優(yōu)化的空間棚唆。

理想與現(xiàn)實

理想非常豐滿,現(xiàn)實非常骨感搬卒。左圖就是理想中的情況瑟俭,A、B契邀、C節(jié)點分布的非常均勻摆寄。而現(xiàn)實呢有可能是右圖這樣,顯然大量的數(shù)據(jù)都會落在A節(jié)點上坯门,B和C節(jié)點存儲的數(shù)據(jù)會較少微饥,如果考慮隨機性而言的話。這樣會導致A節(jié)點服務器很忙古戴,負載很高欠橘,而B、C比較清閑现恼。這是由于hash的傾斜性導致的肃续。

Hash傾斜性

假設有6個數(shù)據(jù),它們是隨機均勻分布在環(huán)形hash空間上叉袍,而cache的分布則比較緊密始锚。那么根據(jù)這個算法規(guī)則數(shù)據(jù)1、2喳逛、3瞧捌、4、6則都是存儲在A節(jié)點上润文,5存儲在B節(jié)點上姐呐,C節(jié)點沒有數(shù)據(jù)。這就是hash傾斜性典蝌。hash傾斜性導致了A曙砂、B、C這三個節(jié)點負載骏掀、性能都不均勻鸠澈。

虛擬節(jié)點

為了解決hash傾斜性帶來的問題乔夯,在這個算法中就引入了虛擬節(jié)點。來看一下虛擬節(jié)點的算法原理款侵。
假設有兩個數(shù)據(jù)object1和object2末荐,對它們進行hash,我們增加了6個虛擬節(jié)點分別為v1~v6新锈,兩個對象hash之后分別落到了v2和v5虛擬節(jié)點上甲脏,然后對虛擬節(jié)點進行rehash,此時v1妹笆、v2映射到了N1這個真實節(jié)點上块请,v3、v4映射到了N2節(jié)點上拳缠,v5墩新、v6映射到了N3節(jié)點上。通過虛擬節(jié)點把真實的服務器節(jié)點進行放大窟坐,最終object1存儲到了N1節(jié)點上海渊,object2存在了N3節(jié)點上。
其工作原理就是將一個物理節(jié)點拆分為多個虛擬節(jié)點哲鸳,并且同一個物理節(jié)點的虛擬節(jié)點盡量均勻分布在Hash環(huán)上臣疑。通過虛擬節(jié)點就解決了服務節(jié)點少時數(shù)據(jù)傾斜的問題。

解決hash傾斜性

引入了虛擬節(jié)點后徙菠,對hash傾斜性的解決方案是怎樣的呢讯沈?
比如我們增加了6個虛擬節(jié)點,這6個虛擬節(jié)點最終映射到了3臺真實的cache節(jié)點婿奔,如圖所示缺狠。我們對數(shù)據(jù)進行hash后落在了環(huán)形空間上,通過算法規(guī)則最終1萍摊、3數(shù)據(jù)落在A上挤茄,4、5落在B上记餐,2驮樊、6落在C節(jié)點上薇正。 相對均勻了一些片酝。
但是虛擬節(jié)點在rehash時也存在hash傾斜性,我們可以通過調整虛擬節(jié)點的數(shù)量挖腰,把真實節(jié)點和虛擬節(jié)點分配一個良好的比例雕沿,可以想像真實節(jié)點和真實節(jié)點間都存在大量的虛擬節(jié)點,隨著節(jié)點越來越多元践,數(shù)據(jù)越來越多温鸽,那么分布會越來越均勻。并且在添加節(jié)點和刪除節(jié)點時影響也會降到最低坐榆。

命中率計算

命中率計算公式:(1-n/(n + m)) * 100%
n:服務器臺數(shù)
m:服務器變動臺數(shù)
可以看出當變動的服務器臺數(shù)越大疾渣,命中率就會越大篡诽。所以影響就會越來越小。隨著分布式集群不斷擴大時榴捡,這個算法的優(yōu)點就會很自然的迸發(fā)出來杈女。

總結

一致性哈希算法首先將整個哈希值空間(0-2^32-1)組織成一個虛擬的圓環(huán),然后將存儲對象進行hash吊圾,得到的值映射到圓環(huán)空間上达椰。然后使用相同的hash算法對cache服務器節(jié)點進行hash,并映射到相同的圓環(huán)上项乒。然后從數(shù)據(jù)映射到的位置開始順時針查找啰劲,將數(shù)據(jù)保存到找到的第一個服務器節(jié)點上。
Consistent hashing已經最大限度的抑制了鍵的重新分布檀何,而且還可以采用虛擬節(jié)點的思想讓每個實際節(jié)點都配置100-500個虛擬節(jié)點蝇裤,這樣就能抑制分布不均勻了。同時這個算法已經最大限度的減小了服務器增減時的緩存重新分布频鉴。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末猖辫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砚殿,更是在濱河造成了極大的恐慌啃憎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件似炎,死亡現(xiàn)場離奇詭異辛萍,居然都是意外死亡,警方通過查閱死者的電腦和手機羡藐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門贩毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仆嗦,你說我怎么就攤上這事辉阶。” “怎么了瘩扼?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵谆甜,是天一觀的道長。 經常有香客問我集绰,道長规辱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任栽燕,我火速辦了婚禮罕袋,結果婚禮上改淑,老公的妹妹穿的比我還像新娘。我一直安慰自己浴讯,他們只是感情好朵夏,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榆纽,像睡著了一般侍郭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掠河,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天亮元,我揣著相機與錄音,去河邊找鬼唠摹。 笑死爆捞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的勾拉。 我是一名探鬼主播煮甥,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藕赞!你這毒婦竟也來了成肘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斧蜕,失蹤者是張志新(化名)和其女友劉穎双霍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批销,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡洒闸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了均芽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丘逸。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掀宋,靈堂內的尸體忽然破棺而出深纲,到底是詐尸還是另有隱情,我是刑警寧澤劲妙,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布湃鹊,位于F島的核電站,受9級特大地震影響是趴,放射性物質發(fā)生泄漏涛舍。R本人自食惡果不足惜澄惊,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一唆途、第九天 我趴在偏房一處隱蔽的房頂上張望富雅。 院中可真熱鬧,春花似錦肛搬、人聲如沸没佑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛤奢。三九已至,卻和暖如春陶贼,著一層夾襖步出監(jiān)牢的瞬間啤贩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工拜秧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痹屹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓枉氮,卻偏偏與公主長得像志衍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子聊替,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容

  • 傳統(tǒng)分布式算法 如果有3個redis服務節(jié)點楼肪,分別是redis0,redis1惹悄,redis2 〈航校現(xiàn)在一個資源,對他...
    程豪_4090閱讀 1,612評論 0 3
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,938評論 2 89
  • feisky云計算泣港、虛擬化與Linux技術筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,855評論 0 5
  • 本文主要會圍繞象缀,redis分布式算法的原理以及環(huán)境配置搭建,和服務端客戶端啟動爷速。我們會封裝一個分布式Shard R...
    小超人愛小土豆閱讀 4,046評論 1 14
  • 分布式系統(tǒng)面臨的第一個問題就是數(shù)據(jù)分布央星,即將數(shù)據(jù)均勻地分布到多個存儲節(jié)點。另外惫东,為了保證可靠性和可用性莉给,需要將數(shù)據(jù)...
    olostin閱讀 4,578評論 2 26