Linux 单机搭建 Zookeeper 集群

大纲

前言

本文适用于在 Centos/Debian/Ubuntu 等 Linux 发行版系统上,使用单机搭建 Zookeeper 集群。

Zookeeper 简介

Zookeeper 是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC 服务框架、分布式数据库同步系统,这些都是 Zookeeper 的应用场景。

Zookeeper 集群简介

在 Linux 单机上搭建 Zookeeper 集群,至少需要三个节点。

角色划分

Zookeeper 集群有三种角色划分,分别是 leaderfollowerobserver

  • 领导者(leader):负责进行投票的发起和决议,更新系统状态。
  • 跟随者(follower):用于接收客户端请求,并向客户端返回结果,以及在选举过程中参与投票
  • 观察者(observer):可以接收客户端连接,将写请求转发给 leader 节点,但是不参与投票过程,只同步 leader 的状态,通常用作对查询操作做负载。

端口作用

  • 2181:对客户端端提供服务
  • 2888: 集群内机器相互通信使用
  • 3888: 选举 leader 使用

Zookeeper 集群搭建

集群规划

节点 IP 地址端口版本号
节点 1127.0.0.12181, 2881, 38813.4.10
节点 2127.0.0.12182, 2882, 38823.4.10
节点 3127.0.0.12183, 2883, 38833.4.10

集群搭建

  • Zookeeper 下载

Zookeeper 的最新版本可以从 官网 下载,历史版本则可以从 这里 下载。

  • Zookeeper 安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建安装目录
# mkdir -p /usr/local/zookeeper-cluster

# 进入安装目录
# cd /usr/local/zookeeper-cluster

# 下载压缩包
# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

# 解压文件
# tar -xvf zookeeper-3.4.10.tar.gz

# 重命名目录
# mv zookeeper-3.4.10 zookeeper-node-1

# 删除压缩包
# rm -rf zookeeper-3.4.10.tar.gz
  • Zookeeper 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入安装目录
# cd /usr/local/zookeeper-cluster/zookeeper-node-1

# 创建数据存储目录
# mkdir data

# 创建日志存储目录
# mkdir logs

# 复制配置文件
# cp conf/zoo_sample.cfg conf/zoo.cfg

# 编辑配置文件(指定以下内容即可)
# vim conf/zoo.cfg
1
2
3
4
5
6
7
8
9
# 基础配置
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-node-1/data
dataLogDir=/usr/local/zookeeper-cluster/zookeeper-node-1/logs

# 集群配置
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

提示

  1. server.1=127.0.0.1:2881:3881,分别对应 server.serverid=host:tickpot:electionport
  2. serverid:是一个数字,表示这是第几号服务器。下文提到的 myid 文件里面有一个数据就是它的值。Zookeeper 启动时会读取该文件,然后拿到里面的数据与 zoo.cfg 里面的配置信息比较,从而判断当前节点是哪个 server
  3. host:服务器的地址,即主机名 / IP 地址
  4. tickpot:服务器 Follower 与集群中的 Leader 服务器交换信息的端口
  5. electionport:用来执行选举时服务器相互通信的端口
  • Zookeeper 创建 myid 文件

在 Zookeeper 的 data 目录下创建 myid 文件,文件内容是是 1(服务器编号)。

1
2
# 创建myid文件,并写入数据
# echo "1" > /usr/local/zookeeper-cluster/zookeeper-node-1/data/myid

注意

myid 文件里的服务器编号可以自定义(全局唯一),但是上下不要有空行,左右不要有空格。

  • Zookeeper 创建多个节点

拷贝两份上面已经配置好的 Zookeeper 安装目录,以此作为集群另外两个节点的安装文件,例如 zookeeper-node-2zookeeper-node-3。安装目录拷贝完成后,还需要更改另外两个节点里的 zoo.cfg 配置文件的 clientPortdataDirdataLogDir,并重新指定 myid 文件里的服务器编号。另外两个节点的配置内容如下所示:

1
2
3
4
5
6
7
# 节点二的zoo.cfg文件
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-node-2/data
dataLogDir=/usr/local/zookeeper-cluster/zookeeper-node-2/logs

# 节点二的myid文件
# echo "2" > /usr/local/zookeeper-cluster/zookeeper-node-2/data/myid
1
2
3
4
5
6
7
# 节点三的zoo.cfg文件
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-node-3/data
dataLogDir=/usr/local/zookeeper-cluster/zookeeper-node-3/logs

