百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Flink oracle cdc - Oracle Logminer

ccwgpt 2024-12-02 15:59 42 浏览 0 评论

最近的项目中有用到Flink Oracle CDC实时到监听数据库变化,将变化的数据sink到Kafka。Oracle CDC依赖Debezium组件解析Redo Log与Archive Log,Debezium 通过Oracle 的Logminer解析Log。在我们生产环境遇到

运行一段时间后,再也查询不到数据,直到报miss log file异常(线上环境cron job 将一小时前的archvied log压缩生成gzip文件),Flink job运行失败。

日志量比较大的时候,延迟非常大,每小时archived log size超过60G时延迟去到小时级别。


Canal binlog, debezium

Oracle: log, redolog, archive log

Flink CDC LogMiner流程

目前Flink Oracle CDC与Confluent Oracle CDC Kafak Connector都主要是通过Oracle LogMiner 解析 Redo Log与 Archived Log的方式同步数据,其主要流程如下:

  • Start LogMiner

begin

DBMS_LOGMNR.START_LOGMNR(STARTSCN => scn, ENDSCN => end scn,

OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE +

DBMS_LOGMNR.SKIP_CORRUPTION);

end;

Start LogMiner,添加scn 对应的日志文件:

参数说明:

start scn:scn = start scn + 1, LogMiner 根据scn定位对应的日志文件,日志文件分为redo log与archived log,每个日志文件对应数据一条记录,其中 first_change#(这个日志文件最小的scn 值),next_change# (下一个日志文件的开始scn值)。[first_change#,next_change#)前闭后开。

下一个日志文件的 first_change#与上一个的日志文件的next_change# 值相等。

LogMiner 根据scn处在[first_change#,next_change#)区间定位到日志文件(redo

log或者archvied log文件)。

日志文件包含很多block。每个block会有对应的start scn索引信息,方便我们根据scn 定位要解析的日志块,因此LogMiner就可以只解析少量的日志块,而不是整个日志文件(这块非常类似于HBase基于rowid查询数据逻辑)。

end scn: LogMiner解析到end scn定位等日志块。

CONTINUOUS_MINE: 自动添加对应的日志文件到待解析列表

Redo LOG:

select *

from v$log

where first_change# <= scn and next_change# > scn;

Archvied LOG:

select *

from v$archived_log A

where first_change# <= scn and next_change# > scn

AND A.ARCHIVED = 'YES' AND A.STATUS = 'A' ;

  • 查询V$LOGMNR_CONTENTS触发LogMiner解析

SELECT SCN,

SQL_REDO,

OPERATION_CODE,

TIMESTAMP,

XID,

CSF,

TABLE_NAME,

SEG_OWNER,

OPERATION,

USERNAME,

ROW_ID,

ROLLBACK,

RS_ID

FROM V$LOGMNR_CONTENTS

WHERE SCN > start scn

AND SCN <= end scn

AND ((OPERATION_CODE IN (6, 7, 36) OR

(OPERATION_CODE = 5 AND USERNAME in ('RMSPRD') AND INFO NOT LIKE 'INTERNAL DDL%' AND

SEG_OWNER in ('RMSPRD'))) OR (OPERATION_CODE IN (1, 2, 3) AND SEG_OWNER in ('RMSPRD')

AND TABLE_NAME in ('RESTART_PROGRAM_STATUS', 'ITEM_LOC')));

参数说明:

OPERATION_CODE:

public static final int INSERT = 1;

public static final int DELETE = 2;

public static final int UPDATE = 3;

public static final int DDL = 5;

public static final int ROLLBACK = 36;

查询数据:

事物:开启,提交,回滚事物

DDL:监听的schema与table的DDL操作事件

数据操作:监听的table的数据变化(增加,删除,修改,save point 记录回滚。save point记录回滚,回滚的每条记录都会有一条记录,OPERATION_CODE与正向的操作一样,只是ROLLBACK=1)。

start scn 上次一次返回的数据的最后记录的scn值(last processed scn),再继续查询。这块存在性能问题,极端情况下会一直查不到数据返回。

修复如下:

如果对应scn 范围的文件是archived log文件,查询没有数据返回了,就表明这范围内没有我们需要的数据, start scn = end scn;

