ZooKeeper 学习笔记

ZooKeeper 学习笔记

基于 3 台云服务器集群实战整理(文中 IP 均为示例,已脱敏)

版本:3.8.6 (华为云镜像安装)

文档目录:docs/zookeeper-学习笔记.md (博客发布时拷贝 docs/ 目录即可)

示例 IP 对照表

节点 公网 IP(SSH 示例) 内网 IP myid
Server 1 203.0.113.11 10.0.1.11 1
Server 2 203.0.113.12 10.0.1.12 2
Server 3 203.0.113.13 10.0.1.13 3

公网 IP 使用 RFC 5737 文档保留地址 203.0.113.0/24;内网使用 10.0.1.0/24 示例段,发布时请替换为你自己的环境。


一、ZooKeeper 是什么?

白话 :分布式系统的「协调员」------帮多台机器 达成共识、存元数据、做选主

常见用途:

用途 说明
注册中心 Dubbo 把 Provider 地址写进 ZK,Consumer 来查
配置中心 多节点共享一份配置
分布式锁 / 选主 集群里谁当 Leader
Kafka(旧版) 老版本 Kafka 用 ZK 存 Broker/Topic 元数据(Kafka 3.x 已可 KRaft 去 ZK,本集群仍用 ZK)

比喻 :ZK 像 电话簿 + 公告栏 ,各服务来这里 登记地址订阅变化


二、本集群环境

2.1 三台机器

名称 公网 IP(SSH) 私网 IP myid
Server 1 203.0.113.11 10.0.1.11 1
Server 2 203.0.113.12 10.0.1.12 2
Server 3 203.0.113.13 10.0.1.13 3

记忆 :Consumer 在 Server 2 ;Provider 多在 Server 1

2.2 安装路径

项目 路径
程序 /opt/zookeeper
数据 /var/lib/zookeeper
配置 /opt/zookeeper/conf/zoo.cfg
节点 ID /var/lib/zookeeper/myid(三台分别为 1、2、3)
服务 systemctl start/stop/status zookeeper

2.3 连接串

复制代码
10.0.1.11:2181,10.0.1.12:2181,10.0.1.13:2181

客户端连任意一台即可;一台挂了连其他的,集群对外仍可用


三、核心概念

3.1 节点类型(ZNode)

类型 说明
持久节点 创建后一直存在,除非主动删除
临时节点 会话断开自动删除(Dubbo Provider 下线时常用)
顺序节点 名字后面带递增序号

3.2 集群角色

角色 作用
Leader 处理写请求、协调一致性
Follower 参与投票,可读可转发写
Observer 只读、不参与选主(本集群未用)

走 Leader; 任意节点(可能略滞后,一般可接受)。

3.3 会话(Session)

  • 客户端与 ZK 建立 长连接 + 心跳
  • 心跳超时 → 会话失效 → 临时节点被删(Dubbo 里 Provider 地址消失)

3.4 Watcher(监听)

  • 客户端可 监听节点变化(数据变、子节点变)
  • Dubbo Consumer 订阅 Provider 列表变化,Provider 上下线能感知

四、关键配置 zoo.cfg(三台相同)

properties 复制代码
# 心跳与超时(示例思路,以实际文件为准)
tickTime=2000
initLimit=10
syncLimit=5

dataDir=/var/lib/zookeeper
clientPort=2181

# 集群成员:server.myid=内网IP:2888:3888
server.1=10.0.1.11:2888:3888
server.2=10.0.1.12:2888:3888
server.3=10.0.1.13:2888:3888
端口 用途
2181 客户端连接
2888 Follower 连 Leader(数据同步)
3888 选举 Leader

五、常用命令

5.1 服务管理

bash 复制代码
systemctl status zookeeper
systemctl start zookeeper
systemctl stop zookeeper
systemctl enable zookeeper

5.2 客户端 shell(本集群用 Kafka 自带脚本)

bash 复制代码
/opt/kafka/bin/zookeeper-shell.sh 10.0.1.11:2181

进入后:

bash 复制代码
ls /
ls /services
ls /services/dubbo-spring-provider
get /services/dubbo-spring-provider
stat /services/dubbo-spring-provider

5.3 Dubbo 相关路径示例

路径 含义
/services/dubbo-provider 原生 Java API Provider 应用级注册
/services/dubbo-spring-provider Spring Boot Provider 应用级注册
/dubbo/org.demo.DemoService/providers/ 接口级 Provider URL 列表

查 Provider 地址

bash 复制代码
/opt/kafka/bin/zookeeper-shell.sh 10.0.1.11:2181 \
  ls /services/dubbo-spring-provider

期望输出类似:

复制代码
[10.0.1.11:20881, 10.0.1.13:20881]

六、与 Dubbo / Kafka 的关系

复制代码
┌─────────────┐     注册/发现      ┌─────────────┐
│   Dubbo     │ ◄──────────────► │ ZooKeeper   │
│ Provider/   │   写地址、订阅    │  注册中心    │
│ Consumer    │                  └─────────────┘
└─────────────┘

┌─────────────┐     元数据(可选)  ┌─────────────┐
│   Kafka     │ ◄──────────────► │ ZooKeeper   │
│  Broker     │   旧架构依赖 ZK   │             │
└─────────────┘                  └─────────────┘
  • Dubbo :强依赖 ZK(本课程)做 服务注册与发现
  • Kafka 3.x:Broker 元数据可独立;本环境 ZK 仍独立部署,Dubbo 专用为主

七、运维要点

  1. 三台 myid 必须不同 (1、2、3),与 server.N 对应
  2. zoo.cfg 三台要一致 ,仅 myid 文件不同
  3. 用内网 IP 做集群通信,省流量、低延迟
  4. 2181 一般不对公网开放,仅内网 + SSH 调试
  5. 停 ZK 前注意:依赖它的 Dubbo 无法发现服务
  6. Server 2 曾出现 旧 Kafka 内置 ZK 占 2181,需先停冲突进程

八、故障排查 checklist

现象 可能原因
Dubbo Consumer 找不到 Provider Provider 未启动 / 未注册 ZK / ZK 挂了
ls /services/... 为空 Provider 未 export 或应用名不对
集群无法选主 网络不通、myid 错误、少于半数节点存活
2181 被占用 其他进程(如旧 Kafka ZK)冲突

九、一句话总结

ZooKeeper = 分布式协调与注册中心 :存地址、通知变化、保证集群一致;在本项目中主要是 Dubbo 的「电话簿」