zookeeper的介紹與搭建
- 2019 年 12 月 5 日
- 筆記
1、簡介
它是一個分散式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分散式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分散式應用配置項的管理等。
上面的解釋有點抽象,簡單來說zookeeper=文件系統+監聽通知機制。
2、文件系統
Zookeeper維護一個類似文件系統的數據結構:

每個子目錄項如 NameService 都被稱作為 znode(目錄節點),和文件系統一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在於znode是可以存儲數據的。
3、有四種類型的znode
1.PERSISTENT-持久化目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在
2.PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
3.EPHEMERAL-臨時目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除
4.EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
4、監聽通知機制
客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。
5、Zookeeper能做什麼
zookeeper功能非常強大,可以實現諸如分散式應用配置管理、統一命名服務、狀態同步服務、集群管理等功能,我們這裡拿比較簡單的分散式應用配置管理為例來說明。
假設我們的程式是分散式部署在多台機器上,如果我們要改變程式的配置文件,需要逐台機器去修改,非常麻煩,現在把這些配置全部放到zookeeper上去,保存在 zookeeper 的某個目錄節點中,然後所有相關應用程式對這個目錄節點進行監聽,一旦配置資訊發生變化,每個應用程式就會收到 zookeeper 的通知,然後從 zookeeper 獲取新的配置資訊應用到系統中。

