ZooKeeper系列(6):ZooKeeper的伸縮性和Observer角色


ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk

 


1.ZooKeeper中的角色

在比較老的ZooKeeper版本中,只有兩種角色:leader和follower。后來引入了一種新角色Observer,Observer角色除了不能投票(以及和投票相關的能力)外,其它和follower功能一樣。

所以,在ZooKeeper中:

  • 投票角色:leader、follower。
  • 無票角色:observer。

2.ZooKeeper如何處理請求?

ZooKeeper集群中的每個server都能為客戶端提供讀、寫服務。

對於客戶端的讀請求,server會直接從它本地的內存數據庫中取出數據返回給客戶端,這個過程不涉及其它任何操作,也不會聯系leader。

對於客戶端的寫請求,因為寫操作會修改znode的數據、狀態,所以必須要在ZooKeeper集群中進行協調。處理過程如下:

  1. 收到寫請求的那個server,首先將寫請求發送給leader
  2. leader收到來自follower(或observer)的寫請求后,首先計算這次寫操作之后的狀態,然后將這個寫請求轉換成帶有各種狀態的事務(如版本號、zxid等等)。
  3. leader將這個事務以提議的方式廣播出去(即發送proposal)。
  4. 所有follower收到proposal后,對這個提議進行投票,投票完成后返回ack給leader。follower的投票只有兩種方式:(1)確認這次提議表示同意;(2)丟棄這次提議表示不同意。
  5. leader收集投票結果,只要投票數量達到了大多數的要求(例如,5個節點的集群,3個或3個以上的節點才算大多數),這次提議就通過。
  6. 提議通過后,leader向所有server發送一個提交通知。
  7. 所有節點將這次事務寫入事務日志,並進行提交。
  8. 提交后,收到寫請求的那個server向客戶端返回成功信息。

下面是ZooKeeper集群處理寫請求過程的一個簡圖:

當ZooKeeper集群中follower的數量很多時,投票過程會成為一個性能瓶頸,為了解決投票造成的壓力,於是出現了observer角色。

observer角色不參與投票,它只是投票結果的"聽眾",除此之外,它和follower完全一樣,例如能接受讀、寫請求。就這一個特點,讓整個ZooKeeper集群性能大大改善。

和follower一樣,當observer收到客戶端的讀請求時,會直接從內存數據庫中取出數據返回給客戶端。

對於寫請求,當寫請求發送到某server上后,無論這個節點是follower還是observer,都會將它發送給leader。然后leader組織投票過程,所有server都收到這個proposal(包括observer,因為proposal是廣播出去的),但是leader和follower以及observer通過配置文件,都知道自己是不是observer以及誰是observer。自己是observer的server不參與投票。當leader收集完投票后,將那些observer的server去掉,在剩下的server中計算大多數,如果投票結果達到了大多數,這次寫事務就成功,於是leader通知所有的節點(包括observer),讓它們將事務寫入事務日志,並提交。

3.Observer的優點

observer角色除了減輕了投票的壓力,還帶來了幾個額外的優點。

1.提高了伸縮性。

伸縮性指的是通過添加服務器來負載請求,從而提高整個集群處理請求的能力。也就是"一頭牛拉不動了,找更多牛來拉"。

在出現Observer之前,ZooKeeper集群的伸縮性由follower來實現。雖然對於讀寫操作來說,follower是"無狀態"的,這使得添加新的follower到集群(或者從集群中減少follower)很方便,能提高ZooKeeper集群負載能力。但是,對於投票來說,follower是有狀態的,增、減follower的數量,都直接影響投票結果,特別是follower的數量越多,投票過程的性能就越差。

而observer無論是讀寫請求還是投票,都是無狀態的,增、減observer的數量不會影響投票結果。這樣就可以讓一部分server作為follower參與投票,另一部分作為observer單純地提供讀寫服務。這使得ZooKeeper的伸縮性大大提高。

2.部署跨地區的ZooKeeper數據中心更方便。

observer能直接從本地內存數據庫中取出數據來響應讀請求,所以提高了讀的吞吐量。對於寫請求,雖然它要發送給leader並接受leader的通知,但相比於投票過程中傳遞的信息,它的數據量很小,所以即使在廣域網也能有很好的性能。

實際上,很多跨機房、跨地區的數據中心就是通過observer來實現的。

4.如何配置Observer?

要配置observer,只需稍微修改一下配置文件即可。

首先,在想要成為observer的配置文件中,加上下面一行:

peerType=observer

這表示這個server以observer角色運行,即不參與投票。

再在所有 server的配置文件中,修改server.X配置項,在那些observer的節點上加上:observer后綴。

例如,server.1對應的server要作為observer:

server.1=IP:2181:3181:observer

這樣配置后,ZooKeeper集群中的所有服務器節點都知道哪些節點扮演的是observer角色。


免責聲明!

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



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