Skip to content

cdc: add solution for kafka broken pipe error #20317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion ticdc/ticdc-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -489,4 +489,20 @@ UPDATE data_table SET value = 'v1' WHERE id = 2;
mysql://user:password@host:port/?safe-mode=true
```

在安全模式下,TiCDC 会将 `UPDATE` 操作拆分为 `DELETE + REPLACE INTO` 进行执行,从而避免唯一键冲突错误。
在安全模式下,TiCDC 会将 `UPDATE` 操作拆分为 `DELETE + REPLACE INTO` 进行执行,从而避免唯一键冲突错误。

## 为什么 TiCDC 同步到 Kafka 的任务经常因为 “broken pipe” 报错而失败?

TiCDC 同步数据到 Kafka 时使用了 Sarama 客户端。出于防止数据乱序的考虑,TiCDC 禁用了 Sarama 的自动重试机制(将重试次数设为 0)。这样一来,如果 TiCDC 和 Kafka 之间的连接在空闲一段时间后被 Kafka 主动关闭,后续写入数据时就会报 `write: broken pipe` 错误,导致同步任务失败。

虽然 Changefeed 会因为报错而失败,但 TiCDC 会自动重启该 Changefeed,任务仍可继续正常运行。需要注意的是,在重启的过程中,Changefeed 的同步延迟(lag)可能会出现一次性的小幅增加,通常在 30 秒以内,之后会自动恢复正常。

如果用户对 Changefeed 的延迟非常敏感的话,建议将 Kafka 的连接空闲超时时间调大,例如配置:

```properties
connections.max.idle.ms=86400000 # 设置为 1 天
```

然后重启 Kafka 以使配置生效,从而避免连接被提前关闭,减少 broken pipe 报错。

具体设置多长时间,建议根据业务实际的数据同步情况进行调整:如果 TiCDC Changefeed 在几十分钟内一定会有数据同步发生,那么可以将 `connections.max.idle.ms` 设置为几十分钟即可,无需设置过大。
1 change: 1 addition & 0 deletions ticdc/ticdc-sink-to-kafka.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ URI 中可配置的的参数如下:
* TiCDC 推荐用户自行创建 Kafka Topic,你至少需要设置该 Topic 每次向 Kafka broker 发送消息的最大数据量和下游 Kafka partition 的数量。在创建 changefeed 的时候,这两项设置分别对应 `max-message-bytes` 和 `partition-num` 参数。
* 如果你在创建 changefeed 时,使用了尚未存在的 Topic,那么 TiCDC 会尝试使用 `partition-num` 和 `replication-factor` 参数自行创建 Topic,建议明确指定这两个参数。
* 在大多数情况下,建议使用 `canal-json` 协议。
* 如果消息量很少,比如可能会出现超过 10 分钟没有数据变更的情况,建议在 Kafka Broker 的配置中加上 `connections.max.idle.ms=86400000`,具体细节可参看[为什么 TiCDC 同步到 Kafka 的任务经常因为 “broken pipe” 报错而失败?](/ticdc/ticdc-faq.md#为什么-TiCDC-同步到-Kafka-的任务经常因为-“broken-pipe”-报错而失败?)

> **注意:**
>
Expand Down
Loading