1. 程式人生 > >ZooKeeper分散式過程協同技術詳解

ZooKeeper分散式過程協同技術詳解

英文版名稱:ZooKeeper: Distributed Process Coordination

第1章 簡介

當你決定使用ZooKeeper來設計應用時,最好將應用資料和協同資料獨立開。
比如:網路郵箱服務的使用者對自己郵箱中的內容感興趣,但是並不關心由哪臺伺服器來處理特定郵箱的請求。在這個例子中,郵箱內容就是應用資料,而從郵箱到某一臺郵箱伺服器之間的對映關係就是協同資料(或稱元資料)。整個ZooKeeper服務所管理的就是後者。

1.1 ZooKeeper的使命

  • Apache Hbase
    HBase是一個通常與Hadoop一起使用的資料儲存倉庫。在HBase中,ZooKeeper用於選舉一個叢集內的主節點,以便跟蹤可用的伺服器,並儲存叢集的元資料。
  • 關於ZooKeeper名字的來源
    ZooKeeper was developed at Yahoo! Research. We had been working on ZooKeeper for a while and pitching it to other groups, so we needed a name. At the time the group had been working with the Hadoop team and had started a variety of projects with the names of animals, Apache Pig being the most well known. As we were talking about different possible names, one of the group members mentioned that we should avoid another animal name because our manager thought it was starting to sound like we lived in a zoo. That is when it clicked: distributed systems are a zoo. They are chaotic and hard to manage, and ZooKeeper is meant to keep them under control.
    The cat on the book cover is also appropriate, because an early article from Yahoo! Research about ZooKeeper described distributed process management as similar to herding cats. ZooKeeper sounds much better than CatHerder, though.
  • 整個ZooKeeper的伺服器叢集管理著應用協作的關鍵資料。ZooKeeper不適合用作海量資料儲存。

第2章 瞭解ZooKeeper

2.1 ZooKeeper基礎

  • ZooKeeper並不直接暴露原語,取而代之,它暴露了由一小部分呼叫方法組成的類似檔案系統的API,以便允許應用實現自己的原語。我們通常使用菜譜(recipes)來表示這些原語的實現。菜譜包括ZooKeeper操作和維護一個小型的資料節點,這些節點被稱為znode,採用類似於檔案系統的層級樹狀結構進行管理。
  • API
    • create /path data
      建立一個名為/path的znode節點,幷包含資料data,-e引數標誌建立的znode為臨時節點。
    • delete /path
      刪除名為/path的znode。
    • exists /path
      檢查是否存在名為/path的節點。
    • setData /path data
      設定名為/path的znode的資料為data。
    • getData /path
      返回名為/path的節點的資料資訊。
    • getChildren /path
      返回所有/path節點的所有子節點列表,注:不含子節點的子節點。
    • 注:ZooKeeper並不允許區域性寫入或讀取znode節點的資料。當設定一個znode節點的資料或讀取時,znode節點的內容會被整個替換或全部讀取進來。
    • stat /path [true]
      stat命令可以得到一個znode節點/path的屬性,並允許我們在已經存在的znode節點上設定監視點。通過在路徑後面設定引數true來新增監視點。比如可以監控節點刪除事件NodeDeleted事件。
    • ls /path [true]
      可以檢視/path下的子節點,通過設定true這個引數,可以設定對應znode的子節點變化的監視點。
  • znode的不同型別
    • 持久(persistent)節點和臨時(ephemeral)節點
      持久的znode只能通過呼叫delete來進行刪除。臨時的znode與之相反,當建立該節點的客戶端崩潰或關閉了與ZooKeeper的連線時,整個節點就會被刪除。通過-e引數建立臨時節點。
    • 有序節點,通過-s引數建立有序節點
  • 監視與通知
    客戶端向ZooKeeper註冊需要接收通知的znode,通過對znode設定監視點(watch)來接收通知。監視點是一個單詞觸發的操作,意即監視點會觸發一個通知。為了接收多個通知,客戶端必須在每次通知後設置一個新的監視點。
  • 版本
    每一個znode 都有一個版本號,它隨著每次資料變化而自增。兩個API操作可以有條件地執行:setData和delete。這個兩個呼叫以版本號作為傳入引數,只有當傳入引數的版本號與伺服器上的版本號一致時呼叫才會成功。

2.2 ZooKeeper架構

ZooKeeper伺服器端運行於兩種模式下:獨立模式(standalone)和仲裁模式(quorum)。

2.3 開始使用ZooKeeper

  • windows注意事項
    • 使用如下命令執行時報如下錯誤,解決方法,不帶start引數,但是無法stop,只能通過Ctrl+c停止,仔細查看了windows指令碼和Linux指令碼,發現windows指令碼太弱了,想深入學習的話還是轉戰Linux。
      D:\soft\zookeeper-3.4.8\bin>zkServer.cmd start
D:\soft\zookeeper-3.5.1-alpha\bin>zkServer.cmd start
系統找不到指定的路徑。
Error: JAVA_HOME is incorrectly set.
  • 如果報上述錯誤(在zookeeper-3.5.1-alpha中出現),說明您的JAVA_HOME路徑中有空格,只需修改bin/zkEnv.cmd檔案,在%JAVA_HOME%外面增加雙引號即可,如下所示:
if not exist "%JAVA_HOME%\bin\java.exe" (
  echo Error: JAVA_HOME is incorrectly set.
  @REM goto :eof
)

set JAVA="%JAVA_HOME%\bin\java"
  • 會話的狀態和生命週期
    screenshot
  • 事務識別符號zkid
  • 本節在Windows上開發,需要修改zkServer.cmd檔案,將其中
    java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
    改為
    java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% %*
    即,去除"%ZOOCFG%",執行命令時手動指定配置檔案*.cfg的路徑。
  • 實現一個原語:通過ZooKeeper實現鎖

2.4 一個主-從模式例子的實現

通過zkCli工具來實現主-從示例的一些功能。
主-從模式的模型中包括三個角色:

  • 主節點
    主節點負責監視新的從節點和任務,分配任務給可用的從節點。
  • 從節點
    從節點會通過系統註冊自己,以確保主節點看到它們可以執行任務,然後開始監視新任務。
  • 客戶端
    客戶端建立新任務並等待系統的響應。

第3章 開始使用ZooKeeper的API

注意:順序和ConnectionLossException異常
ZooKeeper會嚴格維護執行順序,並提供強有力的有序保障,然而,在多執行緒下還是需要小心面對順序問題。多執行緒下,當回撥函式中包括重試邏輯的程式碼時,一些常見的場景都可能導致錯誤發生。當遇到ConnectionLossException異常而補發一個請求時,新建立的請求可能排序在其他執行緒中的請求之後,而實際上其他執行緒中的請求應該在原來的請求之後。

第4章 處理狀態變化