跳转至

第六章:集群部署

集群架构

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 配置

# Observer 节点配置
server.4=node4:2888:3888:observer

# 启用 Observer
peerType=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、性能优化
  • 管理:启动、扩容、监控
  • 高可用:多数据中心、容灾切换

下一章我们将学习应用场景。