背景
问题是笔者最近在使用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找不到点位就报错了,对于这种情况我们如下三个操作:文章来源:https://www.toymoban.com/news/detail-729273.html
- 分析了任务的背压,减少上游source任务的并行度,增加了下游任务的并行度,来缓解背压,加快任务处理速度。
- 同时过滤掉计算中不需要的数据,来减少数据体量。以加快任务进度。
通过上述操作缓解场景1、场景2。 - 另一个方面,我们将读账号替换为写账号,
防止场景3的情况。 - 最后针对场景2这种FlinkCDC和阿里云RDS备份策略存在兼容性问题造成的bug,我们直接进行了全状态重启(即在Initinal模式下重启任务)以此跳过数据被删除的binlog的点位。
总结
在FlinkCDC的issues,我见到了比较多的人提了问题,官方建议mysql 侧 binlog文件日期保留长点但是,依然解决不了问题。并且对于读账号问题10s问题阿里云官方并未说明,笔者也是咨询大佬才了解到。社区有人建议试试加这个配置笔者尚未实践debeziumProperties.put("snapshot.mode", "when_needed");
,之后考虑加一下试试。如果大家和笔者一样实在没有办法就选择重启吧。FlinkCDC对这个问题的优化并没有很好。文章来源地址https://www.toymoban.com/news/detail-729273.html
到了这里,关于Flink CDC报The connector is trying to read binlog starting at xxx but this is no longer available问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!