1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        什么是一致性hash?

        共 1514字,需瀏覽 4分鐘

         ·

        2021-04-10 10:50

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          作者 |  barantt 

        來(lái)源 |  urlify.cn/zINJNr

        前言

        說(shuō)出來(lái)大家可能不相信,我昨天做夢(mèng)夢(mèng)到自己在面試,然后面試官問(wèn)了我這個(gè)問(wèn)題哈哈~然后我就打算按照自己的理解寫(xiě)一寫(xiě)。如果有寫(xiě)的不對(duì)的歡迎大家指正!

        直接開(kāi)始

        普通hash算法

        普通hash算法就是把存儲(chǔ)的key取hash然后再對(duì)節(jié)點(diǎn)數(shù)取模之后判斷key所在節(jié)點(diǎn)的位置,

        如上圖所示,假設(shè)現(xiàn)在有key1,key2,key3,key4四個(gè)key,通過(guò)上面說(shuō)的方法均勻分布在了這4個(gè)節(jié)點(diǎn)上面??瓷先シ浅ice~

        但是如果現(xiàn)在我們集群需要擴(kuò)容,增加一臺(tái)機(jī)器會(huì)發(fā)生啥?

        可以看到,由于現(xiàn)在增加了一臺(tái)機(jī)器,所以現(xiàn)在我們?nèi)∧5膶?duì)象由3變成了4。

        導(dǎo)致什么現(xiàn)象呢?假設(shè)我們的數(shù)據(jù)現(xiàn)在沒(méi)有遷移,那原來(lái)的key3和key4本來(lái)是分別在node0和node1上的,現(xiàn)在通過(guò)hash取模運(yùn)算之后卻是在node0和node3上,所以在數(shù)據(jù)不做遷移的情況下會(huì)導(dǎo)致原有的緩存會(huì)大量失效。然后這種大面積的數(shù)據(jù)遷移是非常麻煩的!

        這是擴(kuò)容導(dǎo)致的問(wèn)題,如果集群中的節(jié)點(diǎn)宕機(jī)呢?

        現(xiàn)在node2掛了,集群節(jié)點(diǎn)數(shù)量變成了2,對(duì)應(yīng)的key通過(guò)hash取模之后所在的節(jié)點(diǎn)也會(huì)變化。導(dǎo)致node2上面原有的key查詢不到,會(huì)直接查庫(kù)。其余的key,除了key1能正常查詢外,其他key全都失效了。這時(shí)不僅涉及到數(shù)據(jù)遷移還會(huì)導(dǎo)致緩存穿透。

        一致性hash

        一致性hash其實(shí)是普通取模hash算法的改良版,其hash計(jì)算方法沒(méi)有變化,但是hash空間發(fā)生了變化,由原來(lái)的線性的變成了環(huán)。緩存節(jié)點(diǎn)通過(guò)hash計(jì)算之后得到在hash環(huán)中的位置;key通過(guò)hash計(jì)算之后得到所在環(huán)的位置,然后順時(shí)針?lè)较蛘业降谝粋€(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)就是存放key的節(jié)點(diǎn)。

        來(lái)看看一致性hash是如何解決普通取模hash中擴(kuò)容和宕機(jī)的問(wèn)題的。

        假設(shè)現(xiàn)在我們?cè)黾恿艘粋€(gè)節(jié)點(diǎn)node3,原來(lái)的key1現(xiàn)在順時(shí)針找到了新增加node3,對(duì)其余的節(jié)點(diǎn)沒(méi)有任何影響。只需要將node0到node3之間的key遷移到新的節(jié)點(diǎn)即可。

        如果node2現(xiàn)在宕機(jī)了,那么原來(lái)的key2順時(shí)針找到的節(jié)點(diǎn)會(huì)變成node0,其余節(jié)點(diǎn)也沒(méi)有任何影響,只需要把node2上的key遷移到node0上即可。

        那這個(gè)一致性hash難道就沒(méi)有啥毛病了嘛?

        想一下,如果我們的節(jié)點(diǎn)數(shù)量很少,并且節(jié)點(diǎn)偏向一側(cè)會(huì)發(fā)生什么事情?

        可以看到很大一部分的key都會(huì)落在node0上,從而導(dǎo)致node0的壓力過(guò)大掛掉,node0掛掉之后數(shù)據(jù)同時(shí)又會(huì)向node1上轉(zhuǎn)移,node1又會(huì)掛掉,最終導(dǎo)致整個(gè)集群不可用!這就是數(shù)據(jù)傾斜的問(wèn)題,會(huì)引起節(jié)點(diǎn)雪崩。可想而知這個(gè)問(wèn)題會(huì)很?chē)?yán)重。

        一致性hash優(yōu)化

        數(shù)據(jù)傾斜的問(wèn)題是通過(guò)虛擬節(jié)點(diǎn)來(lái)解決的。

        就是在節(jié)點(diǎn)稀疏的hash環(huán)上對(duì)物理節(jié)點(diǎn)虛擬出一部分虛擬節(jié)點(diǎn),key會(huì)打到虛擬節(jié)點(diǎn)上面,而虛擬節(jié)點(diǎn)上的key實(shí)際也是映射到物理節(jié)點(diǎn)上的,這樣就避免了數(shù)據(jù)傾斜導(dǎo)致單節(jié)點(diǎn)壓力過(guò)大導(dǎo)致節(jié)點(diǎn)雪崩的問(wèn)題。

        結(jié)語(yǔ)

        做夢(mèng)引起的一片博文。

        介紹了普通取模hash的弊端,一致性hash如何解決,以及一致性hash優(yōu)化的問(wèn)題。





        鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

        ??????

        ??長(zhǎng)按上方微信二維碼 2 秒





        感謝點(diǎn)贊支持下哈 

        瀏覽 40
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲成人性 | 成人无码A级毛片免费花嫁 | 《色戒》汤唯无删减版视频 | 精品无码人妻密桃视频 | 韩国美女一级囗交 | 国产精品探花AV无遮挡九色 | 五月丁香色婷婷七月在线视频 | 久久久久99精品国产片 | 一级黄片学生妹 | 人人草超碰 |