1. 程式人生 > >zookeeper入門系列講解

zookeeper入門系列講解

    zookeeper可謂是目前使用最廣泛的分散式元件了。其功能和職責單一,但卻非常重要。
    在現今這個年代,介紹zookeeper的書和文章可謂多如牛毛,本人不才,試圖通過自己的理解來介紹zookeeper,希望通過一個初學者的視角來學習zookeeper,以期讓人更加深入和平穩的理解zookeeper。其中參考了不少教程和書,相關書目列在文末,也感謝這些作者。
    學習新的框架,先讓我們搞清楚他是什麼,這是它的內涵。然後再介紹它能做什麼,這是它的外延,內涵和外延共同來定義框架本身,會對框架有較為深刻的理解,在應用層面上知道如何用。其次再搞清楚zookeeper相關的理論基礎,其目的是知道zookeeper是如何被髮明的,是否能夠借鑑以便今後自己能夠用到其他地方。最後搞清楚zookeeper中一些設計的原理和細節,目的也是搞清來龍去脈,學會“術”從而應用到別的地方。當然了,加深的理解同樣能夠幫助認識zookeeper本身,在使用時才知道為什麼這樣用。
一:首先,zookeeper到底是什麼?


    zookeeper實際上是yahoo開發的,用於分散式中一致性處理的框架。最初其作為研發Hadoop時的副產品。由於分散式系統中一致性處理較為困難,其他的分散式系統沒有必要 費勁重複造輪子,故隨後的分散式系統中大量應用了zookeeper,以至於zookeeper成為了各種分散式系統的基礎元件,其地位之重要,可想而知。著名的hadoop、kafka、dubbo 都是基於zookeeper而構建。
    要想理解zookeeper到底是做啥的,那首先得理解清楚,什麼是一致性。
    所謂的一致性,實際上就是圍繞著“看見”來的。誰能看見?能否看見?什麼時候看見?舉個例子:淘寶後臺賣家,在後臺上架一件大促的商品,通過伺服器A提交到主資料庫,假設剛提交後立馬就有使用者去通過應用伺服器B去從資料庫查詢該商品,就會出現一個現象,賣家已經更新成功了,然而買家卻看不到;而經過一段時間後,主資料庫的資料同步到了從資料庫,買家就能查到了。
    假設賣家更新成功之後買家立馬就能看到賣家的更新,則稱為強一致性;
    如果賣家更新成功後買家不能看到賣家更新的內容,則稱為弱一致性;
    而賣家更新成功後,買家經過一段時間最終能看到賣家的更新,則稱為最終一致性。
    如何保證在分散式環境下資料的最終一致,這個就是zookeeper需要解決的問題。對於這些問題,有哪些挑戰,zookeeper又是如何解決這些挑戰的。


二:一些常見的解決一致性問題的方式:
        1.查詢重試補償。對於分散式應用中不確定的情況,先使用查詢介面查詢到當前狀態,如果當前狀態不一致則採用補償介面對狀態進行重試推進,或者回滾介面對業務做回滾。典型的場景如銀行跟支付寶之間的互動。支付寶傳送一個轉賬請求到銀行,如一直未收到響應,則可以通過銀行的查詢介面查詢該筆交易的狀態,如該筆交易對方未收到,則採取補償的模式進行推送。
        2.定時任務推送。對於上面的情況,有可能一次推送搞不定,於是需要2次,3次推送。不要懷疑,支付寶內最初掉單率很高,全靠後續不斷的定時任務推送增加成功率。
        3.TCC。try-confirm-cancel。實際上是兩階段協議,第二階段的可以實現提交操作或是逆操作。
