Flink CDC Connactors FAQ
近期遇到 Flink CDC 的问题较多,故基于第1篇参考文献的FAQ文档基础之上,对这些问题做个系统的总结。
MYSQL CDC
Q:作业报错 ConnectException: A slave with the same server_uuid/server_id as this slave has connected to the master
,怎么办呢?
Flink CDC 官方FAQ:
- 出现这种错误是 作业里使用的 server id 和其他作业或其他同步工具使用的server id 冲突了,server id 需要全局唯一,server id 是一个int类型整数。
- 在 CDC 2.x 版本中,source 的每个并发都需要一个server id,建议合理规划好server id,比如作业的 source 设置成了四个并发,可以配置 'serverid' = '5001-5004', 这样每个 source task 就不会冲突了。
推荐文献
-
A slave with the same server_uuid as this slave has connected to the master - CSDN
-
在使用flinkcdc同步多个表时遇到报错:A slave with the same server_uuid/server_id as this slave has connected to the - 51CTO 【推荐】
flink version:flink-1.13.5
;cdc version:2.1.1
- 关键错误日志
org.apache.flink.runtime.JobException: Recovery is suppressed by FixedDelayRestartBackoffTimeStrategy(maxNumberRestartAttempts=3, backoffTimeMS=10000)Caused by: com.ververica.cdc.connectors.shaded.org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped.Caused by: io.debezium.DebeziumException: A slave with the same server_uuid/server_id as this slave has connected to the master; the first event '' at 4, the last event read from '/data/mysql/storage/logs/bin_log/bin.001086' at 426321679, the last byte read from '/data/mysql/storage/logs/bin_log/bin.001086' at 426321679. Error code: 1236; SQLSTATE: HY000.Caused by: com.github.shyiko.mysql.binlog.network.ServerException: A slave with the same server_uuid/server_id as this slave has connected to the master; the first event '' at 4, the last event read from '/data/mysql/storage/logs/bin_log/bin.001086' at 426321679, the last byte read from '/data/mysql/storage/logs/bin_log/bin.001086' at 426321679
- 原因分析
flink cdc是基于debezium实现的mysql实时同步,debezium是以slave server的方式去读取mysql的binlog日志。
默认情况下,系统会自动生成一个介于 5400 和 6400 之间的随机数,作为debezium这个客户端的server-id,
而这个id在mysql cluster中必须是唯一的,报这个错说明是有重复的server-id了,
建议你显示的配上这个参数“server-id”,可以配置成一个数字或者一个范围。另外当 scan.incremental.snapshot.enabled 设置为true时(默认为true),则建议设置为范围,因为增量读取快照时,source是可以并行执行的,
这些并行的客户端也必须有着唯一的server-id,增量读取快照的并行度由参数“parallelism.default”控制,而且server-id设置的范围必须要大于并行度。详情参考:
https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc.html#connector-options
配置页里关于 server-id 和 scan.incremental.snapshot.enabled 的解释
- 数据集成实时同步常见问题 # MySql serverid 冲突 - 腾讯云
- 关键日志
com.github.shyiko.mysql.binlog.network.ServerException: A slave with the same server_uuid/server_id as this slave has connected to the master。
- 解决办法:
目前已经优化增加随机生成 serverid,之前的任务中如果在 mysql 高级参数中显示指定了 server-id 建议删除,因为可能多个任务使用了相同的数据源,并且 server-id 设置的相同导致冲突。
- [数据库] 浅谈mysql的serverId/serverUuid - 博客园/千千寰宇 【推荐】
- mysql主从复制错误:A slave with the same server_uuid/server_id as this slave has connected to the master; - 博客园
- 报错:A slave with the same server_uuid/server_id as this slave has connected to the master - 阿里云
Q:作业报错 The connector is trying to read binlog starting at GTIDs xxx and binlog file 'binlog.000064', pos=89887992, skipping 4 events plus 1 rows, but this is no longer available on the server. Reconfigure the connector to use a snapshot when needed,怎么办呢?
Flink CDC 官方FAQ:
出现这种错误是:
- 情况1:作业正在读取的binlog文件在 MySQL 服务器已经被清理掉,这种情况一般是 MySQL 服务器上保留的 binlog 文件过期时间太短,可
以将该值设置大一点,比如7天。
mysql> show variables like 'expire_logs_days';
mysql> set global expire_logs_days=7;
- 情况2: flink cdc 作业消费binlog 太慢,这种一般分配足够的资源即可。
推荐文献
- 数据集成实时同步常见问题 # binlog 文件找不到 - 腾讯云
- 关键日志
Caused by: org.apache.kafka.connect.errors.ConnectException: The connector is trying to read binlog starting at GTIDs xxx and binlog file 'binlog.xxx', pos=xxx, skipping 4 events plus 1 rows, but this is no longer available on the server.
Reconfigure the connector to use a snapshot when needed。
- 错误原因:
作业正在读取的 binlog 文件在 MySQL 服务器已经被清理时,会产生报错。导致 Binlog 清理的原因较多,可能是 Binlog 保留时间设置的过短;或者作业处理的速度追不上 Binlog 产生的速度,超过了 MySQL Binlog 文件的最大保留时间,MySQL 服务器上的 Binlog 文件被清理,导致正在读的 Binlog 位点变得无效。
- 解决办法:
如果作业处理速度无法追上 Binlog 产生速度,可以考虑增加 Binlog 的保留时间也可以优化作业减轻反压来加速 source 消费。如果作业状态没有异常,可能是数据库发生了其他操作导致 Binlog 被清理,从而无法访问,需要结合 MySQL 数据库侧的信息来确定Binlog被清理的原因。
Q:作业报错 The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. 怎么办呢 ?
- Flink CDC 官方FAQ:
出现这个问题的原因是的作业全量阶段读取太慢,在全量阶段读完后,之前记录的全量阶段开始时的 gtid 位点已经被 mysql 清理掉了。这种可以增大 mysql 服务器上 binlog 文件的保存时间,也可以调大 source 的并发,让全量阶段读取更快。
Q: mysql cdc支持监听从库吗?从库需要如何配置?
- 支持的,从库需要配置 log-slave-updates = 1 使从实例也能将从主实例同步的数据写入从库的 binlog 文件中,如果主库开启了gtid mode,从库也需要开启。
log-slave-updates = 1
gtid_mode = on
enforce_gtid_consistency = on
Q:作业报错 ConnectException: Received DML ‘…’ for processing, binlog probably contains events generated with statement or mixed based replication format,怎么办呢?
出现这种错误是 MySQL 服务器配置不对,需要检查下 binlog_format 是不是 ROW? 可以通过下面的命令查看
mysql> show variables like '%binlog_format%';
X 参考文献
- Flink Cdc Connectors FAQ - Flink CDC 【推荐】
- https://nightlies.apache.org/flink/flink-cdc-docs-release-3.1/docs/faq/faq/ 【推荐】TODO
- flink的常见通用FAQ - 51CTO
- Flink CDC 官网
- https://ververica.github.io/flink-cdc-connectors 【旧版官网,已废除】
- https://github.com/apache/flink-cdc/ 【最新版官网】
- https://nightlies.apache.org/flink/flink-cdc-docs-stable/
- 数据集成实时同步常见问题 - 腾讯云 【推荐】TODO