centos8平台安裝zookeeper3.6集群


一,規划三台zk服務器構成集群

ip:172.18.1.1        機器名:zk1     對應myid: 1
ip:172.18.1.2        機器名:zk2     對應myid: 2
ip:172.18.1.3        機器名:zk3     對應myid: 3

 

說明:為什么zookeeper集群的數量需要是單數?

1,為了容錯,增刪改操作中需要半數以上服務器通過才算成功,

2,防腦裂,一個zookeeper集群中,必需有且只能有一台leader服務器

    當leader服務器宕機時,剩下的服務器會通過半數以上投票選出一個新的leader服務器

集群總數共2台時,半數是1,半數以上最少是2,也就是一台也不能宕機

集群總數共3台時,半數是1.5,半數以上最少是2,也就是允許一台能宕機
集群總數共4台時,半數是2,半數以上最少是3,也就是允許一台能宕機

集群總數共5台時,半數是2.5,半數以上最少是3,也就是允許兩台能宕機,
集群總數共6台時,半數是3,半數以上最少是4,也就是允許兩台能宕機,

可見

    允許兩台能宕機:5台比6台成本更低

    允許一台能宕機:3台比4台成本更低

 

說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest

         對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/

 說明:作者:劉宏締 郵箱: 371125307@qq.com

 

二,在每台服務器上安裝zookeeper之安裝java

說明:jdk的安裝包請從java官方站下載

1,解壓並安裝

[root@zookeeper ~]# cd /usr/local/source/
[root@zookeeper source]# tar -zxvf jdk-13.0.2_linux-x64_bin.tar.gz
[root@zookeeper source]# mkdir /usr/local/soft
[root@zookeeper source]# mv jdk-13.0.2 /usr/local/soft/

 

2,配置環境變量:

[root@zookeeper source]# vi /etc/profile

在末尾處添加環境變量:

export JAVA_HOME=/usr/local/soft/jdk-13.0.2
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

使環境變量生效:

[root@zookeeper source]# source /etc/profile

 

3,查看版本,檢驗安裝是否生效

[root@zookeeper source]# java --version
java 13.0.2 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)

 

三,在每台服務器上安裝zookeeper之安裝zookeeper

1,安裝wget,供文件下載時使用:

[root@zookeeper source]# yum install wget

 

2,下載zookeeper

[root@zookeeper source]# wget https://downloads.apache.org/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz

 

3,解壓,安裝

[root@zookeeper source]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@zookeeper source]# mv apache-zookeeper-3.6.0-bin/ /usr/local/soft/

 

4,創建數據和日志目錄

[root@zookeeper source]# mkdir -p /data/zookeeper
[root@zookeeper source]# mkdir -p /data/zookeeper/data
[root@zookeeper source]# mkdir -p /data/zookeeper/datalogs
[root@zookeeper source]# mkdir -p /data/zookeeper/logs

說明:

      data:數據目錄

      datalogs:事務日志

      logs:zk應用的日志

5,生成配置文件:

[root@zookeeper source]# cd /usr/local/soft/apache-zookeeper-3.6.0-bin/conf/
[root@zookeeper conf]# cp zoo_sample.cfg zoo.cfg 

 

6,設置配置文件:

[root@zookeeper conf]# vi zoo.cfg

內容:

dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalogs
admin.enableServer=false

說明:admin.enableServer=false 用來關閉zk內置的web管理器

dataDir 定義了zk的數據目錄

dataLogDir 定義了zk的事務日志

 

7,配置環境變量

[root@zookeeper conf]# vi /etc/profile

在末尾增加以下內容:

export ZK_HOME=/usr/local/soft/apache-zookeeper-3.6.0-bin
export PATH=$ZK_HOME/bin:$PATH

使環境變量生效:

[root@zookeeper conf]# source /etc/profile

 

8,測試啟動和停止zookeeper

[root@zookeeper conf]# zkServer.sh start
[root@zookeeper conf]# zkServer.sh stop

 

四,在每台服務器上安裝zookeeper之使zookeeper支持systemd

1,修改zkEnv.sh這個腳本

[root@zookeeper conf]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkEnv.sh

添加如下一行

JAVA_HOME=/usr/local/soft/jdk-13.0.2

到ZOOBINDIR=一行的上方

說明:為了解決從systemctl啟動時找不到java而報錯

 

2,找到ZOO_LOG_DIR一行,修改為:

ZOO_LOG_DIR="/data/zookeeper/logs"

用來記錄zk運行時的日志

 

3,增加service文件,用來供systemd啟動使用:

[root@zookeeper conf]# vi /etc/systemd/system/zookeeper.service

內容:

