Flink CDC报The connector is trying to read binlog starting at xxx but this is no longer available问题解决

2 篇文章 2 订阅

背景

问题是笔者最近在使用FlinkCDC2.3.0捕获MySQL binlog日志时遇到的,MySQL使用的阿里云的RDS,MysqlCDC使用读账号以Initinal模式,任务已经运行了一段时间突然报的错,之前在使用FlinkCDC时也曾遇到过,设置了一些参数后没有再出现过,一直比较忙没有来得及总结下来。但是今天同事又遇到了同类型新的报错形式。下次也将问题记录下来备忘,同时也希望对大家有帮助。

问题

报错:Caused by: java.lang.IllegalStateException: The connector is trying to read binlog starting at Struct{version=1.6.4.Final,connector=mysql,name=mysql_binlog_source,ts_ms=1686104185098,db=,server_id=0,file=mysql-bin.000702,pos=1255923,row=0}, but this is no longer available on the server. Reconfigure the connector to use a snapshot when needed.

详细报错如下:
在这里插入图片描述

分析

很多FlinkCDC的报错中都会有SplitFetcher thread 0 received unexpected exception while polling the record这样一句提示,虽然这是同一功能报错,但是容易对大家造成困惑。
在网上寻求帮助时也造成了麻烦。下面我们来分析这个报错,首先我们来了解下struct中的数据信息的含义,其实它是MySQL binlog source的元数据信息,那他的参数都是啥玩意呢

{
	version=1.6.4.Final,
	connector=mysql,
	name=mysql_binlog_source,
	ts_ms=1686104185098,
	db=,server_id=0,
	file=mysql-bin.000702,
	pos=1255923,
	row=0
}

version:该binlog source使用的Debezium版本号,
connector:该binlog source所使用的Debezium connector类型
name:该binlog source的名称,
ts_ms:表示该操作发生的时间戳(毫秒级别),
db:表示该操作所在的数据库,
server_id:表示执行该操作的MySQL服务器ID,
file:表示该操作所在的二进制日志文件名,
pos:表示该操作在该文件中的位置,
row:表示该操作影响的行数。

看到这里我们知道了这是FlinkCDC在读取的mysqlbinlong时在尝试读取mysql-bin.000702文件,偏移量为1255923点位时出问题了,这些参数可以帮助我们定位该数据的位置。出啥问题了呢?我们继续看报错,报错说这个点位的快照在当前库中已经不可以用了,那么binlog啥情况下不可用呢,就是被删了或者丢了情况下不可以用
那么我们分析什么情况下binlog会被删掉呢?这就要看我们数据库的备份保留策略了,于是我们查看了阿里云RDS上的日志备份保留策略。
在这里插入图片描述
我们发现日志保留7天,但是下面还有一个本地日志保留策略就是本地的日志只会保留18个小时,时间一到就会删除另外如果文件保留个数到达60个也会删除,还有就是占用空间30%也会被删除。但是我们分析了一下并没有符合这些条件。于是我在社区沟通了一下,总结情况如下:

  • 场景1: RDS做了内部迁移操作,flink jar作业使用mysql cdc消费mysql数据报错的原因是作业处理的速度追不上mysql binlog 产生的速度,导致正在读的位点被清理了
  • 场景 2: RDS有日志保留策略,最长18个小时,最大占用30%存储空间,两个条件谁先满足都会触发删除,如果你写入特别多,超过30%的存储空间了,可能binlog日志1小时就删除了
  • 场景 3: 通过只读实例消费 CDC 数据,RDS的只读实例不保证binlog(本地只保留10s,上传oss),所以 flink cdc 侧不建议连接 RDS 的只读实例。只读实例一旦作业 Failover 10s 内恢复不过来,就会有这个异常。只读实例判定,rr 开头的就是只读实例 rm 开头的就是正常的实例。
    同时我们在FlinkCDC官方问题集找到了该问题部分提示。也是让查找binlog策略。
    在这里插入图片描述

解决方案

经过上述的了解我们大体知道我们三种场景都有可能出现,问题基本上就是mysql的binlog被清理掉了,CDC找不到点位就报错了,对于这种情况我们如下三个操作:

  • 分析了任务的背压,减少上游source任务的并行度,增加了下游任务的并行度,来缓解背压,加快任务处理速度。
  • 同时过滤掉计算中不需要的数据,来减少数据体量。以加快任务进度。
    通过上述操作缓解场景1、场景2。
  • 另一个方面,我们将读账号替换为写账号,
    防止场景3的情况。
  • 最后针对场景2这种FlinkCDC和阿里云RDS备份策略存在兼容性问题造成的bug,我们直接进行了全状态重启(即在Initinal模式下重启任务)以此跳过数据被删除的binlog的点位。

总结

在FlinkCDC的issues,我见到了比较多的人提了问题,官方建议mysql 侧 binlog文件日期保留长点但是,依然解决不了问题。并且对于读账号问题10s问题阿里云官方并未说明,笔者也是咨询大佬才了解到。社区有人建议试试加这个配置笔者尚未实践debeziumProperties.put("snapshot.mode", "when_needed");,之后考虑加一下试试。如果大家和笔者一样实在没有办法就选择重启吧。FlinkCDC对这个问题的优化并没有很好。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值