三:zookeeper到底能做什麼?


    在業界的實際應用是什麼?瞭解這些應用,會對zookeeper能夠做的事有更直觀的認識。
    1.hadoop
    始祖級應用,ResourceManager在整個hadoop中算是單點,為了實現其高可用,分為主備ResourceManager,zookeeper在其中管理整個ResourceManager。
    可以想象,主備ResourceManager最初是主RM提供服務,如果一切安好,則zookeeper無用武之地。然而,總歸會出現主RM提供不了服務的情況。於是會出現主備切換的情況,而zookeeper正是為主備切換保駕護航。
    先來推理一下,主備切換會出現什麼問題。傳統的主備切換,可以讓主備之間維持心跳連線,一旦備機發現主機心跳檢測不到了,則自己切換為主機,原來的主機等待救援。這種方式有兩個問題,一是由於網路抖動,負載過大等問題,備機檢測不到心跳並不能說明主機一定掛了,有可能一定時間後主機或網路恢復,這時候主機並不知道備機已經切換為主機,2臺主機互相爭用,可能造成腦裂;二是如果一些資料集中在主機上面,則備機切換時由於同步延時勢必會損失掉一部分的資料。
    如何解決這些問題?早期的方式提供了不少解決方案,比如備機一旦切換為主機,則通過電源控制直接切斷主機電源,簡單粗暴,但是此刻備機已經是單點,如果主機是因為量撐不住而掛,那備機有可能會重蹈覆轍,最終導致整個服務不可用。
四:zookeeper又是如何解決這個問題的呢?
        zookeeper作為第三方叢集參與到主備節點中去,當主備啟動時會在zookeeper上競爭建立一個臨時鎖節點,爭用成功者則充當主機,其餘備機;
        所有備機會監聽該臨時鎖節點,一旦主機與zookeeper間session失效,則臨時節點被刪除;
        一旦臨時節點被刪除,備機開始重新申請建立臨時鎖節點,重新爭用為主機;
        用zookeeper如何解決腦裂?實際上主機爭用到節點後通過對根節點做一個ACL許可權控制,則其他搶佔的機器由於無法更新臨時鎖節點,只有放棄成為備機。
    zookeeper使用了非常簡單又現成的方式來解決的這個問題,比起其他方案方便不少,這也是為啥zookeeper流行的原因。說白了,就是把複雜操作封裝化精簡化。
    1.dubbo
    作為業界知名的分散式SOA框架,dubbo的主要的服務註冊發現功能便是由zookeeper來提供的。
    對於一個服務框架,註冊中心是其核心中的核心,雖然暫時掛掉並不會導致整個服務出問題,但是一旦掛掉,整體風險就很高?悸且話闈榭?註冊中心就是單臺機器的時候,其實現很容易,所有機器起來都去註冊服務給它,並且所有呼叫方都跟它保持長連線,一旦服務有變,即通過長連線來通知到呼叫方。但是當服務叢集規模擴大時,這事情就不簡單了,單機保持連線數有限,而且容易故障。
    作為一個穩定的服務化框架,dubbo可以選擇並推薦zookeeper作為註冊中心。其底層將zookeeper常用的客戶端zkclient和curator封裝成為ZookeeperClient。
        當服務提供者服務啟動時,向zookeeper註冊一個節點;
        服務消費者則訂閱其父節點的變化,諸如啟動停止都能夠通過節點建立刪除得知,異常情況比如被呼叫方掉線也可以通過臨時節點session 斷開自動刪除得知;
        服務消費方同時也會將自己訂閱的服務以節點建立的方式放到zookeeper;
        於是可以得到對映關係,諸如誰提供了服務,誰訂閱了誰提供的服務,基於這層關係再做監控,就能輕易得知整個系統情況。
五:zookeeper的基本資料模型
    一句話,類似Linux檔案系統的節點模型


    其節點有如下有趣而又重要的特性:
        1.同一時刻多臺機器建立同一個節點,只有一個會爭搶成功。利用這個特性可以做分散式鎖。
        2.臨時節點的生命週期與會話一致,會話關閉則臨時節點刪除。這個特性經常用來做心跳,動態監控,負載等動作。
        3.順序節點保證節點名全域性唯一。這個特性可以用來生成分散式環境下的全域性自增長id。
    通過zookeeper提供的原語服務,可以對zookeeper能做的事情有個精確和直觀的認識。
