1. 程式人生 > >zookeeper任務與面試 重點(含答案)

zookeeper任務與面試 重點(含答案)

任務

安裝zookeeper

練習zookeeper命令

面試重點

zookeeper是幹什麼的?

Zookeeper 是 分散式協調服務,分散式應用程式可以基於它實現同步服務,配置維護和命名服務等

  1. 說說zookeeper半數機制

舉例說明:3臺和4臺的區別。

  1. zookeeper節點型別

Znode有兩種型別:

短暫(ephemeral)(斷開連線自己刪除)

持久(persistent)(斷開連線不刪除)

Znode有四種形式的目錄節點(預設是persistent )

PERSISTENT

PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

EPHEMERAL

EPHEMERAL_SEQUENTIAL

建立znode時設定順序標識,znode名稱後會附加一個值

順序號是一個單調遞增的計數器,由父節點維護

在分散式系統中,順序號可以被用於為所有的事件進行全域性排序,這樣客戶端可以通過順序號推斷事件的順序

zookeeper選舉機制

zookeeper的選舉機制(全新叢集)

以一個簡單的例子來說明整個選舉的過程. 假設有五臺伺服器組成的zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史資料,在存放資料量這一點上,都是一樣的.假設這些伺服器依序啟動,來看看會發生什麼. 1) 伺服器1啟動,此時只有它一臺伺服器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態 2) 伺服器2啟動,它與最開始啟動的伺服器1進行通訊,互相交換自己的選舉結果,由於兩者都沒有歷史資料,所以id值較大的伺服器2勝出,但是由於沒有達到超過半數以上的伺服器都同意選舉它(這個例子中的半數以上是3),所以伺服器1,2還是繼續保持LOOKING狀態. 3) 伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1,2,3中的老大,而與上面不同的是,此時有三臺伺服器選舉了它,所以它成為了這次選舉的leader. 4) 伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1,2,3,4中最大的,但是由於前面已經有半數以上的伺服器選舉了伺服器3,所以它只能接收當小弟的命了. 5) 伺服器5啟動,同4一樣,當小弟.

非全新叢集的選舉機制(資料恢復)

那麼,初始化的時候,是按照上述的說明進行選舉的,但是當zookeeper運行了一段時間之後,有機器down掉,重新選舉時,選舉過程就相對複雜了。

需要加入資料id、leader id和邏輯時鐘。

資料id:資料新的id就大,資料每次更新都會更新id。

Leader id:就是我們配置的myid中的值,每個機器一個。

邏輯時鐘:這個值從0開始遞增,每次選舉對應一個值,也就是說:  如果在同一次選舉中,那麼這個值應該是一致的 ;  邏輯時鐘值越大,說明這一次選舉leader的程序更新.

選舉的標準就變成:

1、邏輯時鐘小的選舉結果被忽略,重新投票

2、統一邏輯時鐘後,資料id大的勝出

3、資料id相同的情況下,leader id大的勝出

根據這個規則選出leader。

​​​​​​​說說共享鎖

共享鎖在同一個程序中很容易實現,但是在跨程序或者在不同 Server 之間就不好實現了。

Zookeeper 卻很容易實現這個功能,實現方式也是需要獲得鎖的 Server 建立一個 EPHEMERAL_SEQUENTIAL 目錄節點,然後呼叫 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己建立的目錄節點,如果正是自己建立的,那麼它就獲得了這個鎖,如果不是那麼它就呼叫 exists(String path, boolean watch) 方法並監控 Zookeeper 上目錄節點列表的變化,一直到自己建立的節點是列表中最小編號的目錄節點,從而獲得鎖,釋放鎖很簡單,只要刪除前面它自己所建立的目錄節點就行了。

我收集了一些關於Java高併發、分散式、ZK、dubbo、JVM、spring原始碼分析以及效能優化,設計模式等相關的技術資料(電子書)一併分享在Java架構師之路大家庭裡(766529531),歡迎大家來裡下載學習以及交流討論。