ZooKeeper知識點總結

一、 從集中式到分佈式

1. 集中式

集中式特點:不用考慮網絡分區,宕機問題,協作問題。但是昂貴。

2. 分佈式

分佈式:由多臺機器通過網絡通信組成,多節點機器,分佈式,故障發生頻率大。 
故障原因:網絡問題,多臺機器網絡通信容易超時,中間有可能斷掉造成分區。 
網絡分區:俗稱腦裂。 
網絡的三態問題:要麼連接成功,要麼失敗,要麼超時。

所以分佈式主要是網絡方面和機器方面的問題,最大問題是網絡問題。

3. ACID

例如數據庫的事務

原子性:要麼成功,要麼失敗; 
一致性:如果出現異常數據,還是原來的那份 
隔離性:各個會話之間是相互獨立的 
持久性:就是提交後的數據永久保存在磁盤上,不丟失。

4. CAP

一致性:多臺機器擁有相同副本 
可用性:在適合的時間響應客戶端 
分區容錯性:不能出現網絡分區

5. BASE

分佈式主要的問題是網絡,所以我們優先處理分佈式的網絡,然後在一致性和可用性之間權衡。這時提出了BASE就是對CAP的一致性和可用性的權衡結果。 
BASE 基本可用,最終一致性

最終一致性:就是你提交一臺機器,其他機器最終會把你提交的那臺機器給同步到自己上。

二、 一致性

主的控制機器就叫協調者,副本機器叫參與者

1. 2PC

兩個階段,提交事務和執行事務。 
提交事務 
1). 詢問 
2).執行初始化(執行提交)

執行事務

2PC的故障情況 
單臺機器 
1. 協調者故障,那麼有個備用協調者接管,並且查詢參與者當前執行到什麼地步,然後接着執行下去。 
2. 參與者故障,那麼協調者會等待它重啓,然後再執行下去。

這兩種情況,都只會阻塞,並不會不一致性。

同時故障: 
協調者和參與者同時故障 
例如:有機器1,2,3,4。其中4是協調者,1,2,3是參與者 
4給1,2發完提交事務後故障了,正好3這個時候也故障了,注意這是3是沒有提交事務數據的。現在備用協調者啓動了,去詢問參與者,用於3死掉了,一直不知道它處於什麼狀態(接受了提交事務,還是反饋了能執行還是不能執行3個狀態)。 
面對這種情況,讓1,2迴歸停止事務,3恢復以後,不管是什麼狀態,直接停止事務,回滾,這樣子就保證了一致性。 
這是2PC的漏洞,當同時故障了,就全部回滾,效率低下,代價大

缺點

當協調者出錯,同時參與者也出錯時,兩階段無法保證事務執行的完整性。
考慮協調者再發出commit消息之後宕機,而唯一接收到這條消息的參與者同時也宕機了。那麼即使協調者通過選舉協議產生了新的協調者,這條事務的狀態也是不確定的,沒人知道事務是否被已經提交。

2. 3PC

2PC 當時只考慮如果單機故障的情況,並沒有考慮協調者和參與者同時故障的情況。3PC就是對2PC漏洞的補充協議。它把2PC中的提交事務請求一分爲二,添加了一個狀態(準備階段)。做到就算兩個同時故障也不阻塞,並且保證一致性。

事務詢問階段(can階段)

事務準備階段 (pre)(包括執行提交)

執行事務階段 (do commit)(將狀態更改)

下面例子分析: 
1. 4是協調者 ,1,2,3 是 參與者,當新聞的節點,協調者4和參與者3同時掛掉了。這時候備用的協調者啓動了,詢問了1和2的狀態,都在can階段,回滾代價下,直接回滾。當3重新啓動了發現自己是can階段,回滾代價下,執行回滾,停止事務。這樣子就擺在了3個節點數據一致性。3PC對應2PC就是減少回滾代價。

  1. 當3個參與者都進入到per準備階段,說明它們都接受到提交詢問,並且都表決過(意思是都領到了數據),這時協調者4和參與者3突然死掉了。備用協調起來後,詢問其他參與者狀態,一看都到pre階段了,說明都領到了數據包括死掉的3,因爲他表決過才進入到準備階段,所以他讓大家都提交了。當3重啓後,看了日誌,發現自己已經到準備階段時死掉了,可以執行提交,這樣保證了數據一致性。

3. paxos

有個叫paxos小島,他們每項 決定都得通過提議然後半數才能生效,每個決定的提議都有一個唯一的全局編號,這個編號只能自增長,不能後退。 
何爲通過:就是提議的id好要大於議員手記錄的最大的id

第一階段:提議者發起提議給每個議員,然後等議員反饋同意或不同意。

第二階段:如果半數以上同意了,則執行事務,否則不執行。

如果半數以上同意了,這個議題就通過,然後提議者就命令剩下的議員同步自己的數據,並修改手上的最大id好。

