Sap Hana 数据迁移同步优化(二)

简述

CloudCanal 近期对 Hana 源端链路做了新一轮优化,这篇文章简要做下分享。

本轮优化主要包含:

  • 表级别 CDC 表
  • 表级别任务位点
  • 表级别触发器

单 CDC 表的问题

CloudCanal 在实现 Hana 源端增量同步时,最初采用的是单 CDC 表的模式。

即所有订阅表的增量数据(插入、更新、删除)通过触发器统一写入同一张 CDC 表。这样设计的初衷是简化架构和实现,但是同时也带来了一些问题。

  • 触发器执行效率低:采用单个 CDC 表时,我们将订阅表的字段值拼接成 JSON 字符串;虽然这种方式统一,但增加了触发器的复杂性。当字段数量超过 300
    个时,会导致触发器效率显著下降,影响同步性能。

  • 增量数据积压:所有订阅表的变更数据集中写入单个 CDC 表,当 A 表增量数据较多而 B 表较少时,混合写入会导致无法及时处理
    B 表数据,造成 B 表数据积压,影响同步及时性。

优化点

表级别 CDC 表

本次优化实现了表级别的 CDC 表设计,每张源表都对应一张 CDC 表,CDC 表的结构仅在原表结构的基础上增加了几个位点字段,用于增量同步。

原表

CREATE COLUMN TABLE "SYSTEM"."TABLE_TWO_PK" ("ORDERID" INTEGER NOT NULL ,"PRODUCTID" INTEGER NOT NULL ,"QUANTITY" INTEGER,CONSTRAINT "FANQIE_pkey_for_TA_171171268" PRIMARY KEY ("ORDERID", "PRODUCTID")
)

CDC 表

CREATE COLUMN TABLE "SYSTEM"."SYSTEMDB_FANQIE_TABLE_TWO_PK_CDC_TABLE" ("ORDERID" INTEGER,"PRODUCTID" INTEGER,"QUANTITY" INTEGER,"__$DATA_ID" BIGINT NOT NULL ,"__$TRIGGER_ID" INTEGER NOT NULL ,"__$TRANSACTION_ID" BIGINT NOT NULL ,"__$CREATE_TIME" TIMESTAMP,"__$OPERATION" INTEGER NOT NULL 
);
-- other index

触发器 (INSERT)

CREATE TRIGGER "FANQIE"."CLOUD_CANAL_ON_I_TABLE_TWO_PK_TRIGGER_104" AFTER INSERT ON "SYSTEM"."TABLE_TWO_PK" REFERENCING NEW ROW NEW FOR EACH ROW 
BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN  END; IF 1=1 THEN INSERT INTO "SYSTEM"."SYSTEMDB_FANQIE_TABLE_TWO_PK_CDC_TABLE" (__$DATA_ID, __$TRIGGER_ID, __$TRANSACTION_ID, __$CREATE_TIME, __$OPERATION, "ORDERID","PRODUCTID","QUANTITY") VALUES( "SYSTEM"."CC_TRIGGER_SEQ".NEXTVAL, 433, CURRENT_UPDATE_TRANSACTION(), CURRENT_UTCTIMESTAMP, 2, :NEW."ORDERID" ,:NEW."PRODUCTID" ,:NEW."QUANTITY"  ); END IF; 
END;

这样的设计 CDC 表的好处如下:

  • 表级别 CDC 表更加独立,方便进行多次订阅。
  • 触发器只需要执行 INSERT 语句,因此对于字段较多的表也能够快速执行。
  • 扫描消费 CDC 数据时,不需要做额外的处理,消费更简单。

表级别任务位点

表级 CDC 确实带来了许多好处,但在增量同步时,每个表都有自己的位点,原有的单一位点无法满足这种同步需求。

因此,CloudCanal 引入了表级别的增量同步位点,确保每个表能够消费各自对应的增量同步位点。位点的具体体现为:

[{"db": "SYSTEMDB","schema": "FANQIE","table": "TABLE_TWO_PK","dataId": 352,"txId": 442441,"timestamp": 1715828416114},{"db": "SYSTEMDB","schema": "FANQIE","table": "TABLE_TWO_PK_2","dataId": 97,"txId": 11212,"timestamp": 1715828311123},...
]

这样做的好处如下:

  • 位点精细控制:每个表都有自己的增量同步位点,使得增量任务可以针对特定表进行增量重放,而不是重放所有表的数据。这样可以实现更加精细的控制,减少不必要的数据传输和处理,提高同步效率。

  • 数据并行处理:由于每个表有自己的位点,可以实现表级别的并行处理。不同表的增量数据可以同时进行处理,避免了单一位点导致的串行处理瓶颈,从而加快了同步速度。

核心同步原理

对于一个增量任务来说,源端涉及到扫描多个 CDC 表,需要保证单个表变更数据的顺序。

增量消费基础处理模型如下:

  • 根据源端订阅表数量,初始化相应数量的 Table Worker 工作线程。
  • 每个 Table Worker 根据位点消费对应的 CDC 表数据。

实际的 Table Worker 工作线程会根据 事务 ID 计算本次扫描范围,判断该范围是否有未提交的事务:

  • 如果有未提交事务:扫描线程进入等待队列,等待下一轮扫描。
  • 如果没有未提交事务:根据确定的范围消费增量数据,并更新单表任务位点。

未来方向

表级别位点产品化

位点状态在增量同步过程中至关重要,但针对表级别的位点,目前尚未提供可视化的界面;

包括重置位点等功能都尚未支持产品化能力,后续会逐步完善。

总结

