通俗理解ZooKeeper是如何保證資料一致性的

2021-08-17 07:27:15 字數 3765 閱讀 5104

zookeeper是個集群,內部有多個server,每個server都可以連線多個client,每個client都可以修改server中的資料

zookeeper可以保證每個server內的資料完全一致,是如何實現的呢?

答:資料一致性是靠

paxos

演算法保證的,paxos可以說是分布式一致性演算法的鼻祖,是zookeeper的基礎

paxos的基本思路:(

深入解讀zookeeper一致性原理

)假設有乙個社團,其中有團員、議員(決議小組成員)兩個角色

團員可以向議員申請提案來修改社團制度

議員坐在一起,拿出自己收到的提案,對每個提案進行投票表決,超過半數通過即可生效

為了秩序,規定每個提案都有編號id,按順序自增

每個議員都有乙個社團制度筆記本,上面記著所有社團制度,和最近處理的提案編號,初始為0

投票通過的規則:

新提案id 是否大於 議員本中的id,是議員舉手贊同

如果舉手人數大於議員人數的半數,即讓新提案生效

例如:剛開始,每個議員本子上的id都為0,現在有乙個議員拿出乙個提案:團費降為100元,這個提案的id自增為1

每個議員都和自己id對比,一看 1>0,舉手贊同,同時修改自己本中的id為1

發出提案的議員一看超過半數同意,就宣布:1號提案生效

然後所有議員都修改自己筆記本中的團費為100元

以後任何乙個團員諮詢任何乙個議員:"團費是多少?",議員可以直接開啟筆記本檢視,並回答:團費為100元

可能會有極端的情況,就是多個議員一起發出了提案,就是併發的情況

例如剛開始,每個議員本子上的編號都為0,現在有兩個議員(a和b)同時發出了提案,那麼根據自增規則,這兩個提案的編號都為1,但只會有乙個被先處理

假設a的提案在b的上面,議員們先處理a提案並通過了,這時,議員們的本子上的id已經變為了1,接下來處理b的提案,由於它的id是1,不大於議員本子上的id,b提案就被拒絕了,b議員需要重新發起提案

上面就是paxos的基本思路,對照zookeeper,對應關係就是:

團員 -client

議員 -server

議員的筆記本 -server中的資料

提案 -變更資料的請求

提案編號 -zxid(zookeeper transaction id)

提案生效 -執行變更資料的操作

zookeeper中還有乙個leader的概念,就是把發起提案的權利收緊了,以前是每個議員都可以發起提案,現在有了leader,大家就不要七嘴八舌了,先把提案都交給leader,由leader乙個個發起提案

paxos演算法就是通過投票、全域性編號機制,使同一時刻只有乙個寫操作被批准,同時併發的寫操作要去爭取選票,只有獲得過半數選票的寫操作才會被批准,所以永遠只會有乙個寫操作得到批准,其他的寫操作競爭失敗只好再發起一輪投票

1)一致性保證

zookeeper

是一種高效能、可擴充套件的服務。

zookeeper

的讀寫速度非常快,並且讀的速度要比寫的速度更快。另外,在進行讀操作的時候,

zookeeper

依然能夠為舊的資料提供服務。這些都是由於

zookeepe

所提供的一致性保證,它具有如下特點:

順序一致性

客戶端的更新順序與它們被傳送的順序相一致。

原子性更新操作要麼成功要麼失敗,沒有第三種結果。

單系統映象

無論客戶端連線到哪乙個伺服器,客戶端將看到相同的

zookeeper

檢視。可靠性

一旦乙個更新操作被應用,那麼在客戶端再次更新它之前,它的值將不會改變。。這個保證將會產生下面兩種結果:

1.如果客戶端成功地獲得了正確的返回**,那麼說明更新已經成果。如果不能夠獲得返回**(由於通訊錯誤、超時等等),那麼客戶端將不知道更新操作是否生效。

