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選舉等等。