11.1.1 ZooKeeper集群角色与组件
ZooKeeper 集群由多个服务器节点组成,通过一致性协议提供高可用的协调服务。理解集群角色与组件,有助于正确规划部署、容量与故障处理。
原理草图:集群角色与请求流转
集群角色
- Leader(领导者):负责写请求的顺序化与提案(proposal)生成,协调事务提交,并处理客户端的写请求。
- Follower(跟随者):接收 Leader 的事务提案并进行投票,处理客户端读请求,必要时转发写请求给 Leader。
- Observer(观察者):只接收并应用 Leader 的事务,不参与投票;适用于提升读性能和横向扩展,但不影响法定人数(quorum)。
核心组件
- 客户端(Client):通过会话与服务端建立连接,发起读写请求并注册 Watcher。
- 服务端(Server):运行 ZooKeeper 进程,维护内存数据树与事务日志,承担选举、同步与请求处理。
- 事务日志(Zxid Log):记录所有已提交事务,提供顺序一致性与故障恢复基础。
- 快照(Snapshot):定期将内存数据树持久化,缩短重放日志时间。
- 数据树(Data Tree):内存中的分层节点结构,支持版本与访问控制。
- 网络与会话管理:维护与客户端的 TCP 连接、心跳与超时控制,保证会话生命周期。
角色协作流程概览
1. 客户端与任一服务端建立会话。
2. 读请求通常由本地服务端直接返回。
3. 写请求由 Leader 统一排序并广播提案。
4. Followers/Observers 应用提案,Follower 投票达成法定人数后提交。
法定人数与高可用
- 推荐奇数节点数(3/5/7)以提高容错能力。
- Follower 参与投票,Observer 不参与投票。
- 集群可容忍的故障数为:(N-1)/2。
示例:三节点 + 1 Observer 配置与角色验证#
1)最小安装与目录结构(示例路径)
# 以 Linux 发行版自带包为例(也可用官方二进制包)
sudo yum install -y zookeeper
sudo mkdir -p /data/zookeeper/{data,logs}
2)配置示例 /etc/zookeeper/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
# 三个投票节点
server.1=10.0.0.11:2888:3888
server.2=10.0.0.12:2888:3888
server.3=10.0.0.13:2888:3888
# 一个 Observer 节点
server.4=10.0.0.14:2888:3888:observer
3)每台机器设置 myid
# 10.0.0.11
echo 1 | sudo tee /data/zookeeper/data/myid
# 10.0.0.12
echo 2 | sudo tee /data/zookeeper/data/myid
# 10.0.0.13
echo 3 | sudo tee /data/zookeeper/data/myid
# 10.0.0.14
echo 4 | sudo tee /data/zookeeper/data/myid
4)启动与查看角色
# 启动
sudo systemctl start zookeeper
# 查看状态(角色)
/usr/lib/zookeeper/bin/zkServer.sh status
# 预期输出示例(不同节点不同)
# Mode: leader / follower / observer
5)通过 4LW 命令验证
# 需要在 zoo.cfg 启用 4LW 白名单
# 4lw.commands.whitelist=stat,ruok,conf,mntr
# 角色与会话状态
echo stat | nc 10.0.0.12 2181
# 预期关键字段:
# Mode: leader
# zxid: 0x...
命令解释与关键点#
zkServer.sh status:输出当前节点角色(Leader/Follower/Observer)。stat:返回角色、会话与连接信息;用于快速判断选举是否完成。mntr:输出集群指标(leader/follower 状态、延迟等)。
常见问题排错#
1)节点一直处于 LOOKING(未选举)
# 检查网络与端口(投票端口 2888/3888)
ss -lntp | egrep '2181|2888|3888'
telnet 10.0.0.12 3888
- 可能原因:防火墙阻断、server.X 地址写错、myid 不一致。
2)Observer 误参与投票
# 检查配置是否写明 :observer
grep 'server.4' /etc/zookeeper/zoo.cfg
- 可能原因:未追加
:observer,导致被当作 Follower 处理。
3)写请求报 NotLeader
# 客户端连接到了非 Leader
# 通过 stat 找到 Leader 后重试
echo stat | nc 10.0.0.11 2181
练习#
- 部署 3 节点集群,分别查看
zkServer.sh status,记录 Leader/Follower 分布。 - 新增 1 个 Observer,验证
stat输出中的Mode: observer。 - 人为停掉 Leader,观察选举时间与新 Leader 产生,记录
stat输出变化。