Apache Kafka集群ISR更新异常问题排查咨询
Kafka集群单节点宕机后ISR更新异常排查修复
你当前的副本相关核心配置没有问题,结合日志里的UNKNOWN_SERVER_ERROR报错、重启ZK和Broker无效的现象,这类问题基本是ZooKeeper元数据异常、集群配置冲突或者ZK性能问题导致的,按以下步骤排查即可:
1. 根因定位
- 登录ZooKeeper客户端,执行
./zkCli.sh -server <ZK集群连接地址>进入交互终端,逐个查看异常分区的状态元数据,路径规则为/brokers/topics/<主题名>/partitions/<分区ID>/state。比如查看test2分区0的状态就执行get /brokers/topics/test2/partitions/0/state,重点核对两个信息:- 返回的JSON数据里的
zk_version值,和日志里报错携带的zkVersion是否一致,如果不一致,就是ISR更新时的乐观锁版本校验失败,导致更新请求一直重试卡主 - JSON里的
isr字段值,和kafka-topics.sh --describe查到的ISR列表是否匹配,如果两边数据不一致,就是ZK元数据和Broker内存元数据出现了分叉
- 返回的JSON数据里的
- 执行
echo mntr | nc <ZK节点IP> 2181查看ZK运行指标,重点看zk_fsync_threshold_exceed_count、zk_pending_syncs两个值,如果前者持续上涨、后者长期大于0,说明ZK磁盘IO性能不足,写元数据请求超时会返回UNKNOWN_SERVER_ERROR - 核对所有Broker节点的
config/server.properties里的broker.id配置,绝对不能出现重复值,重复ID会导致ZK写元数据时出现所有者冲突,直接报未知服务错误,这个问题重启节点完全无法解决。
2. 对应修复操作
- 如果是元数据版本不一致/分叉问题:对所有异常主题执行优先副本选举,强制刷新元数据版本,命令如下:
选举完成后等待1-2分钟,Leader节点会重新对齐ZK侧的元数据版本,之前卡住的ISR扩容请求会自动提交。kafka-leader-election.sh --bootstrap-server <Kafka集群连接地址> --election-type PREFERRED --topic test2 --all-partitions kafka-leader-election.sh --bootstrap-server <Kafka集群连接地址> --election-type PREFERRED --topic test3 --all-partitions - 如果是ZK性能不足导致的写失败:先清理ZK节点的磁盘占用,保证ZK数据盘的IO使用率低于70%,同时把Broker端配置
zookeeper.session.timeout.ms从默认的6000调整为18000,减少会话闪断导致的写失败,滚动重启Broker生效即可。 - 如果查到有重复的
broker.id:先停掉冲突的Broker节点,修改为全局唯一的ID,清空该节点下log.dirs配置目录中的meta.properties文件,重启节点即可,节点重启后副本会自动重新同步,同步完成后会自动加入ISR。
3. 修复验证
操作完成后等待5分钟,执行kafka-topics.sh --describe查看所有分区状态:
- 所有同步进度追上Leader的副本都正常出现在ISR列表中
- Broker日志里不再出现
Failed to update ISR的重试告警 - 手动停止任意一个Broker节点,ISR会正常收缩移除宕机节点,重启该节点待副本同步完成后,ISR会自动扩容加回该节点,即为修复完成。
注意:不要直接手动修改ZooKeeper里存储的ISR元数据,很容易导致控制器脑裂、副本状态异常,优先通过官方提供的选举、配置调整方式修复。
内容的提问来源于stack exchange,提问作者Krzysztof B.
相关产品推荐
相关产品推荐