如上,你大致應該了解zookeeper是個什麼東西,大概能做些什麼了,我們馬上來學習下zookeeper的安裝及使用,並開發一個小程式來實現zookeeper這個分散式配置管理的功能
6、Zookeeper單機模式安裝
6.1配置JAVA環境,檢驗環境:java -version
[root@serverd conf]# cd /opt/ [root@serverd opt]# ls jdk-8u91-linux-x64.tar.gz [root@serverd opt]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/ [root@serverd opt]# ln -s /usr/local/jdk1.8.0_91/ /usr/local/java [root@serverd opt]# sed -i.ori '$a export JAVA_HOME=/usr/local/java nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile [root@serverd opt]# source /etc/profile [root@serverd opt]# java -version java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b14) Java HotSpot(TM) 64-BitServer VM (build 25.91-b14, mixed mode)
6.2下載並安裝zookeeper
[root@serverd ~]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz [root@serverd ~]# tar xf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@serverd ~]# ln -s /usr/local/zookeeper-3.4.14/ /usr/local/zookeeper [root@serverd ~]# cd /usr/local/zookeeper/conf/ [root@serverd conf]# cp zoo_sample.cfg zoo.cfg [root@serverd conf]# cd ../bin/ [root@serverd bin]# ./zkServer.sh start
7、使用客戶端命令操作zookeeper
[root@serverd bin]# ./zkCli.sh ##使用 ls 命令來查看當前 ZooKeeper 中所包含的內容 [zk: localhost:2181(CONNECTED) 0] ls/ [zookeeper] ##創建一個新的 znode ,使用 create /zkPro myData [zk: localhost:2181(CONNECTED) 1] create /zkPro myData Created /zkPro ##再次使用 ls 命令來查看現在 zookeeper 中所包含的內容 [zk: localhost:2181(CONNECTED) 2] ls/ [zookeeper, zkPro] ##下面我們運行 get 命令來確認第二步中所創建的 znode 是否包含我們所創建的字元串 [zk: localhost:2181(CONNECTED) 3] get/zkPro myData cZxid =0x2 ctime =Fri Nov 2223:02:34 CST 2019 mZxid =0x2 mtime =Fri Nov 2223:02:34 CST 2019 pZxid =0x2 cversion =0 dataVersion =0 aclVersion =0 ephemeralOwner =0x0 dataLength =6 numChildren =0 ##下面我們通過 set 命令來對 zk 所關聯的字元串進行設置 [zk: localhost:2181(CONNECTED) 5] set/zkPro myData123 cZxid =0x2 ctime =Fri Nov 2223:02:34 CST 2019 mZxid =0x3 mtime =Fri Nov 2223:03:39 CST 2019 pZxid =0x2 cversion =0 dataVersion =1 aclVersion =0 ephemeralOwner =0x0 dataLength =9 numChildren =0 ##下面我們將剛才創建的 znode 刪除 [zk: localhost:2181(CONNECTED) 6] delete /zkPro
8、Zookeeper集群模式安裝(需提前安裝好jdk見上文)
8.1軟體下載地址
[root@zookeeper-kafka-01 ~]# cd /usr/local/src/ [root@zookeeper-kafka-01 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz [root@zookeeper-kafka-02 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz [root@zookeeper-kafka-03 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
8.2配置三台主機hosts文件一致
[root@zookeeper-kafka-01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.17.120.12 ZooKeeper-Kafka-01 172.17.120.13 ZooKeeper-Kafka-02 172.17.120.14 ZooKeeper-Kafka-03
8.3安裝zookeeper
[root@ZooKeeper-Kafka-01 src]# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@ZooKeeper-Kafka-01 src]# cd .. [root@ZooKeeper-Kafka-01 local]# ln -s zookeeper-3.4.14 zookeeper [root@ZooKeeper-Kafka-01 local]# cd zookeeper/conf/ [root@ZooKeeper-Kafka-01 conf]# cp zoo_sample.cfg zoo.cfg ##結尾添加 29server.1=ZooKeeper-Kafka-01:2888:3888 30server.2=ZooKeeper-Kafka-02:2888:3888 31server.3=ZooKeeper-Kafka-03:2888:3888
8.4創建dataDir目錄創建/tmp/zookeeper
[root@ZooKeeper-Kafka-01 conf]# mkdir /tmp/zookeeper [root@ZooKeeper-Kafka-01 conf]# touch /tmp/zookeeper/myid [root@ZooKeeper-Kafka-01 conf]# echo 1 > /tmp/zookeeper/myid
8.5將zookeeper文件複製到另外兩個節點
[root@ZooKeeper-Kafka-01 local]# scp -r zookeeper-3.4.14/ 10.200.3.86:/usr/local/ [root@ZooKeeper-Kafka-01 local]# scp -r zookeeper-3.4.14/ 10.200.3.87:/usr/local/
8.5在兩個slave節點創建目錄和文件
##ZooKeeper-Kafka-02節點 [root@ZooKeeper-Kafka-02 local]# ln -s zookeeper-3.4.10 zookeeper [root@ZooKeeper-Kafka-02 local]# mkdir /tmp/zookeeper [root@ZooKeeper-Kafka-02 local]# touch /tmp/zookeeper/myid [root@ZooKeeper-Kafka-02 local]# echo 2 > /tmp/zookeeper/myid ##ZooKeeper-Kafka-03節點 [root@ZooKeeper-Kafka-03 local]# ln -s zookeeper-3.4.10 zookeeper [root@ZooKeeper-Kafka-03 local]# mkdir /tmp/zookeeper [root@ZooKeeper-Kafka-03 local]# touch /tmp/zookeeper/myid [root@ZooKeeper-Kafka-03 local]# echo 3 > /tmp/zookeeper/myid
8.6分別在每個節點上啟動 zookeeper測試
[root@ZooKeeper-Kafka-01 zookeeper]# ./bin/zkServer.sh start [root@ZooKeeper-Kafka-02 zookeeper]# ./bin/zkServer.sh start [root@ZooKeeper-Kafka-03 zookeeper]# ./bin/zkServer.sh start
8.7查看狀態
[root@ZooKeeper-Kafka-01 zookeeper]# ./bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower [root@ZooKeeper-Kafka-02 zookeeper]# ./bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: leader [root@ZooKeeper-Kafka-03 zookeeper]# ./bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower
9、總結
至此,我們對zookeeper就算有了一個入門的了解,當然zookeeper遠比我們這裡描述的功能多,比如用zookeeper實現集群管理,分散式鎖,分散式隊列,zookeeper集群leader選舉等等。