ZooKeeper常見面試題

2021-08-10 01:22:28 字數 1753 閱讀 1700

zookeeper是什麼框架

分布式的、開源的分布式應用程式協調服務,原本是hadoop、hbase的乙個重要元件。它為分布式應用提供一致性服務的軟體,包括:配置維護、網域名稱服務、分布式同步、組服務等。

應用場景

zookeeper的功能很強大,應用場景很多,結合我實際工作中使用dubbo框架的情況,zookeeper主要是做註冊中心用。基於dubbo框架開發的提供者、消費者都向zookeeper註冊自己的url,消費者還能拿到並訂閱提供者的註冊url,以便在後續程式的執行中去呼叫提供者。而提供者發生了變動,也會通過zookeeper向訂閱的消費者傳送通知。

paxos演算法& zookeeper使用協議

paxos演算法是分布式選舉演算法,zookeeper使用的 zab協議(zookeeper原子廣播),二者有相同的地方,比如都有乙個leader,用來協調n個follower的執行;leader要等待超半數的follower做出正確反饋之後才進行提案;二者都有乙個值來代表leader的週期。

不同的地方在於:

zab用來構建高可用的分布式資料主備系統(zookeeper),paxos是用來構建分布式一致性狀態機系統。

paxos演算法、zab協議要想講清楚可不是一時半會的事兒,自2023年萊斯利·蘭伯特提出paxos演算法以來,因為晦澀難懂並沒有受到重視。後續幾年,蘭伯特通過好幾篇**對其進行更進一步地解釋,也直到06年谷歌發表了三篇**,選擇paxos作為chubby cell的一致性演算法,paxos才真正流行起來。

對於普通開發者來說,尤其是學習使用zookeeper的開發者明確一點就好:分布式zookeeper選舉leader伺服器的演算法與paxos有很深的關係。

選舉演算法和流程

詳情可參看我之前的文章《zookeeper集群安裝配置使用》第6節「zookeeper選舉機制」,有個簡單的描述。

zookeeper有哪幾種節點型別

持久:建立之後一直存在,除非有刪除操作,建立節點的客戶端會話失效也不影響此節點。

持久順序:跟持久一樣,就是父節點在建立下一級子節點的時候,記錄每個子節點建立的先後順序,會給每個子節點名加上乙個數字字尾。

臨時:建立客戶端會話失效(注意是會話失效,不是連線斷了),節點也就沒了。不能建子節點。

臨時順序:不用解釋了吧。

zookeeper對節點的watch監聽通知是永久的嗎?

不是。官方宣告:乙個watch事件是乙個一次性的觸發器,當被設定了watch的資料發生了改變的時候,則伺服器將這個改變傳送給設定了watch的客戶端,以便通知它們。

為什麼不是永久的,舉個例子,如果服務端變動頻繁,而監聽的客戶端很多情況下,每次變動都要通知到所有的客戶端,這太消耗效能了。

一般是客戶端執行getdata(「/節點a」,true),如果節點a發生了變更或刪除,客戶端會得到它的watch事件,但是在之後節點a又發生了變更,而客戶端又沒有設定watch事件,就不再給客戶端傳送。

在實際應用中,很多情況下,我們的客戶端不需要知道服務端的每一次變動,我只要最新的資料即可。

部署方式?集群中的機器角色都有哪些?集群最少要幾台機器

單機,集群。leader、follower。集群最低3(2n+1)臺,保證奇數,主要是為了選舉演算法。

集群如果有3臺機器,掛掉一台集群還能工作嗎?掛掉兩台呢?

記住乙個原則:過半存活即可用。

集群支援動態新增機器嗎?

其實就是水平擴容了,zookeeper在這方面不太好。兩種方式:

全部重啟:關閉所有zookeeper服務,修改配置之後啟動。不影響之前客戶端的會話。

逐個重啟:顧名思義。這是比較常用的方式。

zookeeper常見面試題

zookeeper是如何保證事務的順序一致性的 zookeeper採用了遞增的事務id來標識,所有的proposal都在被提出的時候加上了zxid,zxid實際上是乙個64位的數字,高32位是epoch用來標識leader是否發生改變,如果有新的leader產生出來,epoch會自增,低32位用來遞...

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...