title: ZooKeeper學習筆記一:集群搭建
categories:
- 分布式系統
- 工具
- ZooKeeper
tags: - ZooKeeper
abbrlink: 106c916e
date: 2021-06-05 16:55:00
description: '本文主要說明了ZooKeeper的集群搭建步驟'
作者:Grey
原文地址:ZooKeeper學習筆記一:集群搭建
說明
單機版的zk安裝和運行參考:https://zookeeper.apache.org/doc/r3.7.0/zookeeperStarted.html
單機版的zk只適合用於測試或者開發環境,不適合用於生產環境。
本文主要介紹zk的集群搭建。
環境
- CentOS 7
- ZooKeeper 3.7.0
准備工作
第一步,准備四個Linux實例,zk01-zk04,我的四個實例的ip分別是:
- zk01:192.168.150.128
- zk02:192.168.150.130
- zk03:192.168.150.131
- zk04:192.168.150.132
第二步,在四個實例中都安裝好jdk1.8。
安裝與配置
我們只需要在一台實例上安裝並配置好zk,然后把安裝文件和配置文件scp到其他實例即可
在zk01中,下載並解壓zk安裝包:
cd /usr/local
## 如果下載失敗,請手動下載並上傳到/usr/local目錄上
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
## 解壓
tar -xf apache-zookeeper-3.7.0-bin.tar.gz
## 重命名
mv apache-zookeeper-3.7.0-bin zookeeper
加入環境變量
vi /etc/profile
在末尾加入:
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
執行
source /etc/profile
修改zk配置文件:
# 把默認的zoo_sample.cfg拷貝一份zoo.cfg出來
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
修改zoo.cfg配置文件中的如下配置
dataDir=/data/zookeeper
增加如下配置到zoo.cfg中
server.1=192.168.150.128:2888:3888
server.2=192.168.150.130:2888:3888
server.3=192.168.150.131:2888:3888
server.4=192.168.150.132:2888:3888
創建zk01的dataDir目錄
mkdir -p /data/zookeeper
在dataDir目錄下創建一個myid文件,並寫入1
echo 1 > /data/zookeeper/myid
至此,zk01實例已經完全配置好了,現在將zk01實例上的一些安裝文件和配置文件拷貝到zk02-zk04上,
拷貝zk01上的profile文件到zk02-zk04三個節點
## 拷貝到zk02,過程中會讓你輸入yes,以及zk02的密碼
scp /etc/profile 192.168.150.130:/etc
## 拷貝到zk03
scp /etc/profile 192.168.150.131:/etc
## 拷貝到zk04
scp /etc/profile 192.168.150.132:/etc
拷貝zk01的dataDir目錄到zk02-zk04三個節點,在zk01上執行:
scp -r /data/ 192.168.150.130:/
scp -r /data/ 192.168.150.131:/
scp -r /data/ 192.168.150.132:/
拷貝zk01的zookeeper程序到zk02-zk04三個節點, 在zk01上執行:
scp -r /usr/local/zookeeper 192.168.150.130:/usr/local/
scp -r /usr/local/zookeeper 192.168.150.131:/usr/local/
scp -r /usr/local/zookeeper 192.168.150.132:/usr/local/
至此,zk02-zk04都准備好了相關文件,現在連接zk02-zk04,在zk02-zk04上分別執行如下操作
source /etc/profile
將zk02,zk03,zk04的myid文件,修改成對應的值
vi /data/zookeeper/myid
zk02的/data/zookeeper/myid修改成2
zk03的/data/zookeeper/myid修改成3
zk04的/data/zookeeper/myid修改成4
配置防火牆
firewall-cmd --zone=public --add-port=3888/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload
啟動
在zk01-zk04上分別執行:
zkServer.sh start-foreground
查看leader和follower
[root@zk01 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
說明此節點是follower節點
[root@zk03 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
在任意節點通過zk客戶端連接
zkCli.sh -server 127.0.0.1:2181
執行:
create /abc
set /abc "hello world"
其他節點都可以查看到
[zk: localhost:2181(CONNECTED) 0] get /abc
hello world
ZAB協議
Zookeeper 的核心是原子廣播機制,這個機制保證了各個 server 之間的同步。實現這個機制的協議叫做 Zab 協議。Zab 協議有兩種模式,它們分別是恢復模式和廣播模式。
-
恢復模式
當服務啟動或者在領導者崩潰后,Zab就進入了恢復模式,當領導者被選舉出來,且大多數 server 完成了和 leader 的狀態同步以后,恢復模式就結束了。狀態同步保證了 leader 和 server 具有相同的系統狀態。 -
廣播模式
一旦 leader 已經和多數的 follower 進行了狀態同步后,它就可以開始廣播消息了,即進入廣播狀態。這時候當一個 server 加入 ZooKeeper 服務中,它會在恢復模式下啟動,發現 leader,並和 leader 進行狀態同步。待到同步結束,它也參與消息廣播。ZooKeeper 服務一直維持在 Broadcast 狀態,直到 leader 崩潰了或者 leader 失去了大部分的 followers 支持。
client 端會對某個 znode 建立一個 watcher 事件,當該 znode 發生變化時,這些 client 會收到 zk 的通知,然后 client 可以根據 znode 變化來做出業務上的改變等。
單數服務器只要沒超過一半的服務器宕機就可以繼續使用, 集群規則為 2N+1 台,N >0,即最少需要 3 台。
關於四種類型的數據節點(Znode)
PERSISTENT:持久節點,除非手動刪除,否則節點一直存在於 Zookeeper 上。
EPHEMERAL:臨時節點,臨時節點的生命周期與客戶端會話綁定,一旦客戶端會話失效(客戶端與 Zookeeper連接斷開不一定會話失效),那么這個客戶端創建的所有臨時節點都會被移除。
PERSISTENT_SEQUENTIAL:持久順序節點,基本特性同持久節點,只是增加了順序屬性,節點名后邊會追加一個由父節點維護的自增整型數字。
EPHEMERAL_SEQUENTIAL:臨時順序節點,基本特性同臨時節點,增加了順序屬性,節點名后邊會追加一個由父節點維護的自增整型數字。