六:zookeeper提供的原語服務
        1.建立節點
        2.刪除節點
        3.更新節點
        4.獲取節點資訊
        5.許可權控制
        6.事件監聽
    實際上,就是對節點的增刪查改加上許可權控制與事件監聽,但是通過對這些原語的組合以及不同場景的使用,可以實現很多用法。
        1.資料釋出訂閱。即註冊中心,見上面dubbo用法。主要通過對節點管理做到釋出以及事件監聽做到訂閱。
        2.負載均衡。見上面kafka用法。
        3.命名服務。zookeeper的節點結構天然支援命名服務,即把資訊集中儲存,並以樹狀管理,方便統一查閱。
        4.分散式協調通知。協調通知實際上與釋出訂閱類似,由於引入的第三方的zookeeper,實際上對很多種協調通知做了解耦,比如參考文獻4中提到的訊息推送,心跳檢測等。
        5.叢集管理與master選舉。通過上面的第二點特性,可以輕易得知叢集機器存活狀況,從而輕鬆管理叢集;通過上面第一點特性,可以做出master爭搶。
        6.分散式鎖。實際上就是第一點特性的應用。
        7.分散式佇列。實際上就是第三點特性的應用。
        8.分散式的併發等待。類似於多執行緒的join問題,主任務的執行依賴於其他子任務全部執行完畢,在單機多執行緒裡可以用join,但是分散式環境下如何實現呢。利用zookeeper,可以建立一個主任務節點,旗下子任務一旦執行完畢,則在主任務節點下掛一個子任務節點,等節點數量足夠,則認為主任務可以開始執行。
    可以發現,所有的原語就是zookeeper的基礎,而其他的用法總結無非是將原語放到不同場景下的歸類罷了。
    相信到這裡你對zookeeper應該有個初步的瞭解和大致的印象了。

相關推薦

zookeeper入門系列講解

    zookeeper可謂是目前使用最廣泛的分散式元件了。其功能和職責單一,但卻非常重要。    在現今這個年代,介紹zookeeper的書和文章可謂多如牛毛,本人不才,試圖通過自己的理解來介紹zookeeper,希望通過一個初學者的視角來學習zookeeper,以期讓人更加深入和平穩的理解zookeep

zookeeper 入門系列-理論基礎 – zab 協議

prefix 什麽 cast 復雜度 通信 隊列 xid zab協議 合並 上一章討論了paxos算法,把paxos推到一個很高的位置。但是,paxos有沒有什麽問題呢?實際上,paxos還是有其自身的缺點的: 1. 活鎖問題。在base-paxos算法中,不存在leade

zookeeper入門系列-理論基礎-zab協議

上一章討論了paxos演算法,把paxos推到一個很高的位置。但是,paxos有沒有什麼問題呢?實際上,paxos還是有其自身的缺點的: 1. 活鎖問題。在base-paxos演算法中,不存在leader這樣的角色,於是存在這樣一種情況,即P1提交了一個proposal n

zookeeper入門系列-理論基礎-分散式事務

上一章我們瞭解了zookeeper到底是什麼,這一章重點來看zookeeper當初到底面臨什麼問題?而zookeeper又是如何解決這些問題的? 實際上zookeeper主要就是解決分散式環境下的一致性問題。那麼解決這個問題到底有哪些難點呢?我們一步一步來闡述和推理這個過程

Java入門系列:實例講解ArrayList用法

contains www. ech initial 接口 jsp 需要 print create 本文通過實例講解Java中如何使用ArrayList類。 Java.util.ArrayList類是一個動態數組類型,也就是說,ArrayList對象既有數組的特征,也有鏈表

Java入門系列:例項講解ArrayList用法

1.ArrayList建構函式 ArrayList類支援3個構造方法。 Arraylist() 這個構造方法構造了一個空的連結串列。 ArrayList(Collection<? extends E> c) 這個構造方法構造了一個包含指定元素集合的連結串列,

快速入門系列--WCF--07傳輸安全、授權與審核

