日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一文搞懂一致性hash的原理和实现

發(fā)布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文搞懂一致性hash的原理和实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在 go-zero 的分布式緩存系統(tǒng)分享里,Kevin 重點講到過一致性hash的原理和分布式緩存中的實踐。本文來詳細講講一致性hash的原理和在 go-zero 中的實現(xiàn)。

以存儲為例,在整個微服務(wù)系統(tǒng)中,我們的存儲不可能說只是一個單節(jié)點。

  • 一是為了提高穩(wěn)定,單節(jié)點宕機情況下,整個存儲就面臨服務(wù)不可用;

  • 二是數(shù)據(jù)容錯,同樣單節(jié)點數(shù)據(jù)物理損毀,而多節(jié)點情況下,節(jié)點有備份,除非互為備份的節(jié)點同時損毀。

那么問題來了,多節(jié)點情況下,數(shù)據(jù)應(yīng)該寫入哪個節(jié)點呢?

hash

所以本質(zhì)來講:我們需要一個可以將輸入值“壓縮”并轉(zhuǎn)成更小的值,這個值通常狀況下是唯一、格式極其緊湊的,比如uint64

  • 冪等:每次用同一個值去計算 hash 必須保證都能得到同一個值

這個就是 hash 算法完成的。

但是采取普通的 hash 算法進行路由,如:key % N 。有一個節(jié)點由于異常退出了集群或者是心跳異常,這時再進行 hash route ,會造成大量的數(shù)據(jù)重新 分發(fā)到不同的節(jié)點 。節(jié)點在接受新的請求時候,需要重新處理獲取數(shù)據(jù)的邏輯:如果是在緩存中,容易引起 緩存雪崩。

此時就需要引入 consistent hash 算法了。

consistent hash

我們來看看 consistent hash 是怎么解決這些問題的:

rehash

先解決大量 rehash 的問題:

如上圖,當加入一個新的節(jié)點時,影響的key只有 key31,新加入(剔除)節(jié)點后,只會影響該節(jié)點附近的數(shù)據(jù)。其他節(jié)點的數(shù)據(jù)不會收到影響,從而解決了節(jié)點變化的問題。

這個正是:單調(diào)性。這也是 normal hash 算法無法滿足分布式場景的原因。

數(shù)據(jù)傾斜

其實上圖可以看出:目前多數(shù)的key都集中在 node 1 上。如果當 node 數(shù)量比較少的情況下,可能引發(fā)多數(shù) key 集中在某個 node 上,監(jiān)控時發(fā)現(xiàn)的問題就是:節(jié)點之間負載不均。

為了解決這個問題,consistent hash 引入了 virtual node 的概念。

既然是負載不均,我們就人為地構(gòu)造一個均衡的場景出來,但是實際 node 只有這么多。所以就使用 virtual node 劃分區(qū)域,而實際服務(wù)的節(jié)點依然是之前的 node。

具體實現(xiàn)

先來看看 Get():

Get