本文简要介绍 CloudCanal 近期对 Hana
源端数据同步的优化,以及链路未来的方向,希望对读者有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】深入理解指针(一)(上)

本篇文章将讲解: (1)内存和地址 (2)指针变量和细致 (3)指针变量类型的意义 一:内存和地址 (1)内存 在讲内存和地址之前,我们讲一个生活中的…

Three.js 研究:1、如何让物体动起来

1、制作模型动画 2、模型动画在代码中的调用 使用这个例子进行修改,使他能动作webgl_animation_skinning_morph.html 制作好的模型放到如下路径 /three.js-master/examples/models/gltf/无标题.gltf修改加载模型文件的地址 修改动画名称 运行 点击动画后&…

彩虹聚合二级域名DNS管理系统源码v1.3

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析, 目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口, 支持获…

Oracle 证书的重要性

随着信息技术的飞速发展,数据库管理已成为企业运营中不可或缺的一部分。Oracle作为全球领先的数据库管理系统提供商,其Oracle Certified Professional(OCP)认证已成为数据库管理员和开发人员追求的专业认证之一。本文将深入探讨Or…

标准化软件实施方案(直接套用即可)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施 软件开发全套资料获取:(本文末个人名片也可直接获取)软件开发全套资料_数字中台建设指南-CSDN博客 软件产品&am…

接口响应断言

目录 接口断言介绍接口断言方式介绍响应状态码断言 课程目标 掌握什么是接口断言。了解接口断言的多种方式。掌握如何对响应状态码完成断言。 思考 这两段代码是完整的接口自动化测试代码吗? …省略… when().get(“https://httpbin.ceshiren.com/get?namead&…

【LeetCode算法】第58题:最后一个单词的长度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:双指针法。low指向单词头,high指向单词后的空格,则high-low就是每个单词的长度。算法步骤:①low从头往后查找第一个非空格的字符&…

Python 将文件夹中的图片信息导入到 Excel 的表格

引言 在数据处理和管理的日常任务中,经常需要将文件夹中的图片文件信息(如文件名、路径、创建日期、大小、分辨率等)整理成一个 Excel 表格。这篇博客将介绍如何使用 Python 中的 wxPython 模块创建一个 GUI 应用,用户可以通过这…

【Linux】用户级缓冲区

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

微服务项目收获和总结---第4天(文章审核和保存)

文章审核以及APP端保存文章 业务流程: App端保存接口: 数据库表详情 文章的基本信息表:id,标题,作者id,频道id...... 文章的权限/配置表:存储文章是否可以评论,是否上架&#xff…

开源实用!猫抓媒体嗅探浏览器插件

CatCatch:网络资源,一触即发 - 精选真开源,释放新价值。 概览 CatCatch是一个专为浏览器设计的资源嗅探扩展,旨在帮助用户轻松捕获和分析网页中的各种资源。无论是视频、音频还是其他类型的文件,猫爪都能提供直观的界…

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8,在Vista系统下最高只能装到IE9。 2015年以后,JavaScript新增了很多语法,比如class、extends,还有let和const等等,这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

AI爆文写作:关注热点,提前埋伏好关键词,吃系统的热点推荐,吃搜索流量,让你的文章直接爆了!

做内容,要对热点敏感。 小米汽车的发布会时间,我们是不是提前就知道,发布会前,大家最关注的就是价格。 你看这个相关关键词搜索,10W太多了。 我看到有博主在发布会前,埋伏了一篇,公众号也有推…

读人工智能时代与人类未来笔记13_网络57

1. jun背控制 1.1. 威慑的目的是通过威胁发动盒站来防止盒站 1.2. jun背控制的目的是通过限制甚至废除57(或57类别)本身来防止盒站真 1.2.1. 与盒不扩散相配合,以一整套详尽的条约、技术保障措施、监管和其他控制机制为支撑,所…

B站pink老师CSS学习(二)

文章目录 一、emmet语法1.快速生成HTML结构语法 二、复合选择器1.什么是复合选择器2.后代选择器3.子选择器4.并集选择器5.伪类选择器6.链接伪类选择器7:focus伪类选择器8.总结 三、元素的显示模式1.什么是元素显示模式2.块元素3.行内元素4.行内块元素5.总结6.元素显…

08.1.jenkins安装方法

安装 配置官方下载源 #配置jenkins源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key下载jak、jenkins服务 #下载jdk11环境,并且配置yu…

C++ | Leetcode C++题解之第110题平衡二叉树

题目: 题解: class Solution { public:int height(TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || abs(leftHeight - rightH…

10.3.k8s的附加组件-图形化管理工具dashboard

目录 一、dashboard介绍 二、部署安装dashboard组件 1.下载dashboard本地文件 2.修改nodeport的端口范围 3.创建和查看dashboard 4.电脑浏览器访问测试 5.token登录方式登录dashboard 5.1.查看dashboard的token 5.2.继续查看用户token的secrets资源详细信息 5.3.复制…

【Linux】icmp_seq=1 Destination Host Unreachable

执行ping 命令提示:From 192.168.XX.XX icmp_seq1 Destination Host Unreachable 这个错误消息通常表示以下几种情况之一: 网络连接问题:目标主机可能没有连接到网络,或者网络中的某个路由器无法将数据包转发到目标主机。 目标主…

软考--软件设计师-刷题总结

一、数据结构 贪心算法 归并排序将问题先分解、再处理、再合并的方式采用了分治法的思想 分治法:将一个大问题分成若干个小问题 希尔排序: 定义一个 i 变量指向这一组的第二个数据,定义一个 j 变量指向 i - gap 的位置。 将 i 下标的值放到…