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>

        分布式鎖為什么要選擇Zookeeper而不是Redis?

        共 1585字,需瀏覽 4分鐘

         ·

        2021-05-26 17:02

        走過(guò)路過(guò)不要錯(cuò)過(guò)

        點(diǎn)擊藍(lán)字關(guān)注我們


        在分布式的應(yīng)用中,為了防止單點(diǎn)故障,保障高可用,通常會(huì)采用主從結(jié)構(gòu),當(dāng)主節(jié)點(diǎn)掛掉后,從節(jié)點(diǎn)可以代替主節(jié)點(diǎn)提供服務(wù)。

        Redis通過(guò)復(fù)制 + sentinel哨兵來(lái)實(shí)現(xiàn)主從模式。

        Zookeeper通過(guò)replicated mode復(fù)制模式來(lái)實(shí)現(xiàn)主從模式。

        單從結(jié)構(gòu)上看,Redis和Zookeeper都是主從架構(gòu),那Zookeeper的優(yōu)勢(shì)是什么?為什么要選擇Zookeeper?難道只是因?yàn)閆ookeeper是目錄結(jié)構(gòu),Redis是K-V結(jié)構(gòu)嗎?

        同步機(jī)制的不同

        Redis

        Redis在給從節(jié)點(diǎn)同步數(shù)據(jù)時(shí),正常情況是增量同步,也就是主節(jié)點(diǎn)的數(shù)據(jù)修改語(yǔ)句(DML)會(huì)異步的同步給從節(jié)點(diǎn)。Redis的數(shù)據(jù)同步?jīng)]有保障數(shù)據(jù)一致性的機(jī)制,也就是說(shuō),一條DML在主節(jié)點(diǎn)執(zhí)行成功時(shí),不能保障其他從節(jié)點(diǎn)成功執(zhí)行了這條數(shù)據(jù),這就會(huì)造成一個(gè)問(wèn)題,如果在數(shù)據(jù)沒(méi)有同步到從節(jié)點(diǎn)時(shí),主節(jié)點(diǎn)掛掉,就會(huì)產(chǎn)生數(shù)據(jù)丟失的情況。

        Zookeeper

        Zookeeper使用類paxos算法來(lái)保障數(shù)據(jù)的一致性。簡(jiǎn)單的講,當(dāng)一個(gè)DML語(yǔ)句發(fā)送給主節(jié)點(diǎn)時(shí),Zookeeper需要保證一半以上的節(jié)點(diǎn)接收到數(shù)據(jù),才會(huì)返回成功。并且當(dāng)主節(jié)點(diǎn)掛掉,從節(jié)點(diǎn)重新選舉時(shí),同步到最新的數(shù)據(jù)的節(jié)點(diǎn)會(huì)有優(yōu)先選舉權(quán)。

        舉個(gè)例子:

        一個(gè)4節(jié)點(diǎn)Zookeeper(A、B、C、D),A是主節(jié)點(diǎn),當(dāng)執(zhí)行一個(gè)create語(yǔ)句成功時(shí),至少有3臺(tái)節(jié)點(diǎn)執(zhí)行成功(一半以上),例如A、C、D成功。此時(shí)如果A節(jié)點(diǎn)掛了,B、C、D進(jìn)行選舉,由于C、D都執(zhí)行成功了create語(yǔ)句,B沒(méi)有執(zhí)行,C、D的數(shù)據(jù)更加新,具有優(yōu)先選舉權(quán),再根據(jù)名稱排序,選擇C做為主節(jié)點(diǎn)。在整個(gè)選舉過(guò)程中,服務(wù)不可用,選舉完成后,C節(jié)點(diǎn)和A節(jié)點(diǎn)數(shù)據(jù)一致,不會(huì)出現(xiàn)丟失的情況。

        分布式鎖

        要實(shí)現(xiàn)分布式鎖,需要滿足一些要求:

        1. 只能有一個(gè)服務(wù)的一個(gè)線程能獲取鎖

        2. 一個(gè)持有鎖的線程掛掉后,鎖應(yīng)該被釋放,用來(lái)給其他線程用

        3. 一個(gè)持有鎖的線程沒(méi)執(zhí)行完,鎖不能釋放

        4. 鎖釋放后,其他等待者可以繼續(xù)爭(zhēng)搶

        5. 管理鎖的主節(jié)點(diǎn)(Redis或Zookeeper)掛了,重新選舉后,不影響鎖的持有情況

        Redis解決方案

        問(wèn)題1、問(wèn)題2:使用“SET key value EX seconds NX”語(yǔ)句獲取鎖并設(shè)置過(guò)期時(shí)間

        問(wèn)題3:另開一個(gè)監(jiān)控線程,監(jiān)控主線程執(zhí)行情況,用來(lái)延長(zhǎng)過(guò)期時(shí)間

        問(wèn)題4:等待線程定時(shí)檢查鎖的持有情況

        問(wèn)題5:暫無(wú)或者解決成本很高,需要自己實(shí)現(xiàn)類paxos的算法

        Zookeeper解決方案

        通過(guò)創(chuàng)建臨時(shí)節(jié)點(diǎn)可以解決問(wèn)題1,2,3

        watch機(jī)制可以解決問(wèn)題4,并且相比定時(shí)檢查,watch可以做到更高實(shí)時(shí)性

        zookeeper的paxos同步機(jī)制保障了節(jié)點(diǎn)間數(shù)據(jù)一致性,即使主節(jié)點(diǎn)掛掉,也可以保障數(shù)據(jù)不丟,可以解決問(wèn)題5

        對(duì)比可以發(fā)現(xiàn):

        Zookeeper的機(jī)制可以保證分布式鎖實(shí)現(xiàn)業(yè)務(wù)代碼簡(jiǎn)單,成本低。

        Redis如果要解決分布式鎖的問(wèn)題,對(duì)于一些復(fù)雜的情況,很難解決,成本較高。




        往期精彩推薦



        騰訊、阿里、滴滴后臺(tái)面試題匯總總結(jié) — (含答案)

        面試:史上最全多線程面試題 !

        最新阿里內(nèi)推Java后端面試題

        JVM難學(xué)?那是因?yàn)槟銢](méi)認(rèn)真看完這篇文章


        END


        關(guān)注作者微信公眾號(hào) —《JAVA爛豬皮》


        了解更多java后端架構(gòu)知識(shí)以及最新面試寶典


        你點(diǎn)的每個(gè)好看,我都認(rèn)真當(dāng)成了


        看完本文記得給作者點(diǎn)贊+在看哦~~~大家的支持,是作者源源不斷出文的動(dòng)力


        作者:宇的季節(jié)

        出處:https://www.cnblogs.com/chenkeyu/p/14793627.html

        瀏覽 33
        點(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>
            亚洲精品午夜国产va久久成人 | 最新版天堂中文在线官网 | 粉嫩99久久久国产精品 | 国产视频一区二区四区 | 猛烈撞击灌满白浊花液h | 草草久久久亚洲AV成人 | 国产精品午夜福利视频 | 色色色网站 | 国产高潮女人叫床视频片 | 亚洲制服在线观看 |