文章
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 副本同步才允许写入,更安全 |
✅ 升级后验证
- 检查 Kafka 日志是否加载新配置:
grep "connections.max.idle.ms" logs/server.log
# 应输出:connections.max.idle.ms = 86400000- 模拟空闲场景(可选):
- 暂停上游写入 10 分钟
- 观察 TiCDC 是否仍保持连接(不再报
broker not connected)