redis之分布式算法原理

????本文主要會圍繞,redis分布式算法的原理以及環(huán)境配置搭建票髓,和服務(wù)端客戶端啟動。我們會封裝一個分布式Shard Redis API铣耘,最后驗證一下Redis分布式環(huán)境驗證洽沟。另外會解釋一下,集群和分布式的概念蜗细。 ? (參考慕課geely課程:

來一波地址:https://coding.imooc.com/learn/list/162.html)?

? ? 一裆操、分布式算法原理

? ? 1.1傳統(tǒng)的分布式算法.

? ??原始的做法是對緩存項的鍵進行哈希,將hash后的結(jié)果對緩存服務(wù)器的數(shù)量進行取模操作炉媒,通過取模后的結(jié)果踪区,決定緩存項將會緩存在哪一臺服務(wù)器上。例如一個圖片選擇存哪臺服務(wù)器的一個過程吊骤,


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

? ? 這樣Hash取模的方式是有弊端的缎岗,就是在我們業(yè)務(wù)擴展的時候,新增服務(wù)器節(jié)點白粉,會導(dǎo)致一部分數(shù)據(jù)不能準確的在緩存服務(wù)器中找到传泊。換句話說鼠渺,當服務(wù)器數(shù)量發(fā)生變化的時候,所有緩存在一點時間內(nèi)是失效的眷细,當應(yīng)用無法從緩存中獲取數(shù)據(jù)時拦盹,則會向后端服務(wù)器請求數(shù)據(jù),造成了緩存的雪崩薪鹦,整個系統(tǒng)很有可能被壓垮掌敬,所以,我們應(yīng)該想辦法不讓這種糟糕的情況出現(xiàn)池磁,但是由于Hash算法本身的緣故奔害,使用取模法進行緩存時,這種情況是無法避免的地熄,為了解決這些問題而出現(xiàn)一致性哈希算法誕生华临。

????1.2Consistent hashing一致性算法原理

? ? 這和算法有一個環(huán)形hash空間的概念,通常hash算法都是將value映射在一個32位的key值當中端考,那么把數(shù)據(jù)首尾相接就會形成一個圓形雅潭,取值范圍為0 ~ 2^32-1,這個圓環(huán)就是環(huán)形hash空間却特。

hash環(huán)

我們來看如何把對象映射到環(huán)形hash空間:

? ? *只考慮4個對象Object1~Object4

? ? *首先通過hash函數(shù)計算出這四個對象的hash值key扶供,這些對象的hash值肯定是會落在上述中的環(huán)形hash空間范圍上的,對象的hash對應(yīng)的環(huán)形hash空間上的哪一個key值那么該對象就會映射到那個位置上裂明,這樣對象就映射到hash空間上

對象映射過程

????然后就是把cache映射到環(huán)形hash空間椿浓,cache就是我們redis服務(wù)器,采用跟對象一樣的hash算法闽晦。

redis服務(wù)器跟對象映射到hash環(huán)

????可以看到扳碍,Cache和Obejct都映射到這個環(huán)形hash空間中了,那么接下來要考慮的就是如何將object映射到cache中仙蛉。其實在這個環(huán)形hash空間進行一個順時針的計算即可笋敞,例如key1順時針遇到的第一個cache是cacheA,所以就將key1映射到cacheA中荠瘪,key2順時針遇到的第一個cache是cacheC夯巷,那么就將key2映射到cacheC中,以此類推哀墓。

object節(jié)點順時針映射到redis節(jié)點

????如果某一個cache被移除之后鞭莽,那么object會繼續(xù)順時針尋找下一個cache進行映射。例如麸祷,cacheB被移除了澎怒,映射在cacheB中的object4就會順時針往下找到cacheC,然后映射到cacheC上。

移除一個節(jié)點之后的變化

????所以當移除一個cacheB時所影響的object范圍就是cacheB與cacheA之間的那一段范圍喷面,這個范圍是比較小的星瘾。如下圖所標出的范圍:

受影響的范圍,相比較原始的分布式算法惧辈,影響范圍小很多

????而當增加一個cache節(jié)點時也是同理琳状,例如,在acheC和cacheB之間增加了一個cacheD節(jié)點盒齿,那么object2在順時針遇到的第一個cache就是cacheD念逞,此時就會將obejct2映射到cacheD中。如下圖:

新增redis節(jié)點

????同樣的边翁,增加cache節(jié)點所影響的范圍也就是cacheD和cacheB之間的那一段范圍翎承。如下圖所標出的范圍:

影響范圍較小

1.3Hash傾斜性

? ? 上面一致性hash算法分析的都很美好,我們假設(shè)了所有的cache節(jié)點都在環(huán)形hash空間上均勻分布符匾,但是很有可能會出現(xiàn)cache節(jié)點無法均勻分布在環(huán)形hash空間上叨咖。

cacheHahs之后分布到一側(cè)

????可以看到,A啊胶、B甸各、C節(jié)點都擠在了一塊,按順時針來計算焰坪,就會有大量的數(shù)據(jù)(object)映射到A節(jié)點上趣倾,從上圖中來看就會有一大半的數(shù)據(jù)都映射到A節(jié)點上,那么A節(jié)點所承載的數(shù)據(jù)壓力會十分大某饰,B儒恋、C節(jié)點則無法得到很好的利用,幾乎等同閑著沒事干露乏。這就是Hash傾斜性所導(dǎo)致的現(xiàn)象碧浊,無法保證在環(huán)形hash空間上絕對的分布均勻涂邀。

? ? 1.4虛擬節(jié)點

? ??為了解決Hash傾斜性的問題瘟仿,redis引入了虛擬節(jié)點的概念,虛擬節(jié)點相當于是實際節(jié)點的一個影子或者說分身比勉,而且虛擬節(jié)點一般都比實際節(jié)點的數(shù)量要多(可能一下多好幾百倍劳较,這個hash的環(huán)上都是密密麻麻的虛擬節(jié)點【默認的一個實際redis節(jié)點有160個虛擬節(jié)點,如果給redis實際節(jié)點配置了權(quán)重的話(默認權(quán)重是1)浩聋,那虛擬節(jié)點的個數(shù)就是權(quán)重*160】)观蜗。引入虛擬節(jié)點后,object不再直接映射到實際的cache節(jié)點中衣洁,而是先映射到虛擬節(jié)點中墓捻。然后虛擬節(jié)點會再進行一個hash計算,最后才映射到實際的cache節(jié)點中坊夫。所以虛擬節(jié)點就是對我們的實際節(jié)點進行一個放大砖第,如下圖:

淺色為虛擬節(jié)點撤卢,深色為實際節(jié)點

? ? 先把對象hash到虛擬節(jié)點上,在將虛擬節(jié)點重新hash到真是的redis節(jié)點上梧兼。如下圖所示:

虛擬節(jié)點hash的過程

? ? 1.5Consistent hashing命中率

? ? 命中率=(1 - n /(n+m))*100%(注釋: ? ? n = 現(xiàn)有的節(jié)點數(shù)量放吩;m = 新增的節(jié)點數(shù)量)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羽杰,隨后出現(xiàn)的幾起案子渡紫,更是在濱河造成了極大的恐慌,老刑警劉巖考赛,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惕澎,死亡現(xiàn)場離奇詭異,居然都是意外死亡欲虚,警方通過查閱死者的電腦和手機集灌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來复哆,“玉大人欣喧,你說我怎么就攤上這事√菡遥” “怎么了唆阿?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锈锤。 經(jīng)常有香客問我驯鳖,道長,這世上最難降的妖魔是什么久免? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任浅辙,我火速辦了婚禮,結(jié)果婚禮上阎姥,老公的妹妹穿的比我還像新娘记舆。我一直安慰自己,他們只是感情好呼巴,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布泽腮。 她就那樣靜靜地躺著,像睡著了一般衣赶。 火紅的嫁衣襯著肌膚如雪诊赊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天府瞄,我揣著相機與錄音碧磅,去河邊找鬼。 笑死,一個胖子當著我的面吹牛鲸郊,可吹牛的內(nèi)容都是我干的敲街。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼严望,長吁一口氣:“原來是場噩夢啊……” “哼多艇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起像吻,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峻黍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拨匆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姆涩,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年惭每,在試婚紗的時候發(fā)現(xiàn)自己被綠了骨饿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡台腥,死狀恐怖宏赘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黎侈,我是刑警寧澤察署,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站峻汉,受9級特大地震影響贴汪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜休吠,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一扳埂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘤礁,春花似錦阳懂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽克饶。三九已至酝蜒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矾湃,已是汗流浹背亡脑。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霉咨。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓蛙紫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親途戒。 傳聞我的和親對象是個殘疾皇子坑傅,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359