2.當從故障恢復的時候,任何客戶端能夠看到的執行成功的更新操作將不會被回滾。

實時性在特定的一段時間內,客戶端看到的系統需要被保證是實時的(在十幾秒的時間裡)。在此時間段內,任何系統的改變將被客戶端看到,或者被客戶端偵測到。

給予這些一致性保證,

zookeeper

更高階功能的設計與實現將會變得非常容易,例如:

leader

選舉、佇列以及可撤銷鎖等機制的實現。

2)leader選舉

zookeeper

需要在所有的服務(可以理解為伺服器)中選舉出乙個

leader

,然後讓這個

leader

來負責管理集群。此時,集群中的其它伺服器則成為此

leader

的follower

。並且,當

leader

故障的時候,需要

zookeeper

能夠快速地在

follower

中選舉出下乙個

leader

。這就是

zookeeper

的leader

機制,下面我們將簡單介紹在

zookeeper

中,leader

選舉(leader election

)是如何實現的。

此操作實現的核心思想是:首先建立乙個

ephemeral

目錄節點,例如「

/election

」。然後。每乙個

zookeeper

伺服器在此目錄下建立乙個

sequence|

ephemeral 

型別的節點,例如「

/election/n_

」。在sequence

標誌下,

zookeeper

將自動地為每乙個

zookeeper

伺服器分配乙個比前乙個分配的序號要大的序號。此時建立節點的

zookeeper

伺服器中擁有最小序號編號的伺服器將成為

leader

。在實際的操作中,還需要保障:當

leader

伺服器發生故障的時候,系統能夠快速地選出下乙個

zookeeper

伺服器作為

leader

。乙個簡單的解決方案是,讓所有的

follower

監視leader

所對應的節點。當

leader

發生故障時,

leader

所對應的臨時節點將會自動地被刪除,此操作將會觸發所有監視

leader

的伺服器的

watch

。這樣這些伺服器將會收到

leader

故障的訊息,並進而進行下一次的

leader

選舉操作。但是,這種操作將會導致「從眾效應」的發生,尤其當集群中伺服器眾多並且頻寬延遲比較大的時候,此種情況更為明顯。

在zookeeper

中,為了避免從眾效應的發生,它是這樣來實現的:每乙個

follower

對follower

集群中對應的比自己節點序號小一號的節點(也就是所有序號比自己小的節點中的序號最大的節點)設定乙個

watch

。只有當

follower

所設定的

watch

被觸發的時候,它才進行

leader

選舉操作,一般情況下它將成為集群中的下乙個

leader

。很明顯,此

leader

選舉操作的速度是很快的。因為,每一次

leader

選舉幾乎只涉及單個

follower

的操作。

如何通俗地理解什麼是 Python?

與 c 語言一樣,python 也是一門程式語言。但與 c 語言不同的是,python 是乙個物件導向的語言,而 c 語言則是乙個面向過程的語言。原來我一直都不知道什麼叫物件導向,什麼叫面向過程,直到最近才弄懂。簡單的說,如果你想要蓋個房子,從水泥到螺絲,從圖紙到磚頭都是由你乙個人親力親為,那麼這種...

redis通俗理解

一,redis是什麼 redis是一種支援key value等多種資料結構的儲存系統。可用於快取,事件發布或訂閱,高速佇列等場景。該資料庫使用ansi c語言編寫,支援網路,提供字串,雜湊,列表,佇列,集合結構直接訪問,基於記憶體,可持久化。二,支援的語言 三,redis的應用場景有哪些四,redi...

通俗理解HashMap

原理 hashmap是以key value鍵值對的形式存在著的,大致邏輯為進行put時,根據key值,進行hashing,生成hashcode,對應到bucket的位置然後在當前位置進行key value儲存。根據key值對應的每個字元的阿斯克碼的和再取模於的map長度得出的值都是固定的對應的下標值...