# 节点三的myid文件
# echo "3" > /usr/local/zookeeper-cluster/zookeeper-node-3/data/myid

集群管理

管理命令

值得一提的是,Zookeeper 的管理命令(Shell 脚本)都在对应安装目录的 bin 目录下。

1
2
3
4
5
6
7
8
# 启动服务
# ./zkServer.sh start

# 关闭服务
# ./zkServer.sh stop

# 查看服务状态
# ./zkServer.sh status

或者指定配置文件进行操作:

1
2
3
4
5
6
7
8
# 启动服务
# ./zkServer.sh start ../conf/zoo.cfg

# 关闭服务
# ./zkServer.sh stop ../conf/zoo.cfg

# 查看服务状态
# ./zkServer.sh status ../conf/zoo.cfg

集群启动

  • 启动集群
1
2
3
# /usr/local/zookeeper-cluster/zookeeper-node-1/bin/zkServer.sh start
# /usr/local/zookeeper-cluster/zookeeper-node-2/bin/zkServer.sh start
# /usr/local/zookeeper-cluster/zookeeper-node-3/bin/zkServer.sh start
  • 查看状态
1
2
3
# /usr/local/zookeeper-cluster/zookeeper-node-1/bin/zkServer.sh status
# /usr/local/zookeeper-cluster/zookeeper-node-2/bin/zkServer.sh status
# /usr/local/zookeeper-cluster/zookeeper-node-3/bin/zkServer.sh status

集群正常启动后,各个节点输出的日志信息如下,此时集群的 Leader 是节点二

1
2
3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-cluster/zookeeper-node-1/bin/../conf/zoo.cfg
Mode: follower
1
2
3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-cluster/zookeeper-node-2/bin/../conf/zoo.cfg
Mode: leader
1
2
3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-cluster/zookeeper-node-3/bin/../conf/zoo.cfg
Mode: follower
  • 关闭集群
1
2
3
# /usr/local/zookeeper-cluster/zookeeper-node-1/bin/zkServer.sh stop
# /usr/local/zookeeper-cluster/zookeeper-node-2/bin/zkServer.sh stop
# /usr/local/zookeeper-cluster/zookeeper-node-3/bin/zkServer.sh stop
  • 清空数据

若希望清空 Zookeper 集群的数据,则可以先关闭集群,然后再删除 Zookeeper 安装目录下的 datalogs 子目录下的数据文件(不包括 myid 文件)即可。清空数据的操作不可恢复,生产环境下慎用。

1
2
3
4
5
6
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-1/data/version-2
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-1/logs/version-2
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-2/data/version-2
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-2/logs/version-2
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-3/data/version-2
# rm -rf /usr/local/zookeeper-cluster/zookeeper-node-3/logs/version-2

测试集群

数据同步测试
  • 连接节点一,并创建目录
1
2
3
4
5
6
7
8
9
10
# 连接节点一
# ./zkCli.sh -server 127.0.0.1:2181

# 创建目录
[zk: 127.0.0.1:2181(CONNECTED) 3] create /test ""
Created /test

# 查看目录信息
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /
[zookeeper, test]
  • 此时连接其他任意节点,可以发现 test 目录会同步创建,即在任何一个集群节点进行操作,其他集群节点也会同步更新。
1
2
3
4
5
6
# 连接节点二
# ./zkCli.sh -server 127.0.0.1:2182

# 查看目录信息
[zk: 127.0.0.1:2182(CONNECTED) 0] ls /
[zookeeper, test]
集群重新选举测试
  • 关闭 Leader 节点(节点二)
1
# /usr/local/zookeeper-cluster/zookeeper-node-2/bin/zkServer.sh stop
  • 查看其他节点的状态(节点一、节点三)
1
2
# /usr/local/zookeeper-cluster/zookeeper-node-1/bin/zkServer.sh status
# /usr/local/zookeeper-cluster/zookeeper-node-3/bin/zkServer.sh status
  • 等待超时时间到了之后,会发现节点三被选举为新的 Leader 节点
1
2
3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-cluster/zookeeper-node-1/bin/../conf/zoo.cfg
Mode: follower
1
2
3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-cluster/zookeeper-node-3/bin/../conf/zoo.cfg
Mode: leader

参考博客