FlinkCDC作业处理慢追不上binlog产生的速度,导致binlog被清理的解决方案

完整的异常信息如下:

java.lang.RuntimeException: One or more fetchers have encountered exception
	at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcherManager.checkErrors(SplitFetcherManager.java:225)
	at org.apache.flink.connector.base.source.reader.SourceReaderBase.getNextFetch(SourceReaderBase.java:185)
	at org.apache.flink.connector.base.source.reader.SourceReaderBase.pollNext(SourceReaderBase.java:143)
	at org.apache.flink.streaming.api.operators.SourceOperator.emitNext(SourceOperator.java:385)
	at org.apache.flink.streaming.runtime.io.StreamTaskSourceInput.emitNext(StreamTaskSourceInput.java:68)
	at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:526)
	at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:203)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:811)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:760)
	at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:954)
	at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:933)
	at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:746)
	at org.apache.flink.runtime.taskmanager.Task.run(Task.java:568)
	at java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.RuntimeException: SplitFetcher thread 0 received unexpected exception while polling the records
	at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.runOnce(SplitFetcher.java:150)
	at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.run(SplitFetcher.java:105)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1147)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
	... 1 more
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=1668149633760,db=,server_id=0,file=mysql-bin.003889,pos=116719908,row=0}, but this is no longer available on the server. Reconfigure the connector to use a snapshot when needed.
	at com.ververica.cdc.connectors.mysql.debezium.task.context.StatefulTaskContext.loadStartingOffsetState(StatefulTaskContext.java:190)
	at com.ververica.cdc.connectors.mysql.debezium.task.context.StatefulTaskContext.configure(StatefulTaskContext.java:116)
	at com.ververica.cdc.connectors.mysql.debezium.reader.BinlogSplitReader.submitSplit(BinlogSplitReader.java:99)
	at com.ververica.cdc.connectors.mysql.debezium.reader.BinlogSplitReader.submitSplit(BinlogSplitReader.java:67)
	at com.ververica.cdc.connectors.mysql.source.reader.MySqlSplitReader.checkSplitOrStartNext(MySqlSplitReader.java:159)
	at com.ververica.cdc.connectors.mysql.source.reader.MySqlSplitReader.fetch(MySqlSplitReader.java:71)
	at org.apache.flink.connector.base.source.reader.fetcher.FetchTask.run(FetchTask.java:58)
	at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.runOnce(SplitFetcher.java:142)
	... 6 more

我的需求是FlinkCDC MySQL-AnalyticDB实时入库。

该报错的原因是作业处理的速度追不上binlog产生的速度,导致正在读的位点被清理了。目前只能清状态重启。

解决方案:

场景1:rds做了内部迁移操作,flink jar作业使用mysql cdc消费mysql数据报错的原因是是作业处理的速度追不上mysql binlog 产生的速度,导致正在读的位点被清理了
通过命令show master status,可以查看master数据库当前正在使用的二进制日志及当前执行二进制日志位置 show master logs,查看所有二进制日志列表
排查思路:
这种得先确认一下问题:rds的地址和binlog文件位点和迁移前是一致的吗?
1. rds 地址不会变化
2. 如果节点有变化,binlog文件位点会变化。如果是从远程拉取的oss中的binlog,binlog是固定的。
解决方案:
1:那需要重新读去了,flink cdc不会去oss上拉文件,是直链mysql服务器(无状态重启)
2:绕行方案:从只读库拉取数据 
注意事项:
(1)从库读是支持的,从库就是延时比主库大点。注意一点事 RDS MySQL 5.6不支持,5.7之后的版本都支持,因为RDS MySQL 5.6 只读实例的binlog文件是简化过的,没有数据。
(2)主库风险也还好,flink cdc 只有读的权限,不会加锁和写的权限。
如果rds 配置了HA,即多主实例,用户同时开启了GTID,然后通过 VIP/DNS 下挂rds的这几个多主实例地址,这样flink cdc /canal 这些同步工具 通过访问 VIP/DNS 链接rds时才能实现 不中断。

场景2:
RDS有日志保留策略,最长18个小时,最大占用30%存储空间,两个条件谁先满足都会触发删除,如果您写入特别多,超过30%的存储空间了,可能binlog日志1小时就删除了
注:rds页面上还有一个7天的binlog文件保存,这个是rds后台转存到您们的oss上的,flink cdc目前是没有去转存后oss上去读取这些文件的

场景3:
 volvo 通过只读实例消费 CDC 数据,RDS的只读实例不保证binlog(本地只保留10s,上传oss),所以 flink cdc 侧不建议连接 RDS 的只读实例。
只读实例一旦作业 Failover 10s 内恢复不过来,就会有这个异常
只读实例判定,rr 开头的就是只读实例 rm 开头的就是正常的实例
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值