zookpeer 和 redis 集群內一致性協議 及 選舉 對比


zookeeper 使用的是zab協議,類似 raft 的 Strong Leader 模式

redis 的哨兵 在  崩潰選舉的時候采用的是 raft的那一套term。

因為redis 采用的是異步數據副本的節點同步方式,所以在做分布式鎖的時候可能會存在 setNx之后,沒有同步到從節點,主節點崩潰,而這時客戶端又從從節點讀取數據,導致同步鎖設置失敗(寫入都是master節點)。當然作者提供了redLock 在時間內 挨個節點設置鎖的形式。具體意思及實現可以參考redssion中的。

反觀zk不會出現這個問題,因為zk的主節點節后到請求后,會保證各個從節點數據寫入完畢后,返回客戶端。

ZAB 協議的消息廣播過程使用的是一個原子廣播協議,類似一個 二階段提交過程。對於客戶端發送的寫請求,全部由 Leader 接收,Leader 將請求封裝成一個事務 Proposal,將其發送給所有 Follwer ,然后,根據所有 Follwer 的反饋,如果超過半數成功響應,則執行 commit 操作(先提交自己,再發送 commit 給所有 Follwer)。

當超過半數成功回應,則執行 commit ,同時提交自己。同時每個事物都有一個zxid 還有一個消息隊列 解決異步,同時,針對各個節點的數據不一致性問題還有選舉過程。

所以,在設置分布式鎖的時候需要考慮這點,當然是極高並發的情況下才會出現這種情況。那出現了,就是呵呵。

網上有人說zookpeer的數據一致性協議是從paxos中演化出來的,其實無論raft還是paxos,解決的業務場景都是一樣的。

在redis中的主從節點的數據同步應該是也是2PC,如果我沒記錯的話。

其實現在螞蟻也出了java辦的jraft工具包,但是這些很有意思的,不是嗎?

有兩篇我覺得寫的很好的,redis和zk的相關協議,也是我參考的。

 

寫的很垃圾,后期有,再寫,這三篇寫的都很好

zab協議:https://www.cnblogs.com/stateis0/p/9062133.html

redis 哨兵 選舉:http://weizijun.cn/2015/04/30/Raft%E5%8D%8F%E8%AE%AE%E5%AE%9E%E6%88%98%E4%B9%8BRedis%20Sentinel%E7%9A%84%E9%80%89%E4%B8%BELeader%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/

分布式鎖的 : http://weizijun.cn/2016/03/17/%E8%81%8A%E4%B8%80%E8%81%8A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E8%AE%BE%E8%AE%A1/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM