ZooKeeper是什麼,以及能夠做什麼,怎麼做到的

ZooKeeper概念和基礎

之前看過不少關於ZooKeeper的博客,文章,然後今天看了《ZooKeeper分佈式過程協同技術詳解》(PS:不知道是不是我的書是盜版的,裏面有些錯別字)的寫一篇博客記錄下
不然下次面試 又 被問懵逼就很尬(簡歷寫了瞭解ZooKeeper,結果一問被問懵,屬實尷尬)
有些是書上的內容,有些是我自己的理解。有疑問或者認爲有錯,歡迎指出

這篇不涉及具體安裝使用,僅介紹原理。要曉得這個程序才2.3M,不會有太難的東西。 要從心裏上藐視他,要是一開始就預設這個東西很難,你還學個錘子
下載鏈接:清華大學的鏡像站下載 應該比去官網下載快點

腦圖
ZooKeeper

1. ZooKeeper是什麼

面試官:“我看你簡歷寫了瞭解ZooKeeper,ZooKeeper是什麼”
我:“ZooKeeper是一個程序”

我上次有個面試其中一個問題我就這樣答的,我以爲我掛了,雖然最後面試還是過了。但是最終沒有去
每次這種 是什麼的問題就很懵,也不知道什麼說
百度百科:ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

2. ZooKeeper有什麼用

ZooKeeper是一個 協助分佈式系統開發的 應用程序,主要用來處理協同數據。 其可以用來 集羣管理,統一命名服務,管理配置信息,分佈式鎖

3. ZooKeeper原理

3.1 原理

ZooKeeper就是由樹監聽器實現的

3.1.1 樹形結構 Znode

就是與文件系統結構差不多的樹形結構
每個節點稱爲Znode,可以有子節點,每個節點自身也可以存儲信息
Znode有4種類型:

  • 永久節點
  • 臨時節點 (會話session結束(正常結束,或者節點崩潰斷開連接)就被刪除)
  • 順序永久節點 (就是帶序號)
  • 順序臨時節點

session一次連接從開始到結束是一個session
基本一樣:你不能在/java/basic 下建立兩個jdbc文件夾
樹形結構示意圖

3.1.2 監聽器

每一個Znode可以被監聽,Znode的改變(新建,刪除,修改)監聽者都可以收到通知(前提是你先要監聽)
PS:按我書上的說法(2016年出版的書,應該不至於過時),監聽器只能用一次。就是說我堅挺到第一次變化後,如果我不重新註冊監聽器,就收不到第二次變化的通知
補救:收到通知後,再次設置監聽前查下內容,這樣不至於丟掉我第二次監聽器之前的變化(但是這裏會涉及到ABA問題)。但是ZooKeeper可不是用於高併發的,人家承諾的是高性能與高可用。

3.2 兩種模式

ZooKeeper有獨立模式仲裁模式兩種
獨立單臺機器單個實例
仲裁模式:單個機器多個實例或者多個機器多個實例
仲裁模式主要是用於選主,當主節點掛掉,選擇一個新的主節點。超過一半(與少數服從多數有區別)認可,即成爲新的主

3.3 原理在實際應用的體現

3.3.1 集羣管理

選主:
每個節點用順序臨時Znode表示。例如:Znode0,Znode1,···,Znode8
其中Znode0是主節點,當其斷開時,節點被刪除,這個時候還連接的Znode1-8選最小的爲主節點,也就是Znode1爲主節點
等等!!!!,剛纔說的仲裁呢?
情節1:如果生效的Znode1-8是互相連接的,Znode1節點得到8票,大於4.5自然是主節點。
**情節2:**如果生效的節點分層兩部分呢(也就是腦裂):Znode1-2互相連接,Znode3-8互相連接。按照仲裁的規定,現在Znode1得兩票,Znode3得6票,Znode3纔是主(Master)。這個時候相當於是0.1.2斷開連接,之後其序號就是9,10,11了
情節3: 如果剩下的節點分層兩部分: Znode1-4組團,Znode5-8抱團
這個時候Znode1得4票小於4.5,Znode5得4票小於4.5,選誰爲主節點。都不是,這個時候系統將不提供服務,也就是不可用了,請運維去排查原因。(沒有主是因爲兩個得到的票數小於一半,而不是因爲票數相同)

從節點管理:
就是都是臨時節點,當從節點宕機,session結束,該節點被刪除,其他 節點能夠知曉。去做相應的處理

3.3.2 管理配置信息

在分佈式系統中,每修改一個配置,多臺機器都要同時修改。現在交給ZooKeeper管理,其他機器訂閱這個節點信息。只要被修改,都能收到通知,做出相應的處理

3.3.4 統一命名服務

就像上面說的你不能在/java/basic 下建立兩個jdbc文件夾。從根節點一直到子節點,每一條路徑的名字都是獨一無二不重複的。

3.3.5 分佈式鎖

這個我想來有兩種實現方式:
搶佔式:需要競爭資源的線程,在同一個Znode下創建一個名爲 “Znode名字”的臨時Znode。因爲一個Znode下,每個節點名字不能重複,所以只有一個能夠創建成功,這個成功的就能拿到鎖,執行完畢後,或者被迫宕機。該創建的節點就會被刪除(相當於釋放鎖),其他節點又有機會的 【題外話:與Redis做分佈鎖相比,節點完成或宕機後刪除節點將釋放鎖,然而Redis就無法控制釋放鎖的時機】
隊列式競爭資源的線程在同一個節點下創建順序臨時節點,每個節點小的先執行

4. 小結

  1. 僅通過屬性結構,4類節點,監聽機制。就能玩出各種花樣,設計的人真TM厲害
  2. 而且Zk本身做的是也不多,無非就是創建節點,刪除節點,監聽,修改節點,以至於程序自身也比較小(畢竟功能少)。而且還給了應用的人自己很大的發揮空間,可以自己弄各種協作原語
  3. 總之一句話:設計者NB!

總目錄:Java進階之路-目錄

                “不宜妄自菲薄,引喻失義”
                《出師表》
                博主:五更依舊朝花落
                首次發佈時間:2020年5月23日22:29:18
                末次更新時間:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章