[Flink] Flink作业报错:Caused by: The connector is trying to read binlog starting at GTIDs ..., but this is no longer available on the server[转载]

发布时间 2023-04-17 09:26:05作者: 千千寰宇

这个问题,属于偶现问题。通常几个月才偶现一次。
因为上周五又出现了一次,且团队内多位小伙伴都遇到过。故此,这次特别记录下,以加强印象。

1 问题描述

Flink作业报错:Caused by: The connector is trying to read binlog starting at GTIDs ..., but this is no longer available on the server. Reconfigure the connector to use a snapshot when needed.

2 问题原因

Flink Job 正在读的 mysql binlog日志被清理了,出现这个报错目前只能全新状态重启。

3 解决方案

导致报错的可能原因以及处理办法:

  • 原因1:RDS做了内部迁移操作,Flink jar作业使用mysql cdc消费mysql数据报错的原因是是作业处理的速度追不上mysql binlog 产生的速度,导致正在读的位点被清理了。

解决办法:需要全新启动作业,以重新读取数据解决。

  • 原因2:RDS有日志保留策略,最长18个小时,最大占用30%存储空间,两个条件谁先满足都会触发删除,如果您写入特别多,超过30%的存储空间了,可能binlog日志1小时就删除了

注:rds页面上还有一个7天的binlog文件保存,这个是rds后台转存到你们的oss上的,flink cdc目前是没有去转存后oss上去读取这些文件的。

解决办法:需要调整RDS MySQL的Binlog过期策略,使得Binlog能正常被读取。

  • 原因3:通过只读实例消费 CDC 数据,RDS的只读实例不保证binlog(本地只保留10s,上传oss),所以 flink cdc 侧不建议连接 RDS 的只读实例。 只读实例一旦作业 Failover 10s 内恢复不过来,就会有这个异常 只读实例判定,rr 开头的就是只读实例 rm 开头的就是正常的实例

解决办法:不建议MySQL CDC源表读取RDS的只读实例数据。

  • 原因4:MySQL CDC作业消费Binlog太慢,例如下游的聚合算子或者Sink算子长时间出现反压,反压传递到source,导致source无法消费数据。

解决办法:需要对作业资源调优,让source恢复正常消费即可。

  • 原因5:作业正在读取的Binlog文件在MySQL服务器已经被清理掉时,会出现该报错。这种情况一般由于MySQL服务器上Binlog的保留时间太短。

解决办法:可以将Binlog的保留时间调大,比如7天。具体命令如下。

mysql> show variables like 'expire_logs_days';
mysql> set global expire_logs_days=7;

X 参考文献