摘要
Zookeeper是針對大型分布式系統的高可靠的協調系統。它基於對Paxos算法的實現,使該框架保證了分布式環境中數據的強一致性,也正是基於這樣的特性,使得ZooKeeper解決很多分布式問題。把分布式集群當成zoo,那么zookeeper就是管理員。zookeeper本身也可以是個集群,通過幾台follow機器選舉leader。zookeeper的主要作用包括,命名服務,配置管理,分布式一致性鎖,HA(High available)。真是因為zookeeper在分布式系統領域如此重要,可以說是基石,所以我們繞不開要學習其使用及原理。
本文基於Ubuntu 16.04 LTS,介紹如何搭建1主2從的zookeeper集群。
環境依賴
- 奇數台服務器,且非observer節點數>1;如果是偶數台服務器,可以把多出來的1台設置為observer
- Java 8+
- 防火牆開放2181、2888、3888端口:
ufw allow 2181
ufw allow 2888
ufw allow 3888
ufw reload
一、下載與解壓ZooKeeper
1、下載
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
2、解壓到指定位置
$ tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz -C /usr/local
$ mv /usr/local/apache-zookeeper-3.6.2-bin /usr/local/zookeeper_3.6.2
$ cd /usr/local/zookeeper_3.6.2
二、配置文件
本小節先在服務器1
上進行配置,下一小節再通過scp將配置好的ZooKeeper分發到其他服務器上,減少重復工作。
1、創建配置文件
利用模板文件zoo_sample.cfg,通過拷貝創建配置文件zoo.cfg
$ cd /usr/local/zookeeper_3.6.2/conf
$ cp zoo_sample.cfg zoo.cfg
2、創建數據目錄
$ mkdir /usr/local/zookeeper_3.6.2/data
3、修改配置文件dataDir
$ vim /usr/local/zookeeper_3.6.2/conf/zoo.cfg
#修改dataDir為如下內容
dataDir=/usr/local/zookeeper_3.6.2/data
4、添加server.id
$ vim /usr/local/zookeeper_3.6.2/conf/zoo.cfg
# 添加如下內容:
server.1=192.168.1.113:2888:3888
server.2=192.168.1.114:2888:3888
server.3=192.168.1.115:2888:3888
# server.id=zookeeper節點主機名 或 主機ip:2888:3888 選舉端口和投票端口固定
# 如果有四台zookeeper的話,由於非observer節點數必須為奇數個
# 所以如果有第四台的話,可以使用如下添加方式:
# server.4=xx.xx.xx.xx:2888:3888:observer
# id是自己定義的,0~255間,不必一次遞增,自己定即可,id表示該節點所持有的投票編號id,必需保證全局唯一
注意:不要在配置后面加注釋#,這會導致cfg文件解析失敗!從而導致zookeeper無法正常啟動!
server.A=B:C:D
中各參數解析如下:
A:其中 A 是一個數字,表示這個是服務器的編號;
B:是這個服務器的 ip 地址 或 主機名;
C:Leader選舉的端口;
D:Zookeeper服務器之間的通信端口。
5、創建myid文件
在dataDir目錄下創建myid文件
機器192.168.1.113
上:
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.113:2888:3888所指定的id:1
1
機器192.168.1.114
上:
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.114:2888:3888所指定的id:2
2
機器192.168.1.115
上:
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.115:2888:3888所指定的id:3
3
三、將ZooKeeper分發到各個節點
$ cd /usr/local/
$ scp -r zookeeper_3.6.2 root@192.168.1.114:/usr/local/
$ scp -r zookeeper_3.6.2 root@192.168.1.115:/usr/local/
四、配置環境變量
需要再各個服務器上進行配置:
vim /etc/profile
#添加如下內容
export ZOOKEEPER_HOME=/usr/local/zookeeper_3.6.2
export PATH=$ZOOKEEPER_HOME/bin:$PATH
#激活環境變量
source /etc/profile
五、啟動zkServer
在所有節點上啟動zkServer
$ zkServer.sh start
#輸出如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper_3.6.2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看集群節點狀態:
$ zkServer.sh status
#一個節點輸出如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper_3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
#另外兩個節點輸出如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper_3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
有一台服務器的zk Mode為leader
,另外兩台服務器的zk Mode為follower
,如果配置了observer
節點,則會有一台服務器的zk Mode為observer
。
停止命令:
zkServer.sh stop
重啟命令:
zkServer.sh restart
六、查看ZooKeeper日志
如果啟動過程出現了failed,可通過查看詳細日志進行分析:
$ cd /usr/local/zookeeper_3.6.2/logs
$ cat zookeeper-<somthing>.out
至此,ZooKeeper集群環境搭建結束。
參考
[1]Apache Zookeeper 集群的搭建[https://blog.csdn.net/qq_33713328/article/details/88854991]
[2]zookeeper 集群搭建[https://www.cnblogs.com/ysocean/p/9860529.html]
更多關於大數據、分布式、存儲、區塊鏈、Linux相關文章請關注我的微信公眾號:asympTech漸進線實驗室