問題:在分佈式中併發是常見的,例如現在有提議者p1,p2 
提議者同時提出一個提議,這個時候他們手上的id就有可能是一樣,p1的id是3,p2的id也是3。當p1提議給議員(假設議員手上的id是2),現在議員先同意了p1,p2來訪問這個議員,議員告訴他已經同意了議題id是3,p2的id是3不同意。然後p2回去加大自己的id重新請求,議員這時同意了他。p1收到半數同意準備去通知他們來更新id同步數據,可是發現議員們的id比自己的大了,然後p1有加大id。這種極端情況,導致死鎖了。 
這種解決辦法就是提議者只有一個,也就是paxos裏面說的總統。

三、 zookeeper

1. 什麼是zookeeper

zookeeper是爲了解決分佈式一致性問題的工程應用

zookeeper並沒有直接用paxos協議,而是在paxos協議的基礎上,提出了符合自己符合實際應用場景的高可用的一致性協議ZAB原子廣播協議。

zookeeper分佈式一致性的特點:

  • 順序一致性:客戶端訪問zookeeper的一個節點,發起事務,是排着隊到leader那讓他發起提議,一個一個來;

  • 單一視圖:任何節點上的數據都是一樣的,所以客戶端訪問任意節點都看到是相同的數據。

  • 可靠性:給了一個客戶端反饋,同意他的請求,那麼就是真的同意了。

  • 實時性:zookeeper保證在一定時間內,比如5秒之後你可以訪問到最新數據。這是最終一致性導致的。

2. zookeeper設計目標

  • 簡單的數據模型:就是文件夾的樹形結構

  • 可以構建集羣

  • 順序訪問:客戶端提出了一個事務請求,會獲得一個唯一的id編號,用於操作的先後順序;

  • 高性能:這裏指的是讀取數據

3. zookeeper的幾個角色

zookeeper有幾個角色:leader、follower、observer;其中observer一般不配置,它也不參與投票,observer可以在不影響寫性能的情況下提升集羣的讀性能; 
zookeeper中節點有實體機器節點,還有znode數據節點。znode數據節點指的是目錄文件夾。數據節點有永久數據節點和臨時節點。

4. watcher監聽機制

zookeeper有watcher監聽機制,例如一個臨時數據節點,如果客戶session中斷了,臨時節點就刪除了,這時watcher就監聽到了。這點就是hadoop的HA實現機制,zkfc實現了zookeeper的watcher機制來自動切換。

5. zookeeper的權限

zookeeper的數據節點就是一個文件夾目錄,它有自己的權限機制ACL。 
實際zookeeper刪除、設置。創建目錄,這些就是執行權限。

四、 zab協議

1. zab 的三種狀態:

  1. Looking/election:系統剛啓動時或者Leader崩潰後正處於選舉狀態;

  2. Following:Follwoer節點所處的狀態,Follower與Leader處於數據同步階段;

  3. Leading:Leader所處狀態,當前集羣中有一個Leader爲主進程。

2. zab宏觀上的三個階段:

  1. 崩潰恢復

  2. 快速選舉

  3. 原子廣播

3. zab的微觀的四個階段:

  1. 選舉

  2. 發現

  3. 同步

  4. 廣播 
    客戶端提交一個請求到leader然後leader發起提議floower來投票,這個過程都是原子廣播

4. zab的節點狀態講解

  1. ZooKeeper啓動時所有節點初始狀態爲Looking,這時集羣會初始選舉出一個Leader節點,選舉出的Leader節點切換爲Leading狀態

  2. 當節點發現集羣中已經選舉出Leader則該節點會切換到Following 狀態,然後和Leader節點保持同步;

  3. 當Following節點與Leader失去聯繫時Follower節點則會切換到Looking狀態,開始新一輪選舉

  4. 在ZooKeeper的整個生命週期中每個節點都會在Looking、Following、Leading狀態間不斷轉換

當啓動後leader崩潰選舉

選舉出Leader節點後zab進入原子廣播階段,這是Leader爲和自己同步的每個節點Follower只能和一個Leader保持同步Leader節點與Follow節點使用心跳檢測來感知對方的存在;

當Leader節點在超時時間內收到來自Follower的心跳檢測,那Follower節點會一直與該節點保持連接;若超時時間內Leader沒有接收到來自過半Follower節點的心跳檢測或TCP連接斷開,那Leader會結束當前的領導,切換到Looking狀態,所有Follower節點也會放棄該Leader節點切換到Looking狀態,所有Follower節點也會放棄該Leader節點切換到Looking狀態,然後開始新一輪選舉;

5. 詳解zab四個階段:

  1. 第一階段:準備leader選舉 
    成爲leader的條件: 
    選epoch最大的; 
    epoch相等,選zxid最大的 
    epoch的zxid都相等,選擇server id最大的(就是配置zoo.cfg中的myid)。

節點在選舉開始讀默認投票給自己,當接收其他節點的選票是,會根據上面的條件更改自己的選票並重新發送選票給其他節點,但一個節點的得到票超過半數,該節點會設置自己的狀態leading,其他節點會設置自己的狀態爲following。

什麼是epoch,什麼是zxid? 
首先ZooKeeper一個事務包含兩部分,一個數數據,一個是id;id是全局唯一的id,數據就是具體操作數據,並且是lastid加1; 
ZooKeeper每個請求都是順序執行的,強順序性的; 
epoch是leader標識,zxid是事務標識。

