环境准备:

  • 准备Java运行环境,确保你已经安装了 java7 或者更高的版本;
  • 下载 ZooKeeper 安装包:https://zookeeper.apache.org/releases.html 我这里准备的是3.5.5版本的 apache-zookeeper-3.5.5-bin.tar

机器准备:
3台 CentOS7 的机器

  • 主机名:k8smaster,IP:192.168.43.81
  • 主机名:k8snode1, IP:192.168.43.91
  • 主机名:k8snode2, IP:192.168.43.92

Zookeeper有两种运行模式:集群模式和单机模式。

1、单机模式

下面在 k8smaster机器上(IP:192.168.43.81),演示单机模式搭建zookeeper。
将安装包解压到 /opt 目录下,并重命名安装目录为 zookeeper-3.5.5,并设置环境变量 ZK_HOME 代表该目录 /opt/zookeeper-3.5.5。

[root@k8smaster zookeeper-3.5.5]# ll /root/apache-zookeeper-3.5.5-bin.tar.gz 
-rw-r--r-- 1 root root 10622522 8月   6 2019 /root/apache-zookeeper-3.5.5-bin.tar.gz
[root@k8smaster zookeeper-3.5.5]# tar -zxvf /root/apache-zookeeper-3.5.5-bin.tar.gz -C /opt
...
...
[root@k8smaster ~]# mv /opt/apache-zookeeper-3.5.5-bin/ /opt/zookeeper-3.5.5
[root@k8smaster ~]# cd /opt/zookeeper-3.5.5/
[root@k8smaster zookeeper-3.5.5]# ll
总用量 32
drwxr-xr-x 2 2002 2002   232 4月   9 2019 bin
drwxr-xr-x 2 2002 2002    77 4月   2 2019 conf
drwxr-xr-x 5 2002 2002  4096 5月   3 2019 docs
drwxr-xr-x 2 root root  4096 12月 21 10:22 lib
-rw-r--r-- 1 2002 2002 11358 2月  15 2019 LICENSE.txt
-rw-r--r-- 1 2002 2002   432 4月   9 2019 NOTICE.txt
-rw-r--r-- 1 2002 2002  1560 5月   3 2019 README.md
-rw-r--r-- 1 2002 2002  1347 4月   2 2019 README_packaging.txt
[root@k8smaster zookeeper-3.5.5]# vim ~/.bash_profile 
[root@k8smaster zookeeper-3.5.5]# source ~/.bash_profile 
:
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

ZK_HOME=/opt/zookeeper-3.5.5
PATH=$PATH:$ZK_HOME

export PATH            

[root@k8smaster zookeeper-3.5.5]# echo $ZK_HOME 
/opt/zookeeper-3.5.5
[root@k8smaster zookeeper-3.5.5]#

初次使用 zookeeper,需要将 $ZK_HOME/conf 目录下的文件 zoo_sample.cfg 复制一份并命名为 zoo.cfg,然后进行简单的配置即可。

在 dataDir(这里配置的是 /var/lib/zookeeper)下创建一个名为 myid 的文件,在该文件的第一行写上一个数字,和 zoo.cfg 中当前机器的编号对应上 。
myid 文件中只有一个数字,即一个Server ID。例如,server.1的 myid 文件内容就是 1
注意,如果是集群模式下,请确保每个服务器的文件中的数字不同,并且和自己所在机器的 zoo.cfg 中 server.id=host:port:port 的 id 值一致。另外,id 的范围是1〜255。

[root@k8smaster zookeeper-3.5.5]# mkdir  -p /var/lib/zookeeper
[root@k8smaster zookeeper-3.5.5]# cd /var/lib/zookeeper
[root@k8smaster zookeeper]# vim myid
1
[root@k8smaster zookeeper]#

启动服务

[root@k8smaster zookeeper-3.5.5]# cd $ZK_HOME
[root@k8smaster zookeeper-3.5.5]# bin/zkServer.sh start
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@k8smaster zookeeper-3.5.5]#

查看 2181 端口,启动成功:

[root@k8smaster zookeeper-3.5.5]# ss -nultp | grep 2181
tcp    LISTEN     0      50     [::]:2181               [::]:*                   users:(("java",pid=9896,fd=43))
[root@k8smaster zookeeper-3.5.5]#

2、集群模式

像上面单机模式一样,再分别在 k8snode1 (IP:192.168.43.91) 和 k8snode2 (IP:192.168.43.92) 上搭建好单机的 zookeeper 服务。

