第六章:集群部署¶
集群架构¶
Leader-Follower 模型¶
┌─────────────────────────────────────────────────────────────┐
│ ZooKeeper 集群架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ Leader │ │
│ │ (写请求) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Follower │ │ Follower │ │ Follower │ │
│ │ (读请求) │ │ (读请求) │ │ (读请求) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │
│ └────────────┼────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ ZAB 协议 │ │
│ │ 原子广播 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
角色¶
| 角色 | 说明 |
|---|---|
| Leader | 处理所有写请求,广播状态变更 |
| Follower | 处理读请求,参与投票 |
| Observer | 处理读请求,不参与投票 |
ZAB 协议¶
消息广播¶
Leader Follower
│ │
│──── Proposal (P1) ────────────►│
│ │
│◄─── ACK (P1) ──────────────────│
│◄─── ACK (P1) ──────────────────│
│◄─── ACK (P1) ──────────────────│
│ │
│──── Commit (P1) ──────────────►│
│ │
崩溃恢复¶
1. 选举阶段
- 选出新的 Leader
- 确保数据一致性
2. 发现阶段
- Follower 连接新 Leader
- 同步最新状态
3. 同步阶段
- Leader 发送缺失的事务
- Follower 应用事务
集群配置¶
基本配置¶
# zoo.cfg
# 心跳间隔(毫秒)
tickTime=2000
# 初始化连接超时(tickTime 倍数)
initLimit=10
# 同步超时(tickTime 倍数)
syncLimit=5
# 数据目录
dataDir=/data/zookeeper
# 客户端端口
clientPort=2181
# 集群配置
# server.id=host:peerPort:electionPort
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
Observer 配置¶
性能优化¶
# 快照数量
snapCount=100000
# 最小会话超时
minSessionTimeout=4000
# 最大会话超时
maxSessionTimeout=40000
# 全局会话数量限制
maxSessionTimeout=40000
# 自动清理
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
集群管理¶
启动集群¶
# 在每个节点上启动
/opt/zookeeper/bin/zkServer.sh start
# 查看状态
/opt/zookeeper/bin/zkServer.sh status
# 输出示例
Mode: leader # Leader 节点
Mode: follower # Follower 节点
动态扩容¶
# 1. 修改配置文件,添加新节点
server.4=node4:2888:3888
# 2. 重启现有节点(滚动重启)
# 3. 启动新节点
# 动态配置(ZooKeeper 3.5+)
zkCli.sh
# 添加服务器
reconfig -add server.4=node4:2888:3888;2181
监控集群¶
# 使用四字命令
echo ruok | nc localhost 2181
# 输出: imok
echo stat | nc localhost 2181
# 输出集群状态
echo mntr | nc localhost 2181
# 输出监控指标
echo conf | nc localhost 2181
# 输出配置信息
echo cons | nc localhost 2181
# 输出连接信息
高可用配置¶
多数据中心部署¶
数据中心 A 数据中心 B
┌─────────────┐ ┌─────────────┐
│ Leader │ │ Observer │
│ (node1) │◄──────►│ (node4) │
│ │ │ │
│ Follower │ │ Observer │
│ (node2) │ │ (node5) │
│ │ │ │
│ Follower │ │ Observer │
│ (node3) │ │ (node6) │
└─────────────┘ └─────────────┘
容灾切换¶
# 1. 检测 Leader 故障
zkServer.sh status
# 2. 自动选举新 Leader
# ZAB 协议会自动选举
# 3. 验证集群状态
echo stat | nc node1 2181
echo stat | nc node2 2181
echo stat | nc node3 2181
Kubernetes 部署¶
apiVersion: v1
kind: Service
metadata:
name: zookeeper
spec:
ports:
- port: 2181
name: client
- port: 2888
name: peer
- port: 3888
name: election
clusterIP: None
selector:
app: zookeeper
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
spec:
serviceName: zookeeper
replicas: 3
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.8
ports:
- containerPort: 2181
name: client
- containerPort: 2888
name: peer
- containerPort: 3888
name: election
env:
- name: ZOO_MY_ID
valueFrom:
fieldRef:
fieldPath: metadata.name
command:
- /bin/sh
- -c
- |
ZOO_MY_ID=$(hostname | sed 's/zookeeper-//')
echo $ZOO_MY_ID > /data/myid
/docker-entrypoint.sh zkServer.sh start-foreground
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
小结¶
集群部署要点:
- 架构:Leader-Follower 模型
- ZAB 协议:消息广播、崩溃恢复
- 配置:基本配置、Observer、性能优化
- 管理:启动、扩容、监控
- 高可用:多数据中心、容灾切换
下一章我们将学习应用场景。