最大的 緩存 ims cut 常見 曾經 strong 這一 set 這部分主要涉及企業級應用的安全問題,一般來說安全框架主要提供3個典型的安全行為:認證、授權和審核。除了典型的安全問題,對於一個以消息作為通信手段的分布式應用,還需要考慮消息保護(Message Prote

快速入門系列

body 現在 安全 behavior 需求 discovery 中心 驗證 溝通 最後一章將進行WCF擴展和新特性的學習,這部分內容有一定深度,有一個基本的了解即可,當需要自定義一個完整的SOA框架時,可以再進行細致的學習和實踐。 服務端架構體系的構建主要包含接下來

快速入門系列--WCF--02消息、會話與服務寄宿

abc align bsp 不同的 cpu .org 程序 伸縮 網絡 經過WCF基礎的ABC學習,已經可以構建簡單的WCF的服務,使用不同的服務地址和綁定類型,根據業務提供所需的服務契約。但不禁想問,服務所使用的消息報文是什麽樣的形式麽?蘊含什麽樣內容呢?WCF服務是否支

backbone入門系列(1)基本組成部分

tle doctype syn 方法 1.3 服務器 行為 java code 一,首先backbone有以下組成部分:Events:事件驅動模塊 Model:數據模型 Collection:模型集合器 Router:路由器(對應hash值) History:開啟歷史管理

backbone入門系列(4)集合

src 單獨 -1 lec 指定 one js代碼 bsp 技術 collection就是一堆model的集合,這個集合就是個舞臺,可以放一個人說單口相聲,也可以對口,也可以群口,,, 在前文,也就是入門系列3的基礎上,添加js代碼 var noteCollection=B

Python入門系列教程(二)

字符 小寫 無符號 bsp div width raw_input abc body 字符串 1.字符串輸出 name = ‘xiaoming‘ print("姓名:%s"%name) 2.字符串輸入 userName = raw_input(‘請輸

Python入門系列教程(五)函數

st3 python入門 test print 缺省 .com 教程 技術 log 全局變量 修改全局變量 a=100 def test(): global a a=200 print a 多個返回值 缺省參數 d

快速入門系列--WebAPI--03框架你值得擁有

let lan 最重要的 reason cnblogs err 註意 解釋 max 接下來進入的是俺在ASP.NET學習中最重要的WebAPI部分,在現在流行的互聯網場景下,WebAPI可以和HTML5、單頁應用程序SPA等技術和理念很好的結合在一起。所謂ASP.N

快速入門系列--WebAPI--01基礎

簡單例子 codec 應該 sem ons 請求重定向 選擇 char 阻止 ASP.NET MVC和WebAPI已經是.NET Web部分的主流,剛開始時兩個公用同一個管道,之後為了更加的輕量化(WebAPI是對WCF Restful的輕量化),WebAPI使用了新的管道

快速入門系列--MVC--06視圖

出版 value 快速入門 stream 類型 path .cn esc eba 到了View的呈現板塊,感覺ASP.NET MVC的學習也進入了尾聲,還是比較開心的,畢竟也有了不小收獲。這部分內容相對比較簡單,因為之前還專門學習過如何結合HTML5與MVC框架。前

快速入門系列--CLR--03泛型集合

value mov nts readonly 只有一個 並且 cer view 工作 .NET中的泛型集合 在這裏主要介紹常見的泛型集合,很多時候其並發時的線程安全性常常令我們擔憂。因而簡述下.NET並發時線程安全特性,其詳情請見MSDN。 普通集合都不支持多重並發寫操

C語言高速入門系列(一)

文件鏈接 選中 點擊 轉換 border alt 空白 學習路線 主動 C語言高速入門系列(一) 本系列引言: 本教程的宗旨是將C語言入門的內容進行關鍵知識點的提純,將一些籠統的廢話去除; 再進行壓縮,然後將本章的關鍵知識點做成路線圖的,能夠更加方便地掌握學習的方

zookeeper入門教程

下載 eval 節點 zkcli span books 生產環境 存儲 線程 zookeeper使用場景,不是很難了解,感覺zk監聽節點變化,這個功能比較厲害。zk存儲的節點組織結構有點像unix文件系統 1.安裝zk 運行環境 centos 7 java 8 zoo