分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了
在分布式的應(yīng)用中,為了防止單點(diǎn)故障,保障高可用,通常會(huì)采用主從結(jié)構(gòu),當(dāng)主節(jié)點(diǎn)掛掉后,從節(jié)點(diǎn)可以代替主節(jié)點(diǎn)提供服務(wù)。
Redis通過復(fù)制 + sentinel哨兵來實(shí)現(xiàn)主從模式。
Zookeeper通過replicated mode復(fù)制模式來實(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ù)修改語句(DML)會(huì)異步的同步給從節(jié)點(diǎn)。Redis的數(shù)據(jù)同步?jīng)]有保障數(shù)據(jù)一致性的機(jī)制,也就是說,一條DML在主節(jié)點(diǎn)執(zhí)行成功時(shí),不能保障其他從節(jié)點(diǎn)成功執(zhí)行了這條數(shù)據(jù),這就會(huì)造成一個(gè)問題,如果在數(shù)據(jù)沒有同步到從節(jié)點(diǎn)時(shí),主節(jié)點(diǎn)掛掉,就會(huì)產(chǎn)生數(shù)據(jù)丟失的情況。
Zookeeper
Zookeeper使用類paxos算法來保障數(shù)據(jù)的一致性。簡(jiǎn)單的講,當(dāng)一個(gè)DML語句發(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語句成功時(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語句,B沒有執(zhí)行,C、D的數(shù)據(jù)更加新,具有優(yōu)先選舉權(quán),再根據(jù)名稱排序,選擇C做為主節(jié)點(diǎn)。在整個(gè)選舉過程中,服務(wù)不可用,選舉完成后,C節(jié)點(diǎn)和A節(jié)點(diǎn)數(shù)據(jù)一致,不會(huì)出現(xiàn)丟失的情況。
分布式鎖
要實(shí)現(xiàn)分布式鎖,需要滿足一些要求:
- 只能有一個(gè)服務(wù)的一個(gè)線程能獲取鎖
- 一個(gè)持有鎖的線程掛掉后,鎖應(yīng)該被釋放,用來給其他線程用
- 一個(gè)持有鎖的線程沒執(zhí)行完,鎖不能釋放
- 鎖釋放后,其他等待者可以繼續(xù)爭(zhēng)搶
- 管理鎖的主節(jié)點(diǎn)(Redis或Zookeeper)掛了,重新選舉后,不影響鎖的持有情況
Redis解決方案
問題1、問題2:使用“SET key value EX seconds NX”語句獲取鎖并設(shè)置過期時(shí)間
問題3:另開一個(gè)監(jiān)控線程,監(jiān)控主線程執(zhí)行情況,用來延長(zhǎng)過期時(shí)間
問題4:等待線程定時(shí)檢查鎖的持有情況
問題5:暫無或者解決成本很高,需要自己實(shí)現(xiàn)類paxos的算法
Zookeeper解決方案
通過創(chuàng)建臨時(shí)節(jié)點(diǎn)可以解決問題1,2,3
watch機(jī)制可以解決問題4,并且相比定時(shí)檢查,watch可以做到更高實(shí)時(shí)性
zookeeper的paxos同步機(jī)制保障了節(jié)點(diǎn)間數(shù)據(jù)一致性,即使主節(jié)點(diǎn)掛掉,也可以保障數(shù)據(jù)不丟,可以解決問題5
對(duì)比可以發(fā)現(xiàn):
Zookeeper的機(jī)制可以保證分布式鎖實(shí)現(xiàn)業(yè)務(wù)代碼簡(jiǎn)單,成本低。
Redis如果要解決分布式鎖的問題,對(duì)于一些復(fù)雜的情況,很難解決,成本較高。
以上就是分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了的詳細(xì)內(nèi)容,更多關(guān)于分布式鎖Zookeeper Redis的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot整合Redis實(shí)現(xiàn)訂單超時(shí)處理問題
這篇文章主要介紹了Spring Boot整合Redis實(shí)現(xiàn)訂單超時(shí)處理,通過這個(gè)基本的示例,你可以了解如何使用Spring Boot和Redis來處理訂單超時(shí)問題,并根據(jù)需要進(jìn)行擴(kuò)展和定制,需要的朋友可以參考下2023-11-11如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫存扣減
在日常開發(fā)中有很多地方都有類似扣減庫存的操作,本文主要介紹了如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫存扣減,具有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01odoo中使用redis實(shí)現(xiàn)緩存的步驟
這篇文章主要介紹了odoo中使用redis實(shí)現(xiàn)緩存的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04為什么RedisCluster設(shè)計(jì)成16384個(gè)槽
本文主要介紹了為什么RedisCluster設(shè)計(jì)成16384個(gè)槽,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07