Linux下搭建ZooKeeper叢集
阿新 • • 發佈:2021-02-27
## 摘要
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埠:
```shell
ufw allow 2181
ufw allow 2888
ufw allow 3888
ufw reload
```
## 一、下載與解壓ZooKeeper
### 1、下載
```shell
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
```
### 2、解壓到指定位置
```shell
$ 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
```shell
$ cd /usr/local/zookeeper_3.6.2/conf
$ cp zoo_sample.cfg zoo.cfg
```
### 2、建立資料目錄
```shell
$ mkdir /usr/local/zookeeper_3.6.2/data
```
### 3、修改配置檔案dataDir
```shell
$ vim /usr/local/zookeeper_3.6.2/conf/zoo.cfg
#修改dataDir為如下內容
dataDir=/usr/local/zookeeper_3.6.2/data
```
### 4、新增server.id
```shell
$ 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`中各引數解析如下:
```shell
A:其中 A 是一個數字,表示這個是伺服器的編號;
B:是這個伺服器的 ip 地址 或 主機名;
C:Leader選舉的埠;
D:Zookeeper伺服器之間的通訊埠。
```
### 5、建立myid檔案
在dataDir目錄下建立myid檔案
機器`192.168.1.113`上:
```shell
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.113:2888:3888所指定的id:1
1
```
機器`192.168.1.114`上:
```shell
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.114:2888:3888所指定的id:2
2
```
機器`192.168.1.115`上:
```shell
$ vim /usr/local/zookeeper_3.6.2/data/myid
#輸入server.1=192.168.1.115:2888:3888所指定的id:3
3
```
## 三、將ZooKeeper分發到各個節點
```shell
$ cd /usr/local/
$ scp -r zookeeper_3.6.2 [email protected]:/usr/local/
$ scp -r zookeeper_3.6.2 [email protected]:/usr/local/
```
## 四、配置環境變數
需要再各個伺服器上進行配置:
```shell
vim /etc/profile
#新增如下內容
export ZOOKEEPER_HOME=/usr/local/zookeeper_3.6.2
export PATH=$ZOOKEEPER_HOME/bin:$PATH
#啟用環境變數
source /etc/profile
```
## 五、啟動zkServer
在**所有節點**上啟動zkServer
```shell
$ zkServer.sh start
#輸出如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper_3.6.2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
```
檢視叢集節點狀態:
```shell
$ 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`。
停止命令:
```shell
zkServer.sh stop
```
重啟命令:
```shell
zkServer.sh restart
```
## 六、檢視ZooKeeper日誌
如果啟動過程出現了failed,可通過檢視詳細日誌進行分析:
```shell
$ cd /usr/local/zookeeper_3.6.2/logs
$ cat zookeeper-.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漸進線實驗室**
![](https://img2020.cnblogs.com/blog/1001136/202102/1001136-20210227152300262-9148764