ZooKeeper是一個為分布式應用所設計的分布的、開源的協調服務,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。ZooKeeper本身可以以Standalone模式安裝運行,不過它的長處在於通過分布式ZooKeeper集群(一個Leader,多個Follower),基於一定的策略來保證ZooKeeper集群的穩定性和可用性,從而實現分布式應用的可靠性。ZooKeeper是作為分布式協調服務,是不需要依賴於Hadoop的環境,也可以為其他的分布式環境提供服務。
zookeeper有單機、偽集群、集群三種部署方式,可根據自己對可靠性的需求選擇合適的部署方式。下邊對這三種部署方式逐一進行講解。
一、單機安裝
准備:
關閉防火牆:systemctl stop firewalld.service
禁止防火牆自動啟動:systemctl disable firewalld.service
關閉selinux : setenforce 0
禁止selinux啟動:vim /etc/selinux/config
SELINUX=disabled
各節點的host解析:
10.0.0.11 node01
10.0.0.12 node02
10.0.0.13 node03
1.1 下載
進入要下載的版本的目錄,選擇.tar.gz文件下載,這里我們選擇最新版
下載鏈接:http://archive.apache.org/dist/zookeeper/
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
1.2 安裝
使用tar解壓要安裝的目錄即可
這里以解壓到/usr/local,實際安裝根據自己的想安裝的目錄修改(注意如果修改,那后邊的命令和配置文件中的路徑都要相應修改)
tar xf apache-zookeeper-3.5.5-bin.tar.gz
-C /usr/local/src/ ln -s /usr/local/src/apache-zookeeper-3.5.5-bin /usr/local/zookeeper
1.3 配置
在主目錄下創建data和logs兩個目錄用於存儲數據和日志:
mkdir -p /data/zookeeper/{data,logs}
在conf目錄下新建zoo.cfg文件,寫入以下內容保存:
vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
添加環境變量:
echo -e 'export ZOOKEEPER_HOME=/usr/local/zookeeper\nexport PATH=$ZOOKEEPER_HOME/bin:$PATH' >>/etc/profile
source /etc/profile
1.4 啟動和停止
進入bin目錄,啟動、停止、重啟(start、stop、restart和status)分和查看當前節點狀態(包括集群中是何角色)別執行:
zkServer.sh start
二、偽集群模式
偽集群模式就是在同一主機啟動多個zookeeper並組成集群,下邊以在node01主機上創3個zookeeper組集群為例。將單節點的zookeeper,復制成zookeeper1/zookeeper2/zookeeper3三份。
2.1 zookeeper1配置
zookeeper1配置文件修改如下:
vim /usr/local/zookeeper1/conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper1/data
dataLogDir=/usr/local/zookeeper1/logs
clientPort=2181
initLimit=5
syncLimit=2
server.1=node01:2888:3888
server.2=node01:4888:5888
server.3=node01:6888:7888
zookeeper1的/data/zookeeper/data/myid配置如下:
echo '1' > /data/zookeeper/data/myid
2.2 zookeeper2配置
zookeeper2配置文件conf/zoo.cfg修改如下:
vim /usr/local/zookeeper2/conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper2/data
dataLogDir=/usr/local/zookeeper2/logs
clientPort=3181
initLimit=5
syncLimit=2
server.1=node01:2888:3888
server.2=node01:4888:5888
server.3=node01:6888:7888
zookeeper2的/data/zookeeper/data/myid配置如下:
echo '2' > /data/zookeeper/data/myid
2.3 zookeeper3配置
zookeeper3配置文件conf/zoo.cfg修改如下:
vim /usr/local/zookeeper3/conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper3/data
dataLogDir=/usr/local/zookeeper3/logs
clientPort=4181
initLimit=5
syncLimit=2
server.1=node01:2888:3888
server.2=node01:4888:5888
server.3=node01:6888:7888
zookeeper3的/data/zookeeper/data/myid配置如下:
echo '3' > /data/zookeeper/data/myid
啟動zookeeper,啟動順序隨意沒要求。
zkServer.sh start
三、集群模式
集群模式就是在不同主機上安裝zookeeper然后組成集群的模式;下邊以在node01、node02和node03三台主機為例。將第1.1到1.3步中安裝好的zookeeper打包復制到node02和node03上,並都解壓到同樣的目錄下。
3.1 conf/zoo.cfg文件修改
三個zookeeper的conf/zoo.cfg修改如下:
vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
initLimit=5
syncLimit=2
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
#2888端口號是zookeeper服務之間通信的端口,而3888是zookeeper與其他應用程序通信的端口,對於137和138,由於安裝目錄都是zookeeper所以dataDir和dataLogDir不需要改變,又由於在不同機器上所以clientPort也不需要改變
所以此時137和138的conf/zoo.cfg的內容與136一樣即可。
3.2 /data/zookeeper/data/myid文件修改
136 /data/zookeeper/data/myid修改如下:
echo '1' > /data/zookeeper/data/myid
137 /data/zookeeper/data/myid修改如下:
echo '2' > /data/zookeeper/data/myid
138 /data/zookeeper/data/myid修改如下:
echo '3' > /data/zookeeper/data/myid
啟動zookeeper集群,啟動順序隨意沒要求。
zkServer.sh start
四、 驗證Zookeeper集群是否安裝成功。
可以驗證一下是否啟動成功:
ps -ef | grep zookeeper
4.1分別在3台虛擬機上查看zookeeper的狀態。
zkServer.sh status
4.2連接其中一台的zookeeper
zkCli.sh -server node02:2181
4.3寫入數據
create /test data
4.4再連接另外一台的zookeeper
zkCli.sh -server node03:2181
4.5如果能獲取到剛才寫入的數據,則Zookeeper集群安裝成功。
get /test
五、報錯及處理
應用連接zookeepr報錯:Session 0x0 for server node01/node01:2181,unexpected error,closing socket connection and attempting reconnect;
先看端口能否telnet通,如果通則使用zkServer.sh status查看zk是否確實已啟動,沒啟查看zookeeper.out中的報錯。
zookeeper.out中報錯:“zookeeper address already in use”;顯然端口被占用,要么是其他進程占用了配置的端口,要么是上邊配置的clientPort和server中的端口有重復。
zookeeper.out中報錯:Cannot open channel to 2 at election address /node01:3888;這應該只是組成集群的node02節點未啟動,到node02啟動起來zk即會正常。