如何查看Kafka的Epoch机制?
# Kafka 查看 Epoch 完整实操(LeaderEpoch + ControllerEpoch)
Kafka 有两种 Epoch:
1. **Controller Epoch**:集群控制器任期
2. **Leader Epoch**:分区 Leader 任期(核心、面试高频)
下面全是**可直接复制执行**的命令,一步一步看。
---
## 一、查看 【Controller Epoch】
### 方式1:Zookeeper 查看(最直观)
Kafka 控制器数据存在 ZK
```bash
# 进入 zk 客户端
zkCli.sh
# 查看 controller 信息
get /kafka/controller
# 查看控制器任期 epoch
get /kafka/controller_epoch
```
- `controller_epoch`:全局单调递增,**每次换控制器 +1**
- 作用:防止集群脑裂,拒绝低任期旧控制器请求
---
### 方式2:Kafka 元数据命令查看
```bash
kafka-metadata-shell.sh --bootstrap-server localhost:9092
# 输入命令
controller
```
直接展示:当前 Controller节点、**Controller Epoch**
---
## 二、查看 【分区 Leader Epoch】(重点)
### 1. 查看主题分区详细信息(含 LeaderEpoch)
```bash
# 语法
kafka-topics.sh \
--bootstrap-server 127.0.0.1:9092 \
--describe \
--topic 你的主题名
```
输出字段里:
- `Leader`:当前leader
- `LeaderEpoch`:当前分区任期号
---
### 2. 专用指令:精准查询 Leader Epoch 元数据
```bash
kafka-dump-log.sh \
--files /kafka/logs/主题名-0/leader-epoch-checkpoint \
--print-data-log
```
✅ 解释:
- Kafka 每个分区目录下有:`leader-epoch-checkpoint` 文件
- 记录:`Epoch 编号` + 对应`起始偏移量 startOffset`
- 格式:
```
epoch: 0 , startOffset: 0
epoch: 1 , startOffset: 5600
epoch: 2 , startOffset: 9200
```
---
### 3. 命令行查看指定分区 Epoch 范围
```bash
kafka-leader-election.sh \
--bootstrap-server 127.0.0.1:9092 \
--describe \
--topic 主题名 \
--partition 0
```
---
## 三、服务器本地文件查看(底层原理)
每个分区目录独立维护 `leader-epoch-checkpoint`
路径示例:
```
/kafka/logs/test_topic-0/leader-epoch-checkpoint
/kafka/logs/test_topic-1/leader-epoch-checkpoint
```
直接 cat 查看:
```bash
cat /kafka/logs/主题名-0/leader-epoch-checkpoint
```
---
## 四、核心指标区分(必背)
1. **Controller Epoch**
- 全局唯一、集群级别
- 控制器重新选举自增
- 存于 ZK:`/kafka/controller_epoch`
2. **Leader Epoch**
- 分区级别、每个分区独立
- **每切换一次 Leader 就+1**
- 持久化在:`leader-epoch-checkpoint`
- 用来**副本日志截断、数据一致性、防丢失**
---
## 五、快速排查口诀
1. 控制器异常 → 查 ZK `controller_epoch`
2. 分区数据错乱、副本不同步 → 查 `leader-epoch-checkpoint`
3. Leader 频繁切换 → 观察 LeaderEpoch 数值暴涨
---