epoch是指:年代,一個領導掛了,另一個領導上任,現在就是新領導的時代了,當產生新領導,事務編號就從0開始。

zxid是總稱:前32位是leader編號(epoch),後32位是這個leader下事務編號。

  1. 第二階段:發現階段 
    發現階段主要是發現最大的epoch和最大的事務編號; 
    之前說了快速產生準備leader,然後其他節點就是fllower,然後發現階段就是fllower向leader報告,自己的epoch和事務編號,然後leader排序,選擇最大的epoch和最大的事務編號。然後通知fllower去更改它的epoch。

  2. 第三階段:同步階段 
    leader利用上一個階段知道最大事務編號,然後通知其他fllower去leader這同步數據。事務編號有可能不一樣,所以要同步。保持數據最終一致性。

  3. 第四階段:原子廣播階段 
    這時候leader真正對外提供服務,接受客戶端的請求,生成一個數據,半數以上同意,然後就提交事務。剩下的其他節點直接去leader那同步數據。

原來掛掉的leader的事務?

它啓動起來,發現他的時代已經過時了,就刪除了事務,發現有心的leader,自己就變成fllower,然後就去同步數據。

在選舉上,會選舉擁有最新提議歷史(lastZxid最大)的節點作爲leader,這樣子就省去了發現最新提議的步驟。這是局域擁有最新提議的節點也有最新提交記錄的前提。

6. zab和paxos區別

paxos沒有給出leader選舉協議,只給出一致性協議。

五、 ZooKeeper在大數據中的應用場景

ZooKeeper 目錄有幾個特點,有臨時目錄,永久目錄,順序目錄,強一致性(順序訪問)和watcher機制。

利用這些特點,我們可以實現:

  • 發佈訂閱,例如一些配置信息;

  • 負載均衡,例如kafka生產,消費均衡;

  • master選舉,例如hbase利用它hmaster選舉;

  • 主備切換,例如hdfs的HA利用它進行切換。

1. 發佈訂閱

例如:我們的數據庫配置信息文件就可以放到ZooKeeper上。 
利用ZooKeeper的watcher機制實現配置變更,程序在運行中就可以獲取到最新的配置信息,不需要起停。

2. ZooKeeper HA應用(主備切換)

hdfs的HA,它的主備切換用的是ZooKeeper來做Active standby之間切換的。

大致步驟: 
1). 多個nodemanager同時向ZooKeeper註冊一個數據節點lock。因爲ZooKeeper是強一致性的,所以只能有一個註冊成功,註冊成功的那個就是active 
2). 沒有註冊成功的否成了standby,然後在lock目錄上註冊監聽事件watcher。 
注意:註冊的lock節點目錄是臨時節點,如果active掛了,這個目錄也就沒了,並且這個lock目錄是有權限控制的ACL,防止active假死後重新連接出現腦裂。 
3). 主備切換:當active掛掉以後,會話結束,臨時目錄自動刪除。其他standby監聽到臨時目錄刪除了,各個standby重新同時進行創建帶權限的臨時目錄。成功的改爲active,沒有成功的還是standby。 
4). 如果掛掉的active啓動後,發現沒有權限範圍lock臨時目錄,自動更改成standby狀態。

這是ZooKeeper主備切換應用,利用臨時目錄,ACL,watcher機制實現。

3. master選舉

利用ZooKeeper master選舉其實很簡單,和主備切換一樣。 
利用強一致性同時創建同一個目錄,最後只能一個成功。 
成功那個節點會返回成功狀態,其他節點返回異常,成功的那個就成爲master,其他節點就改成slave。

4. zookeeper在hbase中應用

hmaster監控regionserver是否掛掉。

首先,rs(regionserver簡稱)在ZooKeeper註冊一個臨時目錄rs/[hostname]目錄,然後hmaster註冊watcher監控rs目錄下面變化就可以發現rs服務器是否掛掉。

元數據存儲(訂閱發佈):每個region存儲信息位置和狀態,都放在ZooKeeper上存儲,以便大家都能訂閱目前region所處的狀態,比如region是在合併還是在切割,有多少個region分別在哪個regionserver上。所以客戶端訪問先訪問ZooKeeper得到位置信息去讀取數據,不經過hmaster。

5. ZooKeeper在kafka中應用

kafka在ZooKeeper註冊的信息

首先,kafka會把broker創建到ZooKeeper臨時目錄上。

/broker/ids/[1-n]表示broker還活着。然後topic信息創建到ZooKeeper臨時目錄。/brokers/topics/[topicname]/paritiong信息。如果有消費者,消費者也會在ZooKeeper創建自己消費信息的offset信息。等臨時目錄。

kafka註冊broker和topic信息使爲了生產消費時負載均衡,這就利用到ZooKeeper負載均衡。消費生產者監控到broker和topic,topic和partition之間的數量,進行重新排序。

 

https://blog.csdn.net/wenhui12345/article/details/78603201

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章