背景:
MySQL数据库的架构是一主(A)两备(B、C),整套架构都已经启用GTID 模式,MySQL 版本5.7
备库B当前的binlog文件号是 mysql-bin.022043
备库C当前的binlog文件号是 mysql-bin.022003
两个备库都和主库保持数据同步,无延迟。
flink cdc接入备库B,通过拉取b该库inlog实时采集数据流到kafka,待下游消费使用
当备库B不可对外提供服务器, 需要把flink 采集任务切到备库C,这时候flink会报找不到binlog的错误:
2024-04-09 19:09:37,005 INFO com.ververica.cdc.connectors.mysql.debezium.task.context.StatefulTaskContext [] - Connector requires binlog file 'mysql_bin.022043', but MySQL only has mysql_bin.021983, mysql_bin.021984, mysql_bin.021985, mysql_bin.021986, mysql_bin.021987, mysql_bin.021988, mysql_bin.021989, mysql_bin.021990, mysql_bin.021991, mysql_bin.021992, mysql_bin.021993, mysql_bin.021994, mysql_bin.021995, mysql_bin.021996, mysql_bin.021997, mysql_bin.021998, mysql_bin.021999, mysql_bin.022000, mysql_bin.022001, mysql_bin.022002, mysql_bin.022003
2024-04-09 19:09:37,006 ERROR org.apache.flink.connector.base.source.reader.fetcher.SplitFetcherManager [] - Received uncaught exception.
java.lang.RuntimeException: SplitFetcher thread 0 received unexpected exception while polling the records
就是已经启用了GTID,再验证备库C文件号呢,实际中可能每个备库binlog保留策略受本地磁盘空间大小影响会有差异,向我们这个案例中就比较大的差异。
类似这种情况咋解决的呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在当前架构中,MySQL 5.7 的主备库均已启用 GTID 模式,且两个备库(B 和 C)与主库保持数据同步。然而,由于备库 B 和备库 C 的 binlog 文件保留策略不同,导致在切换 Flink CDC 采集任务时,备库 C 缺少备库 B 当前的 binlog 文件(mysql-bin.022043
),从而引发 Flink 报错。
此问题的核心在于: 1. binlog 文件保留策略差异:备库 C 的 binlog 文件号远小于备库 B,说明其保留的 binlog 文件范围不足以覆盖 Flink CDC 所需的起始点。 2. GTID 模式下的切换限制:虽然启用了 GTID,但 Flink CDC 在切换备库时仍依赖具体的 binlog 文件号,而非仅依赖 GTID。
在 GTID 模式下,Flink CDC 应该能够通过 GTID 而非具体的 binlog 文件号来定位数据流。因此,首先需要确认以下几点: - 主库和备库 B、C 的 GTID 集合是否完全一致。 - 备库 C 是否已经应用了所有主库的事务(即 GTID 集合是否完整)。
可以通过以下命令检查 GTID 集合:
SHOW MASTER STATUS; -- 查看主库的 GTID 集合
SHOW SLAVE STATUS\G; -- 查看备库的 Executed_Gtid_Set
如果备库 C 的 Executed_Gtid_Set
包含了 Flink CDC 所需的所有事务,则理论上可以通过 GTID 切换到备库 C。
如果 GTID 集合一致,但 Flink CDC 仍然报错,可能是因为其默认配置依赖具体的 binlog 文件号。可以通过以下方式调整 Flink CDC 的配置: - 启用 GTID 模式:确保 Flink CDC 配置中启用了 GTID 模式,避免依赖具体的 binlog 文件号。 - 指定起始 GTID:在 Flink CDC 配置中明确指定从某个 GTID 开始读取数据流,而不是依赖 binlog 文件号。
示例配置:
debezium.snapshot.mode=never
debezium.gtid.mode=true
debezium.start.gtid=<起始 GTID>
如果备库 C 的 GTID 集合不完整,或者无法通过 GTID 直接切换,则需要将备库 B 的 binlog 文件同步到备库 C。具体步骤如下: 1. 导出备库 B 的 binlog 文件: 使用 mysqlbinlog
工具导出备库 B 的 binlog 文件:
mysqlbinlog --read-from-remote-server --host=<备库B地址> --port=<端口> --user=<用户名> --password=<密码> --start-position=<起始位置> --stop-position=<结束位置> mysql-bin.022043 > binlog.sql
mysql -h<备库C地址> -P<端口> -u<用户名> -p<密码> < binlog.sql
为了避免类似问题再次发生,建议统一主备库的 binlog 保留策略,确保所有备库保留足够长的 binlog 文件。可以通过以下参数调整: - expire_logs_days
:设置 binlog 文件的保留天数。 - binlog_expire_logs_seconds
:设置 binlog 文件的保留时间(秒)。
示例配置:
SET GLOBAL expire_logs_days = 7; -- 保留 7 天的 binlog 文件
根据知识库资料,三节点版本实例不支持开启 GTID。如果对 GTID 功能有强依赖,建议升级到高可用版本,以确保 GTID 的稳定性和一致性。
针对当前问题,推荐的解决步骤如下: 1. 确认主库和备库的 GTID 集合是否一致。 2. 调整 Flink CDC 配置,启用 GTID 模式并指定起始 GTID。 3. 如果 GTID 不完整,同步备库 B 的 binlog 文件到备库 C。 4. 统一主备库的 binlog 保留策略,避免类似问题再次发生。 5. 如果必要,考虑升级到高可用版本以支持 GTID 功能。
通过以上措施,可以有效解决 Flink CDC 切换备库时因 binlog 文件缺失导致的问题。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。