2.1 配置 k8smaster

修改 $ZK_HOME/conf 目录下的 zoo.cfg 。

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=192.168.43.81:2888:3888
server.2=192.168.43.91:2888:3888
server.3=192.168.43.92:2888:3888

2.2 配置 k8snode1

修改dataDir(这里配置的是 /var/lib/zookeeper)下的 myid 的内容改为 2
修改 $ZK_HOME/conf 目录下的 zoo.cfg 。

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=192.168.43.81:2888:3888
server.2=192.168.43.91:2888:3888
server.3=192.168.43.92:2888:3888

2.3 配置 k8snode2

修改dataDir(这里配置的是 /var/lib/zookeeper)下的 myid 的内容改为 3
修改 $ZK_HOME/conf 目录下的 zoo.cfg 。

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=192.168.43.81:2888:3888
server.2=192.168.43.91:2888:3888
server.3=192.168.43.92:2888:3888

2.4 依次启动3台机器的zookeeper服务,并查看状态

通过 $ZK_HOME/bin/zkServer.sh start 启动服务,并通过$ZK_HOME/bin/zkServer.sh status查看服务状态

k8smaster的zookeeper状态: follower

[root@k8smaster ~]# $ZK_HOME/bin/zkServer.sh status
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@k8smaster ~]#

k8snode1的zookeeper状态: leader

[root@k8snode1 ~]# $ZK_HOME/bin/zkServer.sh status
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
[root@k8snode1 ~]#

k8snode2的zookeeper状态: follower

[root@k8snode2 ~]# $ZK_HOME/bin/zkServer.sh status
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@k8snode2 ~]#

3、zoo_sample.cfg 配置文件解读

k8smaster中的zoo_sample.cfg:

[root@k8smaster ~]# cat /opt/zookeeper-3.5.5/conf/zoo_sample.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
  • tickTime : 默认值:3000,单 位 是 毫 秒 (ms)。用于配置ZooKeeper中最小时间单元的长度,很多运行时的时间间隔都是使用 tickTime 的倍数来表示的。例如,ZooKeeper 中会话的最小超时时间默认是2*tickTime 。
  • initLimit : 默认值:10,即表示是参数 tickTime 值的10倍。用于配置Leader服务器等待Follower启动,并完成数据同步的时间。
  • syncLimit : 默认值:5,即表示是参数 tickTime 值 的 5 倍。用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。
  • dataDir : 配置 ZooKeeper 服务器存储快照文件的目录默认情况下,如果没有配置参数 dataLogDir,那么事务日志也会存储在这个目录中。考虑到事务日志的写性能直接影响ZooKeeper整体的服务能力,因此建议同时通过参数 dataLogDir 来配置 ZooKeeper 事务日志的存储目录。
  • clientPort : 配置当前服务器对外的服务端口,客户端会通过该端口和ZooKeeper服务器创建连接,一般设置为2181。每 台 ZooKeeper服务器都可以配置任意可用的端口,同时,集群中的所有服务器不需要保持 clientPort 端口一致。
  • maxClientCnxns : 默认值:60。从 Socket层面限制单个客户端与单台服务器之间的并发连接数,即以IP地址粒度来进行连接数的限制。如果将该参数设置为0 , 则表示对连接数不作任何限制。
  • autopurge.snapRetainCount : 默认值:3,用于配置 ZooKeeper在自动清理的时候需要保留的快照数据文件数量和对应的事务日志文件。
  • autopurge.purgeInterval : 默认值:1 , 单位是小时参数 autopurge.purgeInterval 和参数autopurge.snapRetainCount 配套使用,用于配置ZooKeeper 进行历史文件自动清理的频率。如果配置该值为0或负数,那么就表明不需要开启定时清理功能。
  • server.id=host:port:port : 没有默认值,在单机模式下可以不配置。该参数用于配置组成ZooKeeper集群的机器列表,其中id即为Server ID,与每台服务器myid文件中的数字相对应。同时,在该参数中,会配置两个端口:第一个端口用于指定Follower服务器与Leader进行运行时通信和数据同步时所使用的端口,第二个端口则专门用于进行Leader选举过程中的投票通信。在ZooKeeper服务器启动的时候,其会根据myid文件中配置的Server ID来确定自己是哪台服务器,并使用对应配置的端口来进行启动。