zookeeper

是一個分散式協調服務

paxos小島的故事

小島(Island)——ZK Server Cluster

議員(Senator)——ZK Server

提議(Proposal)——ZNode Change(Create/Delete/SetData…)

提議編號(PID)——Zxid(ZooKeeper Transaction Id)

正式法令——所有ZNode及其數據

總統——ZK Server Leader

在hadoop中zookeeper的事件確保整個集羣只有一個NameNode,配置信息等

在Hbase中zookeeper事件處理確保整個集羣只有一個HMaster,察覺HRegionServer聯機和宕機,存儲訪問控制列表等.

狀態和角色

Server狀態

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

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

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

領導者(leader):負責進行投票的發起和決議,更新系統狀態

學習者(learner):包括跟隨者(follower)和觀察者(observer),follower用於接受客戶端請求並向客戶端返回結果,在選主過程中參與投票

Observer :可以接受客戶端連接,將寫請求轉發給leader,但observer不參加投票過程,只同步leader的狀態,observer的目的是為了擴展系統,提高讀取速度

客戶端(client):請求發起方

zookeeper的特點

最終一致性:為客戶端展示同一個視圖,這是zookeeper裡面一個非常重要的功能

可靠性:如果消息被到一臺伺服器接受,那麼它將被所有的 伺服器接受,節點故障不影響使用

實時性:Zookeeper不能保證兩個客戶端能同時得到剛更新 的數據,如果需要最新數據,應該在讀數據之前調 用sync()介面

獨立性:各個Client之間互不幹預

原子性:更新只能成功或者失敗,沒有中間狀態。

順序性:所有Server,同一消息發布順序一致,FIFO

session

1、客戶端通過TCP協議與獨立伺服器或者一個集羣中的某個伺服器建立會話連接。

2、會話提供順序保障,即同一個會話中的請求以FIFO的順序執行。如果客戶端有多個並發會話,FIFO順序在多個會話之間未必能夠保持。

3、如果連接的Server出現問題,在沒有超過Timeout時間時,可以連接其他節點。zookeeper客戶端透明地轉移一個會話到不同的伺服器。

4、同一session期內的特性不變

5、當一個會話因某種原因終止,在這個會話期間創建的臨時節點將會消失。

Session是由誰來創建的? Leader:產生一個唯一的session,放到消息隊列,讓所有server知道 過半機制:保證session創建成功或者失敗

數據模型Znode

目錄結構:層次的,目錄型結構,便於管理邏輯關係 。節點znode而非文件file。

znode信息:包含最大1MB的數據信息 。記錄了zxid等元數據信息。

節點類型

瞬時的(ephemeral)和持久的(persistent)

znode有四種形式的目錄節點

PERSISTENT

EPHEMERAL

PERSISTENT_SEQUENTIAL

EPHEMERAL_SEQUENTIAL

短暫znode的客戶端會話結束時,zookeeper會將該短暫znode刪除,短暫znode不可以有子節點

持久znode不依賴於客戶端會話,只有當客戶端明確要刪除該持久znode時才會被刪除

znode的類型在創建時確定並且之後不能再修改

事件監聽機制

基於通知(notification)的機制(不是輪詢,輪詢代價大)

Client向zookeeper註冊需要的znode,通過對znode設置監聽點(watch)來接收通知。監視點會觸發一個通知,client在每次接收到通知後設置一個新的監視點。

zookeeper的節點模式

Zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實現這個機制的協議叫做Zab協議。

Zab協議有兩種模式:

恢復模式

無主,無服務 選舉leader

zxid <從paxos 到 zookeeper> myid 首先選舉zxid最大的 如果zxid相同,則選舉myid最大的,選舉過程耗時在200ms之內,一般情況下zookeeper恢復服務時間間隔不超過200ms。

廣播模式

主從模式 leader維護事物的唯一和有序性 隊列機制

zookeeper集羣搭建

1、zookeeper集羣搭建
a) 將zookeeper.tar.gz上傳到node2、node3、node4
b) 解壓到/software
tar -zxf zookeeper-3.4.6.tar.gz -C /software
c) 配置環境變數:
export ZOOKEEPER_HOME=/software/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
然後. /etc/profile讓配置生效
d) 到$ZOOKEEPER_PREFIX/conf下
複製zoo_sample.cfg為zoo.cfg
cp zoo_sample.cfg zoo.cfg
e) 編輯zoo.cfg
添加如下行:
server.1=node2:2881:3881
server.2=node3:2881:3881
server.3=node4:2881:3881

修改
dataDir=/var/bjsxt/zookeeper/data
f) 創建/var/bjsxt/zookeeper/data目錄,並在該目錄下放一個文件:myid
在myid中寫下當前zookeeper的編號
mkdir -p /var/bjsxt/zookeeper/data
echo 3 > /var/bjsxt/zookeeper/data/myid
g) 將/opt/zookeeper-3.4.6通過網路拷貝到node2、node3上
scp -r zookeeper-3.4.6/ node2:/software
scp -r zookeeper-3.4.6/ node3:/software
h) 在node2和node3上分別創建/var/bjsxt/zookeeper/data目錄,
並在該目錄下放一個文件:myid
node2:
mkdir -p /var/bjsxt/zookeeper/data
echo 1 > /var/bjsxt/zookeeper/data/myid
node3:
mkdir -p /var/bjsxt/zookeeper/data
echo 2 > /var/bjsxt/zookeeper/data/myid

i) 啟動zookeeper
zkServer.sh start
zkServer.sh start|stop|status
j) 關閉zookeeper
zkServer.sh stop
l) 連接zookeeper
zkCli.sh
m) 退出zkCli.sh命令
quit

命令

zkServer.sh start 啟動集羣

zkServer.sh status 查看集羣狀態

zkServer.sh stop 停止集羣

create /sxt "hello" 創建節點數據

create -e /sxte "" 創建臨時節點數據

get /sxt 獲取節點數據

set /sxt "good" 修改節點數據

常見參數

tickTime:發送心跳的間隔時間,單位:毫秒

dataDir:zookeeper保存數據的目錄。

clientPort:客戶端連接 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。

initLimit: 這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是用戶連接Zookeeper伺服器的客戶端,而是 Zookeeper 伺服器集羣中連接到 Leader的Follower 伺服器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5 個心跳的時間(也就是 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命令操作

create /sxt hello 創建節點

get /sxt 獲取節點

set /sxt 修改節點數據

create /sxt/csxt 創建子節點

ls / 查看節點目錄

ls /sxt 查看節點目錄

節點中的數據不超過1M

持久化節點的事務ID單調遞增

父節點中的pZxid記錄子節點中的最高事務ID

create -e /sxte 「 」 創建臨時節點

get /sxte 獲取臨時節點

臨時節點沒有子節點,如果關掉創建臨時節點的客戶端,則在另一個session中查看,在超過過期時間之後該臨時節點消失。 如果在過期時間內客戶端恢復,則臨時節點不會消失。

cZxid:節點創建時的zxid

ctime:節點創建時間

mZxid:節點最近一次更新時的zxid

mtime:節點最近一次更新的時間

cversion:子節點數據更新次數

dataVersion:本節點數據更新次數

aclVersion:節點ACL(授權信息)的更新次數

ephemeralOwner:如果該節點為臨時節點,

ephemeralOwner值表示與該節點綁定的session id. 如果該節點不是臨時節點,ephemeralOwner值為0

API操作

1、watcher事件是一次性的

2、是增刪改觸發watcher,但是watcher是線程非同步執行

3、watcher可以反覆註冊


推薦閱讀:
相關文章