zookeeper介紹
Zookeeper作爲一個協調管理者被用在分佈式系統中。當設計一個分佈式系統時,一般需要設計和開發一些協調服務:
- 名稱服務— 名稱服務是將一個名稱映射到與該名稱有關聯的一些信息的服務。電話目錄是將人的名字映射到其電話號碼的一個名稱服務。同樣,DNS 服務也是一個名稱服務,它將一個域名映射到一個 IP 地址。在分佈式系統中,您可能想跟蹤哪些服務器或服務在運行,並通過名稱查看其狀態。ZooKeeper 暴露了一個簡單的接口來完成此工作。也可以將名稱服務擴展到組成員服務,這樣就可以獲得與正在查找其名稱的實體有關聯的組的信息。
- 鎖定— 爲了允許在分佈式系統中對共享資源進行有序的訪問,可能需要實現分佈式互斥(distributed mutexes)。ZooKeeper 提供一種簡單的方式來實現它們。
- 同步— 與互斥同時出現的是同步訪問共享資源的需求。無論是實現一個生產者-消費者隊列,還是實現一個障礙,ZooKeeper 都提供一個簡單的接口來實現該操作。
- 配置管理— 您可以使用 ZooKeeper 集中存儲和管理分佈式系統的配置。這意味着,所有新加入的節點都將在加入系統後就可以立即使用來自 ZooKeeper 的最新集中式配置。這還允許您通過其中一個 ZooKeeper 客戶端更改集中式配置,集中地更改分佈式系統的狀態。
- 領導者選舉— 分佈式系統可能必須處理節點停機的問題,您可能想實現一個自動故障轉移策略。ZooKeeper 通過領導者選舉對此提供現成的支持。
單機安裝
下載zookeeper
下載zookeeper,這裏使用的是3.4.9
配置環境變量
ZK_HOME=/Users/lidongmeng/software/zookeeper-3.4.9
PATH=$PATH:$ZK_HOME/bin
修改配置文件
複製conf/zoo_sample.cfg
到conf/zoo.cfg
中,並添加dataDir配置,如下所示,指定自己的存儲目錄:
dataDir=/Users/lidongmeng/software/zookeeper-3.4.9/data
啓動&常用命令使用
server
server 啓動
zkServer {start|start-foreground|stop|restart|status|upgrade|print-cmd}
$: zkServer start
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Starting zookeeper ... STARTED
查看server 狀態
$: zkServer status
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Mode: standalone
Client
cli啓動
$: zkCli
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
create : 創建新的node
create [-s] [-e] path data acl
-s或者-e是指定節點特性:順序或者臨時節點,默認是持久節點
[zk: localhost:2181(CONNECTED) 21] create /zk-book 123
Created /zk-book
ls: 查看當前 ZooKeeper 中所包含的內容
ls path [watch]
path 是指定的數據節點的節點路徑
[zk: localhost:2181(CONNECTED) 0] ls /
[zk-book, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /zk-book
[]
get: 查看當前 ZooKeeper指定節點的內容和屬性信息
get path [watch]
[zk: localhost:2181(CONNECTED) 2] get /zk-book
123
cZxid = 0x21c
ctime = Tue Feb 25 18:23:05 CST 2020
mZxid = 0x21c
mtime = Tue Feb 25 18:23:05 CST 2020
pZxid = 0x21c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
set: 更新指定節點的內容
set path data [version]
[zk: localhost:2181(CONNECTED) 3] set /zk-book 1000
cZxid = 0x21c
ctime = Tue Feb 25 18:23:05 CST 2020
mZxid = 0x21f
mtime = Wed Feb 26 08:40:45 CST 2020
pZxid = 0x21c
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 4] get /zk-book
1000
cZxid = 0x21c
ctime = Tue Feb 25 18:23:05 CST 2020
mZxid = 0x21f
mtime = Wed Feb 26 08:40:45 CST 2020
pZxid = 0x21c
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
delete: 刪除 ZooKeeper 中的指定節點
delete path [version]
無法刪除一個包含子節點的node
[zk: localhost:2181(CONNECTED) 5] delete /zk-book
[zk: localhost:2181(CONNECTED) 6] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 7]