先說說實現(xiàn)的原理:

  • 計算 key 的hash

  • 找到第一個匹配的 virtual node 的 index,并取到對應(yīng)的 h.keys[index] :virtual node hash 值

  • 對應(yīng)到這個 ring 中去尋找一個與之匹配的 actual node

  • 其實我們可以看到 ring 中獲取到的是一個 []node 。這是因為在計算 virtual node hash ,可能會發(fā)生hash沖突,不同的 virtual node hash 對應(yīng)到一個實際node。

    這也說明:node 與 virtual node 是一對多的關(guān)系。而里面的 ring 就是下面這個設(shè)計:

    這個其實也就表明了一致性hash的分配策略:

  • virtual node 作為值域劃分。key 去獲取 node ,從劃分依據(jù)上是以 virtual node 作為邊界

  • virtual node 通過 hash ,在對應(yīng)關(guān)系上保證了不同的 node 分配的key是大致均勻的。也就是 打散綁定

  • 加入一個新的 node,會對應(yīng)分配多個 virtual node。新節(jié)點可以負載多個原有節(jié)點的壓力,從全局看,較容易實現(xiàn)擴容時的負載均衡。

  • Add Node

    看完 Get 其實大致就知道整個一致性hash的設(shè)計:

    type?ConsistentHash?struct?{hashFunc?Func???????//?hash?函數(shù)replicas?int???????//?虛擬節(jié)點放大因子keys?????[]uint64?????//?存儲虛擬節(jié)點hashring?????map[uint64][]interface{}?????//?虛擬節(jié)點與實際node的對應(yīng)關(guān)系nodes????map[string]lang.PlaceholderType?//?實際節(jié)點存儲【便于快速查找,所以使用map】lock?????sync.RWMutex }

    好了這樣,基本的一個一致性hash就實現(xiàn)完備了。

    具體代碼:https://github.com/tal-tech/go-zero/blob/master/core/hash/consistenthash.go

    使用場景

    開頭其實就說了,一致性hash可以廣泛使用在分布式系統(tǒng)中:

  • 分布式緩存??梢栽?redis cluster 這種存儲系統(tǒng)上構(gòu)建一個 cache proxy,自由控制路由。而這個路由規(guī)則就可以使用一致性hash算法

  • 服務(wù)發(fā)現(xiàn)

  • 分布式調(diào)度任務(wù)

  • 以上這些分布式系統(tǒng)中,都可以在負載均衡模塊中使用。

    項目地址

    https://github.com/tal-tech/go-zero

    歡迎使用 go-zero 并 star 支持我們!

    總結(jié)

    以上是生活随笔為你收集整理的一文搞懂一致性hash的原理和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日本韩国一区二区三区 | 日本成人毛片 | 91成人在线看| 国精产品一区一区三区免费视频 | 亚洲日本精品 | 久久青青草视频 | 日本在线高清 | 国产免费av一区 | 亚洲女优视频 | 成人美女在线观看 | 欧美精品a区| 天天综合在线视频 | 亚洲欧美日韩久久精品 | 一区二区三区有限公司 | 天天网综合 | 亚洲综合精品一区 | 国产精品免费视频一区二区三区 | 齐天大性床战铁扇公主 | 午夜黄色小视频 | 日韩中文字幕网址 | 欧美videossex另类| 人妻丰满熟妇岳av无码区hd | 欧美wwwxxxx | www.午夜视频 | 亚洲一区二区自拍 | 激情二区| 国产一区二区三区小说 | 天堂网一区二区 | 免费精品在线观看 | 中文不卡在线 | 美女黄色免费网站 | 欧美性黄色 | 亚洲精品www久久久久久 | 亚洲最黄网站 | 日本欧美色 | 国产精品综合久久 | 极品美女一区二区三区 | 丰满岳乱妇在线观看中字无码 | 中文在线一区二区 | 91av中文字幕| av免播放器 | 操模特| 99久久精品国产一区二区成人 | 精品久久国产视频 | 精品久久91 | 亚洲成人免费电影 | 日韩一级不卡 | 国产欧美一区二区三区视频在线观看 | 日本久久久网站 | 射射综合网| 黄色三级片毛片 | 污片视频在线观看 | 精品国产一区二区在线 | 拍真实国产伦偷精品 | 欧美精品一级二级 | 日韩激情久久 | 意大利性荡欲xxxxxx | 国产一区二区欧美 | 色综合婷婷 | 天天干人人 | 青草草在线观看 | 美女极度色诱图片www视频 | 波多野结衣潜藏淫欲 | 亚洲欧美国产视频 | 青青青国产 | 中文字幕日韩精品亚洲一区小树林 | 青青草原在线免费观看视频 | 国产无遮挡裸体免费视频 | 多毛的亚洲人毛茸茸 | 91天堂网| 欧美日韩一区二区三区在线播放 | 人人妻人人玩人人澡人人爽 | 午夜一区 | 黑人巨大av | 亚洲人在线视频 | 久久久久久久久久久国产 | 永久免费快色 | 中文字幕精品无 | 黄色片视频播放 | 亚洲xxxxx| 一区二区精品 | 激情久久网 | 欧美一级片免费 | 午夜三级影院 | 日韩人成 | 三级小视频在线观看 | 日韩欧美一区二区三区四区 | av激情网站| 亚洲dvd | 不卡中文字幕在线 | 日本综合久久 | 一本大道av | 91丨九色丨蝌蚪丨老版 | 欧美午夜精品久久久久久人妖 | 国产精品无码专区av在线播放 | 校霸被c到爽夹震蛋上课高潮 | 天堂bt在线 | 国产精品日韩无码 | 99久久精品国产成人一区二区 |