一致性哈希和哈希槽

1谣蠢、集群分片模式

如果 redis 只用復(fù)制功能做主從滑潘,那么當(dāng)數(shù)據(jù)量巨大的情況下垢乙,單機(jī)情況下可能已經(jīng)承受不下一份數(shù)據(jù),更不用說是主從都要各自保存一份完整的數(shù)據(jù)语卤。在這種情況下追逮,數(shù)據(jù)分片是一個非常好的解決辦法。

redis 的 custer 正是用于解決該問題粹舵。它主要提供兩個功能:

1钮孵、自動對數(shù)據(jù)分片,落到各個節(jié)點上

2眼滤、即使集群部分節(jié)點失效或者連接不上巴席,依然可以繼續(xù)處理命令

對于第二點,它的功能有點類似于 sentienl 的故障轉(zhuǎn)移诅需,在這里不細(xì)說漾唉。下面詳細(xì)了解下 redis 的槽位分片原理,在此之前堰塌,先了解下分布式簡單哈希算法和一致性哈希算法毡证,以幫助理解槽位的作用。

2蔫仙、簡單哈希算法

假設(shè)有三臺機(jī),數(shù)據(jù)落在哪臺機(jī)的算法為:

c = Hash(key) % 3

例如 key A 的哈希值為4丐箩,4 % 3 = 1摇邦,則落在第二臺機(jī)。Key ABC 哈希值為11屎勘,11 % 3 = 2施籍,則落在第三臺機(jī)上。

利用這樣的算法概漱,假設(shè)現(xiàn)在數(shù)據(jù)量太大了丑慎,需要增加一臺機(jī)器。A 原本落在第二臺上,現(xiàn)在根據(jù)算法4 % 4 = 0竿裂,落到了第一臺機(jī)器上了玉吁,但是第一臺機(jī)器上根本沒有 A 的值。這樣的算法會導(dǎo)致增加機(jī)器或減少機(jī)器的時候腻异,引起大量的緩存穿透进副,造成雪崩。

3悔常、一致性哈希算法

在1997年影斑,麻省理工學(xué)院的 Karger 等人提出了一致性哈希算法,為的就是解決分布式緩存的問題机打。

在一致性哈希算法中矫户,整個哈希空間是一個虛擬圓環(huán)残邀。

假設(shè)有四個節(jié)點 Node A皆辽、B、C罐旗、D膳汪,經(jīng)過 ip 地址的哈希計算,它們的位置如下:

有4個存儲對象 Object A九秀、B遗嗽、C、D鼓蜒,經(jīng)過對 Key 的哈希計算后痹换,它們的位置如下:

?對于各個 Object,它所真正的存儲位置是按順時針找到的第一個存儲節(jié)點都弹。例如 Object A 順時針找到的第一個節(jié)點是 Node A娇豫,所以 Node A 負(fù)責(zé)存儲 Object A,Object B 存儲在 Node B畅厢。

一致性哈希算法大概如此冯痢,那么它的容錯性和擴(kuò)展性如何呢?

假設(shè) Node C 節(jié)點掛掉了框杜,Object C 的存儲丟失浦楣,那么它順時針找到的最新節(jié)點是 Node D。也就是說 Node C 掛掉了咪辱,受影響僅僅包括 Node B 到 Node C 區(qū)間的數(shù)據(jù)振劳,并且這些數(shù)據(jù)會轉(zhuǎn)移到 Node D 進(jìn)行存儲。

?同理油狂,假設(shè)現(xiàn)在數(shù)據(jù)量大了历恐,需要增加一臺節(jié)點 Node X寸癌。Node X 的位置在 Node B 到 Node C 直接,那么受到影響的僅僅是 Node B 到 Node X 間的數(shù)據(jù)弱贼,它們要重新落到 Node X 上蒸苇。

所以一致性哈希算法對于容錯性和擴(kuò)展性有非常好的支持。但一致性哈希算法也有一個嚴(yán)重的問題哮洽,就是數(shù)據(jù)傾斜填渠。

如果在分片的集群中,節(jié)點太少鸟辅,并且分布不均氛什,一致性哈希算法就會出現(xiàn)部分節(jié)點數(shù)據(jù)太多,部分節(jié)點數(shù)據(jù)太少匪凉。也就是說無法控制節(jié)點存儲數(shù)據(jù)的分配枪眉。如下圖,大部分?jǐn)?shù)據(jù)都在 A 上了再层,B 的數(shù)據(jù)比較少贸铜。

4、哈希槽

redis 集群(cluster)并沒有選用上面一致性哈希聂受,而是采用了哈希槽(slot)的這種概念蒿秦。主要的原因就是上面所說的,一致性哈希算法對于數(shù)據(jù)分布蛋济、節(jié)點位置的控制并不是很友好棍鳖。

首先哈希槽其實是兩個概念,第一個是哈希算法碗旅。redis cluster 的 hash 算法不是簡單的 hash()渡处,而是 crc16 算法,一種校驗算法祟辟。另外一個就是槽位的概念医瘫,空間分配的規(guī)則。其實哈希槽的本質(zhì)和一致性哈希算法非常相似旧困,不同點就是對于哈洗挤荩空間的定義。一致性哈希的空間是一個圓環(huán)吼具,節(jié)點分布是基于圓環(huán)的被芳,無法很好的控制數(shù)據(jù)分布。而 redis cluster 的槽位空間是自定義分配的馍悟,類似于 windows 盤分區(qū)的概念。這種分區(qū)是可以自定義大小剩晴,自定義位置的锣咒。

redis cluster 包含了16384個哈希槽侵状,每個 key 通過計算后都會落在具體一個槽位上,而這個槽位是屬于哪個存儲節(jié)點的毅整,則由用戶自己定義分配趣兄。例如機(jī)器硬盤小的,可以分配少一點槽位悼嫉,硬盤大的可以分配多一點艇潭。如果節(jié)點硬盤都差不多則可以平均分配。所以哈希槽這種概念很好地解決了一致性哈希的弊端戏蔑。

另外在容錯性和擴(kuò)展性上蹋凝,表象與一致性哈希一樣,都是對受影響的數(shù)據(jù)進(jìn)行轉(zhuǎn)移总棵。而哈希槽本質(zhì)上是對槽位的轉(zhuǎn)移鳍寂,把故障節(jié)點負(fù)責(zé)的槽位轉(zhuǎn)移到其他正常的節(jié)點上。擴(kuò)展節(jié)點也是一樣情龄,把其他節(jié)點上的槽位轉(zhuǎn)移到新的節(jié)點上迄汛。

但一定要注意的是,對于槽位的轉(zhuǎn)移和分派骤视,redis 集群是不會自動進(jìn)行的鞍爱,而是需要人工配置的。所以 redis 集群的高可用是依賴于節(jié)點的主從復(fù)制與主從間的自動故障轉(zhuǎn)移专酗。

轉(zhuǎn)自:https://zackku.com/redis-cluster/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睹逃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笼裳,更是在濱河造成了極大的恐慌唯卖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躬柬,死亡現(xiàn)場離奇詭異拜轨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)允青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門橄碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颠锉,你說我怎么就攤上這事法牲。” “怎么了琼掠?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵拒垃,是天一觀的道長。 經(jīng)常有香客問我瓷蛙,道長悼瓮,這世上最難降的妖魔是什么戈毒? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮横堡,結(jié)果婚禮上埋市,老公的妹妹穿的比我還像新娘。我一直安慰自己命贴,他們只是感情好道宅,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胸蛛,像睡著了一般污茵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胚泌,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天驶俊,我揣著相機(jī)與錄音压真,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛压状,可吹牛的內(nèi)容都是我干的弊添。 我是一名探鬼主播夫壁,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼三椿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了津肛?” 一聲冷哼從身側(cè)響起章喉,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎身坐,沒想到半個月后秸脱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡部蛇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年摊唇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯鲁。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巷查,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抹腿,到底是詐尸還是另有隱情岛请,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布警绩,位于F島的核電站崇败,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肩祥。R本人自食惡果不足惜僚匆,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一微渠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咧擂,春花似錦、人聲如沸檀蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俯逾。三九已至贸桶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桌肴,已是汗流浹背皇筛。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留坠七,地道東北人水醋。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像彪置,于是被迫代替她去往敵國和親拄踪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348