官網:
https://www.apache.org/dyn/closer.cgi/zookeeper/
ZooKeeper 是 Apache 的一個頂級專案,為分布式應用提供高效、高可用的分布式協調服務,提供了諸如資料發布/訂閱、負載均衡、命名服務、分布式協調/通知和分布式鎖等分布式基礎服務,由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的穩定性,被廣泛地應用于諸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系統中,
Zookeeper 有三種運行模式:單機模式、偽集群模式和集群模式,
**單機模式:**這種模式一般適用于開發測驗環境,一方面我們沒有那么多機器資源,另外就是平時的開發除錯并不需要極好的穩定性,
**集群模式:**一個 ZooKeeper 集群通常由一組機器組成,一般 3 臺以上就可以組成一個可用的 ZooKeeper 集群了,組成 ZooKeeper 集群的每臺機器都會在記憶體中維護當前的服務器狀態,并且每臺機器之間都會互相保持通信,
**偽集群模式:**這是一種特殊的集群模式,即集群的所有服務器都部署在一臺機器上,當你手頭上有一臺比較好的機器,如果作為單機模式進行部署,就會浪費資源,這種情況下,ZooKeeper 允許你在一臺機器上通過啟動不同的埠來啟動多個 ZooKeeper 服務實體,以此來以集群的特性來對外服務,
1. 安裝
-
下載
下載zookeeper安裝包:https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
下載完成后,我們將其上傳至服務器中,然后通過tar -zxvf命令解壓,
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
-
配置
初次使用zookeeper,需要將conf目錄下的zoo_sample.cfg檔案copy一份重命名為zoo.cfg
修改dataDir目錄,dataDir表示日志檔案存放的路徑;還可以自定義修改埠啥的,詳細配置可以到官網查看,


-
啟動
相關的腳本都位于bin目錄下,常用腳本如下:
-
啟動ZK服務:
bin/zkServer.sh start
-
查看ZK服務狀態:
bin/zkServer.sh status
-
停止ZK服務:
bin/zkServer.sh stop
-
重啟ZK服務:
bin/zkServer.sh restart
-
連接服務器
zkCli.sh -timeout 0 -r -server ip:port
一般情況直接zkCli.sh即可,默認連接本地服務,
-
2. 常用操作命令
-
創建節點
create [-s] [-e] [-c] [-t ttl] path [data] [acl][-s]:sequential 序列化的,即可以重復創建,在路徑后面加上序列號
[-e]:ephemeral 臨時的,斷開連接后自動失效
[-c] :表示container node(容器節點),
[-t ttl]:表示TTL Nodes(帶超時時間的節點)
[acl]:是針對這個節點創建一個權限的,如果創建權限了,則擁有權限的才可以訪問
在同一層級下不能重復

-
洗掉節點
洗掉節點,-v表示版本號,實作樂觀鎖機制
delete [-v version] path如果需要洗掉全部節點則使用 deleteall 關鍵字即可,
-
更新節點
給節點賦值 -s回傳節點狀態
set [-s] [-v version] path data # set /person/tom 18 -
查詢節點資訊
獲取指定節點的值
get [-s] [-w] path # get /person/tom
3. Zookeeper的資料模型
如果我們把zookeeper當成是一個記憶體資料庫的話,那么crud就是對zookeeper記憶體資料庫進行一個資料的增刪改查操作,那zookeeper的資料結構是什么樣的呢?如下圖所示,zookeeper的視圖結構和標準的檔案系統非常類似,每一個節點稱之為ZNode, 是zookeeper的最小單元,每個znode上都可以保存資料以及掛載子節點,構成一個層次化的樹形結構

4. 節點型別
Zookeeper中包含4種型別的節點,分別說明如下,
4.1 持久化節點
持久化節點可以細分為兩種節點,分別是:
-
PERSISTENT:持久化,不會隨客戶端的斷開而自動洗掉,默認型別,如下圖所示

-
PERSISTENT_SEQUENTIAL:帶序號的持久化,znode的名字將被附加一個單調遞增的數字,如下圖所示

4.2 臨時節點
-
EPHEMERAL:臨時節點,當客戶端斷開時自動洗掉,如下圖所示,如果該Client創建了/Server1和/Server2這兩個節點,當Client的session斷開后,這兩個節點會被Zookeeper自動洗掉,

-
EPHEMERAL_SEQUENTIAL:帶序號的臨時節點,znode的名字將被附加一個單調遞增的數字,如下圖所示

4.3 容器節點 Container
CONTAINER:container節點是一個特殊用途的節點,它是為Leader、Lock等操作而設計的節點型別,它的作用是: 當容器節點的最后一個子節點被洗掉后,容器節點將會被標注并且在一段時間后洗掉,
由于容器節點存在這個特性,所以當我們在容器節點下創建一個子節點時,需要捕獲KeeperException.NoNodeException例外,如果捕獲到這個例外,就需要重新創建容器節點,
4.4 TTL節點
如果某個節點設定為TTL節點型別,那么這個節點在指定TTL時間(單位為毫秒)段內沒有修改并且沒有子節點時,該節點會在一段時間后被洗掉,
-
PERSISTENT_WITH_TTL:zookeeper的擴展型別,如果znode在給定的TTL內沒有被修改,它將在沒有子節點時被洗掉,要想使用該型別,必須在zookeeper的bin/zkService.sh中的啟動zookeeper的java環境中設定環境變數zookeeper.extendedTypesEnabled=true(具體做法在下邊),否則KeeperErrorCode = Unimplemented for /**,
設定zookeeper.extendedTypesEnabled=true
打開zookeeper bin/zkServer.sh(win是zkService.cmd),修改啟動zookeeper的命令,加上-Dzookeeper.extendedTypesEnabled=true,也就是設定java的一個環境變數,
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "- Dzookeeper.extendedTypesEnabled=true" "- Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & -
PERSISTENT_SEQUENTIAL_WITH_TTL:同上,是不過是帶序號的,
5. 節點特性
- 同級節點不能存在相同名字的節點
- 臨時節點不能存在位元組點
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/403914.html
標籤:其他
上一篇:hadoop 實作資料排序