[Unit]
Description=zookeeper.service
After=network.target
ConditionPathExists=/usr/local/soft/apache-zookeeper-3.6.0-bin/conf/zoo.cfg

[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh start
ExecStop=/usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh stop

[Install]
WantedBy=multi-user.target

 

3,測試啟動/停止zk:

[root@zookeeper conf]# systemctl daemon-reload
[root@zookeeper conf]# systemctl start zookeeper
[root@zookeeper conf]# systemctl stop zookeeper

 

五,在每台服務器上安裝zookeeper之查看當前已安裝zk的版本:

1,安裝nc,查看版本時作為工具使用

[root@zookeeper conf]# yum install nc

 

2,顯示版本時會報錯

[root@zookeeper conf]# echo stat|nc 127.0.0.1 2181
stat is not executed because it is not in the whitelist.

解決:

[root@zookeeper conf]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh

在這個fi下面添加一行

ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi

新加一行:

ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

保存退出后重啟服務:

[root@zookeeper conf]# systemctl stop zookeeper
[root@zookeeper conf]# systemctl start zookeeper

 

3,再次查看zk版本

[root@zookeeper conf]# echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT
Clients:
 /127.0.0.1:47654[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 5

 

六,在三台zookeeper服務器上做集群配置

1,配置文件中增加集群配置

[root@zk1 ~]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/conf/zoo.cfg

添加如下配置內容

#cluster
server.1=172.18.1.1:2888:3888
server.2=172.18.1.2:2888:3888
server.3=172.18.1.3:2888:3888

 

說明:server.n  n是一個數字,表示zookeeper服務器的序號

      2888是在集群中follower連接到leader時使用的端口,

     也就是:leader上開放此端口,follower連接到leader此端口訪問數據

     3888:集群內進行leader選舉時使用的端口

說明:三台機器上都添加此集群配置,   配置內容相同

 

2,給每個機器指定id

在每台機器上zoo.cfg里dataDir指定的目錄下,生成一個id值文件:myid

說明:myid內的值,要和本機ip對應的zoo.cfg中序號一致

zk1(172.18.1.1)上

[root@zk1 ~]# vi /data/zookeeper/data/myid
[root@zk1 ~]# more /data/zookeeper/data/myid 
1

 

zk2(172.18.1.2)上

[root@zk2 ~]# vi /data/zookeeper/data/myid
[root@zk2 ~]# more /data/zookeeper/data/myid
2

 

zk3(172.18.1.3)上

[root@zk3 ~]# vi /data/zookeeper/data/myid
[root@zk3 ~]# more /data/zookeeper/data/myid
3

 

七,逐台啟動服務器,檢查各zookeeper的狀態

1,啟動zk服務

在三台機器上分別執行:

systemctl start zookeeper

 

2,分別在三台機器上檢查狀態:

[root@zk1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

它的工作模式是: follower

 

[root@zk2 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

它的工作模式是: leader

 

[root@zk3 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

它的工作模式是: follower

 

3,mode也可以用stat這個四字命令查看,例子:

[root@zk1 ~]# echo stat | nc 172.18.1.1 2181
Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT
Clients:
 /172.18.1.1:59284[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/1.9375/41
Received: 34
Sent: 33
Connections: 1
Outstanding: 0
Zxid: 0x100000004
Mode: follower
Node count: 6

 

4,單機方式運行的zookeeper服務的mode是什么?

[root@zk /]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone

可以看到,其Mode是standalone

 

八,測試:連接到zk服務,創建一個znode

1,在zk3上創建節點:

[root@zk3 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost(CONNECTED) 1] create /demo 'this is a demo'
Created /demo
[zk: localhost(CONNECTED) 2] ls /
[demo, zookeeper]

 

2,從zk1上查看節點:

[root@zk1 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 2] get /demo
this is a demo

可見創建的節點已同步到了zk1

 

九,測試:模擬zk集群一個節點發生故障后的處理?

1,當前zk2是leader,我們停掉它,然后看各服務器的mode變化:

停掉zk2

[root@zk2 ~]# systemctl stop zookeeper

 

zk1上查看狀態

[root@zk1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

zk1仍然是follower

 

zk3上查看狀態

[root@zk3 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

zk3變成了leader

 

2,重新啟動zk2:

[root@zk2 ~]# systemctl start zookeeper

 

再次查看狀態,變成了 follower

[root@zk2 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

 

3,在zk1上寫入數據,從zk2上觀察效果

[root@zk1 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 1] create /demo2 'demo2'
Created /demo2
[zk: localhost(CONNECTED) 2] get /demo2
demo2

 

回到zk2

[root@zk2 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 1] get /demo2
demo2

 

4,結論:zookeeper的集群模式能有效的防止單點故障

 

十,查看centos的版本

[root@localhost liuhongdi]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM