Zookeeper學習提綱:助你一臂之力

ZooKeeper

ZooKeeper:ZooKeeper是一種分佈式協調服務,用於管理大型主機。

分佈式應用:分佈式應用可以在給定時間(同時)在網絡中的多個系統上運行,通過協調它們以快速有效的方式完成特定任務

分佈式應用有兩部分:Server(服務器) 和 Client(客戶端) 應用程序。

  1. 服務器應用程序:實際上是分佈式的,並具有通用接口,以便客戶端可以連接到集羣中的任何服務器並獲得相同的結果。
  2. 客戶端應用程序:是與分佈式應用進行交互的工具。

分佈式應用的優點:

  1. 可靠性:單個或幾個系統的故障不會使整個系統出現故障。
  2. 可擴展性:可以在需要時增加性能,通過添加更多機器,在應用程序配置中進行微小的更改,而不會有停機時間。
  3. 透明性:隱藏系統的複雜性,並將其顯示爲單個實體/應用程序。

分佈式應用的缺點:

  1. 競爭條件:兩個或多個機器嘗試執行特定任務,實際上只需在任意給定時間由單個機器完成。例如,共享資源只能在任意給定時間由單個機器修改。
  2. 死鎖:兩個或多個操作等待彼此無限期完成
  3. 不一致:數據的部分失敗。

Apache ZooKeeper是由集羣(節點組)使用的一種服務,用於在自身之間協調,並通過穩健的同步技術維護共享數據。ZooKeeper本身是一個分佈式應用程序,爲寫入分佈式應用程序提供服務。

ZooKeeper集羣奇數個節點的原因

  1. 防止由腦裂造成的集羣不可用
  2. 在容錯能力相同的情況下,奇數臺更節省資源。

ZooKeeper提供的常見服務如下 :

  • 命名服務:按名稱標識集羣中的節點。它類似於DNS,但僅對於節點。

  • 配置管理:加入節點的最近的和最新的系統配置信息。

  • 集羣管理:實時地在集羣和節點狀態中加入/離開節點。

  • 選舉算法:選舉一個節點作爲協調目的的leader。

  • 分佈式鎖和隊列同步服務:在修改數據的同時鎖定數據。此機制可幫助你在連接其他分佈式應用程序(如Apache HBase)時進行自動故障恢復。

  • 高度可靠的數據註冊表:即使在一個或幾個節點關閉時也可以獲得數據。

ZooKeeper的好處:

  1. 簡單的分佈式協調過程
  2. 最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖,這是zookeeper最重要的性能。
  3. 實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得服務器的更新信息,或者服務器失效的信息。
  4. 序列化:根據特定規則對數據進行編碼。確保應用程序運行一致。這種方法可以在MapReduce中用來協調隊列以執行運行的線程。
  5. 可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺服務器接受,那麼它將被所有的服務器接受。
  6. 原子性:數據轉移完全成功或完全失敗,但沒有事務是部分的。
  7. 等待無關(wait-free):慢的或者失效的client不得干預快速的client的請求,使得每個client都能有效的等待。

分佈式與數據複製:Zookeeper作爲一個集羣提供一致的數據服務,自然,它要在所有機器間做數據複製。

數據複製的好處:

  1. 容錯:一個節點出錯,不致於讓整個系統停止工作,別的節點可以接管它的工作;
  2. 提高系統的擴展能力:把負載分佈到多個節點上,或者增加節點來提高系統的負載能力;
  3. 提高性能:讓客戶端本地訪問就近的節點,提高用戶訪問速度。

從客戶端讀寫訪問的透明度來看,數據複製集羣系統分下面兩種:

  • 寫主(WriteMaster):對數據的修改提交給指定的節點。讀無此限制,可以讀取任何一個節點。這種情況下客戶端需要對讀與寫進行區別,俗稱讀寫分離;

  • 寫任意(Write Any):對數據的修改可提交給任意的節點,跟讀一樣。這種情況下,客戶端對集羣節點的角色與變化透明。

zookeeper安裝:

獨立配置的ZooKeeper集羣,進程名稱QuorumPeerMain

單機模式

Zookeeper 的配置文件在 conf 目錄下,這個目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名爲 zoo.cfg,因爲 Zookeeper 在啓動時會找這個文件作爲默認配置文件。

1  tickTime=2000
2  dataDir=D:/devtools/zookeeper-3.2.2/build 
3  clientPort=2181

下面詳細介紹一下,這個配置文件中各個配置項的意義

  • tickTime:這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  • dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
  • clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

集羣模式

集羣模式除了上面的三個配置項還要增加下面幾個配置項:

1.  initLimit=5 
2.  syncLimit=2 
3.  server.1=192.168.211.1:2888:3888 
4.  server.2=192.168.211.2:2888:3888
  • initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 5 * 2000=10 秒
  • syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2 * 2000=4 秒
  • server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。

zookeeper的節點類型

  • PERSISTENT(持久化目錄節點):客戶端與zookeeper斷開連接後,該節點依舊存在

  • PERSISTENT_SEQUENTIAL(持久化順序編號目錄節點):客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號

  • EPHEMERAL(臨時目錄節點):客戶端與zookeeper斷開連接後,該節點被刪除

  • EPHEMERAL_SEQUENTIAL(臨時順序編號目錄節點):客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號

ZooKeeper 角色:(zookeeper服務主要有兩個角色leader和follower

在這裏插入圖片描述

ZooKeeper工作原理:

Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分 別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和 leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。
爲了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。

每個Server在工作過程中有三種狀態:

  • LOOKING:當前Server不知道leader是誰,正在搜尋

  • LEADING:當前Server即爲選舉出來的leader

  • FOLLOWING:leader已經選舉出來,當前Server與之同步

zookeeper中的命令

連接到Zookeeper服務

zkCli.sh -server hadoop2:2181

可用命令

help

使用ls命令查看當前Zookeeper中所包含的內容

ls

創建一個新的Znode節點"aa",以及和它相關字符,默認是不帶編號的

create /aa "my first zk"

創建帶編號的持久性節點"bb",

create -s /bb "the bb node"

創建不帶編號的臨時節點"cc"

create -e /cc "the cc node"

創建帶編號的臨時節點"dd"

create -s -e /dd "the dd node"

關閉本次連接回話session,再重新打開一個連接

close
connect haddoop1:2181

獲取節點

get /aa

通過set命令來對zk所關聯的字符串進行設置

set /aa haha123

刪除節點

delete /aa

退出

quit

查看一個文件的狀態信息

stat /a
close
connect haddoop1:2181

獲取節點

get /aa

通過set命令來對zk所關聯的字符串進行設置

set /aa haha123

刪除節點

delete /aa

退出

quit

查看一個文件的狀態信息

stat /a

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章