大数据

ticdc broken pipe解决

今天遇到ticdc同步到kafka topic出现 failed: kafka: failed to produce message to topic tidb-linkman-batch: kafka: broker not connected

tidb官网解释:

需要修改下kafka配置参数然后滚动重启kafka服务即可。

关于滚动重启:

✅ 前提条件

  • 你的 Kafka Topic 已设置 replication.factor=3(你已完成 ✅)
  • 每个分区的 ISR(In-Sync Replicas)完整(你当前状态满足 ✅)
  • Kafka 集群有 至少 3 个 Broker

这些条件确保:逐个重启 Broker 时,Topic 仍可读写,TiCDC 不会中断

🔄 滚动升级步骤

步骤 1:修改第一个 Broker 的配置

# 登录到 Broker 1 所在服务器
vi /path/to/kafka/config/server.properties

在文件末尾添加(或修改):

connections.max.idle.ms=86400000

💡 建议值:86400000 = 24 小时,远大于 TiCDC 最大空闲间隔。

步骤 2:确认该 Broker 不是所有分区的唯一 Leader

虽然副本数为 3,但为保险起见,可临时触发 Preferred Replica Leader Election,让 Leader 均匀分布:

# (可选)生成选举计划
bin/kafka-leader-election.sh \
  --bootstrap-server localhost:9092 \
  --election-type preferred \
  --topic tidb-linkman-batch

如果不想操作,也可跳过——Kafka 本身支持 Leader 自动切换。

步骤 3:优雅停止 Broker 1

# 发送 SIGTERM(Kafka 会等待请求处理完再退出)
bin/kafka-server-stop.sh

⚠️ 不要用 kill -9,否则可能造成副本短暂不可用。

步骤 4:启动 Broker 1(加载新配置)

bin/kafka-server-start.sh -daemon config/server.properties

步骤 5:验证 Broker 1 已恢复

# 检查进程
ps aux | grep kafka

# 检查日志是否有错误
tail -f logs/server.log

# 查看 Topic 状态(Isr 应包含 1,2,3)
bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic tidb-linkman-batch

✅ 确认:

  • Broker 1 已加入集群
  • 所有分区 Isr 包含 Broker 1
  • TiCDC 日志无报错

步骤 6:重复步骤 1–5,依次升级 Broker 2、Broker 3

  • 每次只操作 一个 Broker
  • 等前一个完全恢复后再进行下一个

📌 注意事项

项目说明
是否需要停 TiCDC?❌ 不需要,TiCDC 会自动重连其他 Broker
升级期间能否写入?✅ 能,只要 ISR ≥ min.insync.replicas(默认 1)
配置是否必须一致?✅ 是,建议所有 Broker 使用相同 connections.max.idle.ms
是否需要修改 min.insync.replicas可选。如果你设为 2,则要求至少 2 副本同步才允许写入,更安全

✅ 升级后验证

  1. 检查 Kafka 日志是否加载新配置
grep "connections.max.idle.ms" logs/server.log
# 应输出:connections.max.idle.ms = 86400000
  1. 模拟空闲场景(可选)
    • 暂停上游写入 10 分钟
    • 观察 TiCDC 是否仍保持连接(不再报 broker not connected