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 专用为主
七、运维要点
- 三台 myid 必须不同 (1、2、3),与
server.N对应 - zoo.cfg 三台要一致 ,仅
myid文件不同 - 用内网 IP 做集群通信,省流量、低延迟
- 2181 一般不对公网开放,仅内网 + SSH 调试
- 停 ZK 前注意:依赖它的 Dubbo 无法发现服务
- Server 2 曾出现 旧 Kafka 内置 ZK 占 2181,需先停冲突进程
八、故障排查 checklist
| 现象 | 可能原因 |
|---|---|
| Dubbo Consumer 找不到 Provider | Provider 未启动 / 未注册 ZK / ZK 挂了 |
ls /services/... 为空 |
Provider 未 export 或应用名不对 |
| 集群无法选主 | 网络不通、myid 错误、少于半数节点存活 |
| 2181 被占用 | 其他进程(如旧 Kafka ZK)冲突 |
九、一句话总结
ZooKeeper = 分布式协调与注册中心 :存地址、通知变化、保证集群一致;在本项目中主要是 Dubbo 的「电话簿」。