前言 本文适用于在 Centos/Debian/Ubuntu 等 Linux 发行版系统上,使用多台物理机器搭建 Zookeeper 集群。
Zookeeper 简介 Zookeeper 是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC 服务框架、分布式数据库同步系统,这些都是 Zookeeper 的应用场景。
Zookeeper 集群简介 在 Linux 生产环境上搭建 Zookeeper 集群,至少需要三个节点(服务器)。
角色划分 Zookeeper 集群有三种角色划分,分别是 leader
、follower
、observer
:
领导者(leader)
:负责进行投票的发起和决议,更新系统状态。跟随者(follower)
:用于接收客户端请求,并向客户端返回结果,以及在选举过程中参与投票观察者(observer)
:可以接收客户端连接,将写请求转发给 leader
节点,但是不参与投票过程,只同步 leader
的状态,通常用作对查询操作做负载。端口作用 2181
:对客户端端提供服务2888
: 集群内机器相互通信使用3888
: 选举 leader
使用Zookeeper 集群搭建 集群规划 节点 IP 地址 端口 版本号 节点 1 192.168.1.1 2181, 2881, 3881 3.4.10 节点 2 192.168.1.2 2181, 2881, 3881 3.4.10 节点 3 192.168.1.3 2181, 2881, 3881 3.4.10
集群搭建 Zookeeper 的最新版本可以从 官网 下载,历史版本则可以从 这里 下载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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=192.168.1.1:2881:3881 server.2=192.168.1.2:2881:3881 server.3=192.168.1.3:2881:3881
提示
server.1=192.168.1.1:2881:3881
,分别对应 server.serverid=host:tickpot:electionport
serverid
:是一个数字,表示这是第几号服务器。下文提到的 myid
文件里面有一个数据就是它的值。Zookeeper 启动时会读取该文件,然后拿到里面的数据与 zoo.cfg
里面的配置信息比较,从而判断当前节点是哪个 server
host
:服务器的地址,即主机名 / IP 地址tickpot
:服务器 Follower
与集群中的 Leader
服务器交换信息的端口electionport
:用来执行选举时服务器相互通信的端口在 Zookeeper 的 data
目录下创建 myid
文件,文件内容是是 1
(服务器编号)。
注意
myid
文件里的服务器编号可以自定义(全局唯一),但是上下不要有空行,左右不要有空格。
拷贝两份上面已经配置好的 Zookeeper 安装目录到其他服务器节点上,以此作为集群另外两个节点的安装文件,例如 zookeeper-node-2
和 zookeeper-node-3
。安装目录拷贝完成后,还需要更改另外两个节点里的 zoo.cfg
配置文件的 dataDir
与 dataLogDir
,并重新指定 myid
文件里的服务器编号。例如:
1 2 3 4 5 6 # 节点二的zoo.cfg文件 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 # 节点三的zoo.cfg文件 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 集群之前,建议关闭系统防火墙,这可以保证集群之间可以正常互相通信,否则查看 Zookeeper 状态可能会发现报如下的错误:
1 2 Client port found: 2181. Client address: 192.168.1.1. Error contacting service. It is probably not running.
管理命令 值得一提的是,Zookeeper 的管理命令(Shell 脚本)都在对应安装目录的 bin
目录下。
或者指定配置文件进行操作:
集群启动 集群正常启动后,各个节点输出的日志信息如下,此时集群的 Leader
是节点二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-cluster/zookeeper-node-1/bin/../conf/zoo.cfg Mode: follower ------------------------------------------------------------------------------- ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-cluster/zookeeper-node-2/bin/../conf/zoo.cfg Mode: leader ------------------------------------------------------------------------------- ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-cluster/zookeeper-node-3/bin/../conf/zoo.cfg Mode: follower
若希望清空 Zookeper 集群的数据,则可以先关闭集群,然后再删除 Zookeeper 安装目录下的 data
和 logs
子目录下的数据文件(不包括 myid
文件)即可。清空数据的操作不可恢复,生产环境下慎用。
测试集群 数据同步测试 1 2 3 4 5 6 7 8 9 10 [zk: 192.168.1.1:2181(CONNECTED) 3] create /test "" Created /test [zk: 192.168.1.1:2181(CONNECTED) 4] ls / [zookeeper, test ]
此时连接其他任意节点,可以发现 test
文件夹会同步创建,即在任何一个集群节点进行操作,其他集群节点也会同步更新。
1 2 3 4 5 6 [zk: 192.168.1.2:2181(CONNECTED) 0] ls / [zookeeper, test ]
宕机重新选举测试 关闭 Leader
(节点二),等待超时时间到了之后,重新查看各个节点的状态,会发现节点三被选举为新的 Leader
。
1 2 3 4 5 6 7 8 9 ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-cluster/zookeeper-node-1/bin/../conf/zoo.cfg Mode: follower ------------------------------------------------------------------------------- ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-cluster/zookeeper-node-3/bin/../conf/zoo.cfg Mode: leader
参考博客