如果对应scn 范围的文件是redo log文件,且当的文件正在写入,查询没有数据返回了,不能说明明这范围内没有我们需要的数据,有可能LGBR还没有刷新到文件中,我们需要修改start scn 上次一次返回的数据的最后记录的scn值(last processed scn),再继续查询,直到end scn对应的日志文件不是当前写入状态,或者对应的日志文件被 archive。

Flink CDC LogMiner 问题

LogMiner 最大的问题在于其性能, 他运行在 Oracle 内部, 并且运行在日志落地之后, 不可避免地需要消耗数据库的算力去完成工作, 为了降低这个不在主流程的进程的资源消耗, Oracle 对 LogMiner 做了非常严格的资源限制, 每个 LogMiner 进程, 他的资源消耗都不能超过 1 个 cpu 核心, 在大多数场景下, 这个将 LogMiner 的日志解析速度限制在 1w 条每秒以下, 在一些严肃的场合, 这个速度是远远不够的, Oracle 是一个事务数据库, 一个大的 Update, 可能会带来数十万上百万的更新, 在这种情况下, 每秒 1w 的解析速度会使得下游延迟增大到数分钟级别, 更糟糕的是, 在数据库本身负载较高的情况下, 由于 LogMiner 的解析与数据库共享负载, 会让解析速度进一步下降。

在工程上, 这个问题也有办法可以解决, LogMiner 本质上只是一个日志解析工具, 如果开发者在外部自己管理 LogMiner 进程, 将不同的日志通过不同的 LogMiner 进程并行解析, 理论上可以通过消耗更多的 CPU, 来实现更快的解析, 但是这个也导致了数据库的资源被进一步消耗, 最终速度是否达到预期并不是想当然的事情。

为了解决 LogMiner 与数据库争夺资源的问题, 还有一个异步解析的方案, 首先通过 Oracle 的机制, 将 redo log 异步传输到另外一台没有业务压力的 Oracle 实例上, 然后在另外一台机器上开启并发解析。

并发LogMiner解析方案:

主要分为三模块,

模块一:一个线程负责scn range 切分

模块二:获取切分的scn range,开启LogMiner线程并发的解析对应scn range 事件

模块三:顺序的处理获取到的事件

流程描述:

  1. scn range 切分线程

scn range,(start scn-end scn],end scn = start scn + batch range,根据scn = start scn + 1 定位日志文件,如果end scn > 这个日志文件的next_change-1, end scn=next_change-1。

select *

from v$log

where first_change# <= scn and next_change# > scn;

select *

from v$archived_log A

where first_change# <= scn and next_change# > scn

AND A.ARCHIVED = 'YES' AND A.STATUS = 'A' ;

scn = start scn + 1, eg: start scn=13541729493874, 查询V$LOGMNR_CONTENTS where scn > start scn, 也就是希望查询的第一个scn=13541729493875,根据这个scn定位日志文件。

  1. 顺序log 处理控制线程

获取切换分的scn range对象,添加到待LogMiner解析队列,同时也添加到待处理的log队列

  1. LogMiner线程池

获取待LogMiner队列的数据,LogMiner线程获取分片的startScn, endScn,开启LogMiner,判断是否需要持续LogMiner,查询V$LOGMNR_CONTENTS数据,

  1. LOG event 处理线程

相关推荐

自己动手写Android数据库框架_android开发数据库搭建

http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...

谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic

智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...

工信部:着力推动大模型算法、框架等基础性原创性的技术突破

工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...

乒乓反复纠结“框架不稳定”的三个小误区

很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...

前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈

IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...

三种必须掌握的嵌入式开发程序架构

前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...

怪不得别人3秒就知道软考案例怎么做能50+

软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...

UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透

10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...

勒索软件转向云原生架构,直指备份基础设施

勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...

ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来

在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...

APP 制作界面设计教程:一步到位_app界面设计模板一套

想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...

MCP 的工作原理:关键组件_mcp部件

以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...

软件架构_软件架构师工资一般多少

软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...

不知不觉将手机字体调大!老花眼是因为“老了吗”?

现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...

8000通用汉字学习系列讲座(第046讲)

[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...

取消回复欢迎 发表评论: