zoo 詳細學習

2021-09-05 12:50:47 字數 2408 閱讀 7912

leader是zookeeper集群的核心。

事務請求的唯一排程者和處理者,保證集群事務處理的順序性

集群內部各個伺服器的排程者

處理客戶端非事務請求,以及**事務請求給leader伺服器

參與事務請求提議(proposal)的投票(客戶端的乙個事務請求,需要半數伺服器投票通過以後才能通知leader commit; leader會發起乙個提案,要求follower投票)

參與leader選舉的投票

觀察zookeeper集群中最新狀態的變化並將這些狀態同步到observer伺服器上

增加observer不影響集群中事務處理能力,同時還能提公升集群的非事務處理能力

zookeeper一般是由 2n+1臺伺服器組成, 一般需要一半以上的幾點就可成功所以5,和6是一樣的所以2n+1

leaderelection/authfastleaderelection/fastleaderelection

quorumpeer

startleaderelection

server

id :

在配置server集群的時候,給定伺服器的標識id(myid)

zxid  : 伺服器在執行時產生的資料id, zxid的值越大,表示資料越新

epoch

: 選舉的輪數

server的狀態:looking、 following、observering、leading

第一次初始化啟動的時候: looking

所有在集群中的server都會推薦自己為leader,然後把(

myid、zxid、epoch

)作為廣播資訊,廣播給集群中的其他server

, 然後等待其他伺服器返回

每個伺服器都會接收來自集群中的其他伺服器的投票。集群中的每個伺服器在接受到投票後,開始判斷投票的有效性

判斷邏輯時鐘(epoch) ,如果epoch大於自己當前的epoch,說明自己儲存的epoch是過期。更新epoch,同時clear其他伺服器傳送過來的選舉資料。判斷是否需要更新當前自己的選舉情況

如果epoch小於目前的epoch,說明對方的epoch過期了,也就意味著對方伺服器的選舉輪數是過期的。這個時候,只需要講自己的資訊傳送給對方

圖示

拜占庭問題

paxos協議主要就是如何保證在分布式環網路環境下,各個伺服器如何達成一致最終保證資料的一致性問題

zab協議,基於paxos協議的乙個改進。

zab協議為分布式協調服務zookeeper專門設計的一種支援崩潰恢復的原子廣播協議

zookeeper並沒有完全採用paxos演算法, 而是採用zab zookeeper atomic broadcast

zab協議的原理

在zookeeper 的主備模式下,通過zab協議來保證集群中各個副本資料的一致性

zookeeper使用的是單一的主程序來接收並處理所有的事務請求,並採用zab協議,

把資料的狀態變更以事務請求的形式廣播到其他的節點

zab協議在主備模型架構中,保證了同一時刻只能有乙個主程序來廣播伺服器的狀態變更

所有的事務請求必須由全域性唯一的伺服器來協調處理,這個的伺服器叫leader,其他的叫follower

leader節點主要負責把客戶端的事務請求轉化成乙個事務提議(proposal),並分發給集群中的所有follower節點

再等待所有follower節點的反饋。一旦超過半數伺服器進行了正確的反饋,那麼leader就會commit這條訊息

崩潰恢復

原子廣播

什麼情況下zab協議會進入崩潰恢復模式

當伺服器啟動時

當leader伺服器出現網路中斷、崩潰或者重啟的情況

集群中已經不存在過半的伺服器與該leader保持正常通訊

zab協議進入崩潰恢復模式會做什麼

當leader出現問題,zab協議進入崩潰恢復模式,並且選舉出新的leader。當新的leader選舉出來以後,如果集群中已經有過半機器完成了leader伺服器的狀態同(資料同步),退出崩潰恢復,進入訊息廣播模式

當新的機器加入到集群中的時候,如果已經存在leader伺服器,那麼新加入的伺服器就會自覺進入資料恢復模式,找到leader進行資料同步

假設乙個事務在leader伺服器被提交了,並且已經有過半的follower返回了ack。 在leader節點把commit訊息傳送給folower機器之前

leader伺服器掛了怎麼辦

zab協議,一定需要保證已經被leader提交的事務也能夠被所有follower提交

zab協議需要保證,在崩潰恢復過程中跳過哪些已經被丟棄的事務

git詳細學習

git config global user.name 你的名字 git config global user.email 怎麼聯絡你 git init git初始化,生成.git資料夾 隱藏目錄,記錄你的操作 git status 檢視狀態 git add 檔名 把檔案提交到暫存區 或者是 直接 ...

Block詳細學習

之前對block一知半解,知道用 block,weak等去解決問題,卻沒有去深究過,這篇文章是對學習block的總結 要看block轉換為c 原始碼,用下面的方法轉換 cd到.m所在資料夾,輸入clang rewrite objc m,就會在當前資料夾內自動生成對應的 cpp檔案,雙擊開啟即可 看下...

string 詳細學習

string s1 預設初始化,s1是乙個空字串 string s2 s1 s2是s1的副本 string s2 s1 等價於s2 s1 s2是s1的副本 string s3 value s3是字面值 value 的副本,除了字面值最後的那個空字元 string s3 value 與上面等價 str...