CDC 数据复制:技术、权衡、见解

news2024/9/23 9:29:19

推荐:使用NSDT场景编辑器助你快速搭建可编辑的3D应用场景

在本文中,我将定义 CDC 数据复制,简要讨论最常见的用例,然后讨论常见技术及其权衡。最后,我将提供一些我作为数据集成公司Dataddo的首席执行官和创始人所学到的一般实现见解。

什么是变更数据捕获 (CDC) 数据复制?

CDC 数据复制是一种在两个数据库之间实时或近乎实时地复制数据的方法,其中仅复制新添加或修改的数据。

它是快照复制的替代方法,快照复制涉及一次又一次地将一个数据库的整个快照移动到另一个数据库。快照复制可能适用于需要随着时间的推移保留其数据的单个快照的组织,但它非常占用大量处理,并且会留下很大的财务足迹。对于不需要这样做的组织,CDC可以节省大量付费处理时间。

可以实时或小批量(例如每小时)捕获数据更改并将其传送到新目的地。

CDC 数据复制:技术、权衡、见解


此图说明了基于日志的 CDC,其中红色行是新添加的数据。

值得一提的是,CDC并不是一个新过程。然而,直到最近,只有大型组织才有工程资源来实施它。新的是越来越多的托管工具选择,使其成本低廉,因此它新近受欢迎。

最常见的CDC用例

本文没有足够的篇幅来涵盖 CDC 数据复制的所有用例,但以下是最常见的三个用例。

用于商业智能和分析的数据仓库

任何运行专有数据收集系统的组织都可能拥有一个生产数据库,用于存储来自此系统的关键信息。

由于生产数据库是为写入操作而设计的,因此它们在将数据投入盈利用途方面没有多大作用。因此,许多组织希望将数据复制到数据仓库中,在那里他们可以运行复杂的读取操作以进行分析和商业智能。

如果您的分析团队需要近乎实时的数据,CDC 是向他们提供数据的好方法,因为它会在更改时快速将更改交付到分析仓库。

数据库迁移

当您从一种数据库技术迁移到另一种数据库技术时,CDC 也很有用,并且您需要在停机时保持所有内容可用。一个典型的例子是从本地数据库迁移到云数据库。

灾难恢复

与迁移案例类似,CDC 是一种高效且可能具有成本效益的方法,可确保在其中一个物理位置停机时,您的所有数据始终在多个物理位置可用。

常见的CDC技术及其权衡

CDC有三种主要的技术,每种技术都有自己的优点和缺点。

CDC 数据复制:技术、权衡、见解


CDC 实施涉及灵活性、保真度、延迟、维护和安全性之间的权衡。

基于查询的 CDC

基于查询的CDC非常简单。使用此技术所做的只是编写一个简单的选择查询以从特定表中选择数据,然后是一些条件,例如“仅选择昨天更新或添加的数据”。假设您已经配置了辅助表的架构,则这些查询将获取此更改的数据,并生成包含该数据的新二维表,该表可以插入到新位置。

优势

  • 高度灵活。允许您定义要捕获的更改以及如何捕获这些更改。这样可以更轻松地以非常精细的方式自定义复制过程。
  • 减少开销。仅捕获满足特定条件的更改,因此它比捕获数据库所有更改的 CDC 便宜得多。
  • 更易于故障排除。如果出现任何问题,可以轻松检查和纠正单个查询。

  • 复杂的维护。必须维护每个单独的查询。例如,如果您的数据库中有几百个表,您可能还需要这么多查询,而维护所有这些查询将是一场噩梦。这是主要缺点。
  • 更高的延迟。依赖于轮询更改,这可能会在复制过程中引入延迟。这意味着您无法使用选择查询实现实时复制,并且需要计划某种批处理。如果您需要使用较长的时间序列(例如客户行为)分析某些内容,这可能不是什么大问题。

基于日志的疾病预防控制中心

我们目前使用的大多数数据库技术都支持集群,这意味着您可以在多个副本中运行它们以实现高可用性。此类技术必须具有某种二进制日志,该日志捕获对数据库的所有更改。在基于日志的 CDC 中,更改是从日志而不是数据库本身读取的,然后复制到目标系统。

优势

  • 低延迟。数据更改可以非常快速地复制到下游系统。
  • 高保真度。日志捕获对数据库的所有更改,包括数据定义语言 (DDL) 更改和数据操作语言 (DML) 更改。这使得跟踪已删除的行成为可能(这在基于查询的 CDC 中是不可能的)。

  • 更高的安全风险。需要直接访问数据库事务日志。这可能会引起安全问题,因为它需要广泛的访问级别。
  • 灵活性有限。捕获对数据库的所有更改,这限制了定义更改和自定义复制过程的灵活性。在自定义要求很高的情况下,必须对日志进行大量后处理。

通常,基于日志的 CDC 很难实现。有关详细信息,请参阅下面的“见解”部分。

基于触发器的疾病预防控制中心

基于触发器的CDC是前两种技术之间的混合。它涉及定义用于捕获表中某些更改的触发器,然后将其插入到新表中并在新表中进行跟踪。正是从这个新表中将更改复制到目标系统。

优势

  • 灵活性。允许您定义要捕获的更改以及如何捕获这些更改(如在基于查询的 CDC 中),包括已删除的行(如在基于日志的 CDC 中)。
  • 低延迟。每次触发触发器时,它都算作一个事件,并且可以实时或近乎实时地处理事件。

  • 极其复杂的维护。就像基于查询的 CDC 中的查询一样,所有触发器都需要单独维护。因此,如果您有一个包含 200 个表的数据库,并且需要捕获所有表的更改,则总体维护成本将非常高。

实施见解

作为一家数据集成公司的首席执行官,我在实施 CDC 方面拥有丰富的经验。以下是我在此过程中学到的一些东西。

不同日志的不同实现

基于日志的 CDC 特别复杂。这是因为所有日志——例如 MySQL 的 BinLog、Postgres 的 WAL 、Oracle 的 Redo Log、Mongo DB 的 Oplog——虽然在概念上相同,但实现方式不同。因此,您需要深入研究所选数据库的低级参数才能使事情正常工作。

将数据更改写入目标

您需要确定如何在目标目标中准确插入、更新和删除数据。

一般来说,插入很容易,但音量在口述方法中起着重要作用。无论您是使用批量插入、数据流还是决定使用文件加载更改,您都将始终面临技术权衡。

为了确保正确更新并避免不必要的重复,您需要在表顶部定义一个虚拟键,该键告诉您的系统应该插入什么以及应该更新什么。

为了确保正确删除,您需要有一些故障保护机制,以确保错误的实现不会导致删除目标表中的所有数据。

维护长时间运行的作业

如果您只传输几行,事情会很容易,但如果是这种情况,那么您可能不需要CDC。因此,一般来说,我们可以预期CDC的工作需要几分钟甚至几小时,这将需要可靠的监测和维护机制。

错误处理

这可能是一篇单独文章的主题。??但是,简而言之,我可以说每种技术都有不同的方法来引发异常和呈现错误。因此,您应该定义一个策略,以便在连接失败时执行的操作。是否应该重试?您应该封装事务中的所有内容吗?

CDC 数据复制:技术、权衡、见解

在内部实施 CDC 数据复制非常复杂,并且非常特定于案例。这就是为什么它传统上不是一种流行的复制解决方案,也是为什么很难就如何实现它提供一般建议的原因。近年来,Dataddo、Informatica、SAP Replication Server 等托管工具显著降低了可访问性的门槛。

不适合所有人,但对某些人来说很棒

正如我在本文开头提到的,CDC有可能为公司节省大量财务资源:

  • 其主数据库主要由不经常更改的数据组成(即每日更改仅占其中数据的相对一小部分)
  • 谁的分析团队需要近乎实时的数据
  • 不需要随着时间的推移保留其主数据库的完整快照

然而,没有完美的技术解决方案,只有权衡。这同样适用于 CDC 数据复制。那些选择实施CDC的人将不得不不平等地优先考虑灵活性,保真度,延迟,维护和安全性。

原文链接:CDC 数据复制:技术、权衡、见解 (mvrlink.com)

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

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

相关文章

使用logback异步打印日志

文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说,在业务代码中添加日志是至关重要的,尤…

CSS:弹性盒子模型详解(用法 + 例子 + 效果)

目录 弹性盒子模型flex-direction 排列方式 主轴方向换行排序控制子元素缩放比例缩放是如何实现的? 控制子元素的对其方式justify-content 横向 对齐方式align-items 纵向 对齐方式 align-content 多行 对齐方式 弹性盒子模型 flex-direction 排列方式 主轴方向 f…

webshell免杀项目-Auto-JSPwebshell(五)

Auto-JSPwebshell/jsp免杀/webshell免杀/自动生成 项目地址: https://github.com/G0mini/Bypass 具体使用请参考: https://mp.weixin.qq.com/s/9-__B0MBRSXHla6O0KU7Gg

PCB制造中铜厚度的重要性

电子产品中的PCB是现代电子设备中不可或缺的一部分。在PCB制造过程中,铜厚度是一个非常重要的因素。正确的铜厚度可以保证电路板的质量和性能,同时也影响着电子产品的可靠性和稳定性。 一般我们常见的铜厚有17.5um(0.5oz)&#x…

SpringBootWeb案例-准备工作

目录 前言 准备工作 需求&环境搭建 需求 环境搭建 开发规范 Restful开发规范 统一的响应结果 开发流程 前言 根据过往的文章可以知道目前我已经学习完了前端、后端、数据库的基础知识,接下来通过一个基于SpringBoot工程开发的web项目案例。 准备工作 …

来讲一讲面试必问的异步FIFO设计!

异步FIFO设计可以说是数字IC设计工程师面试时必问的一个问题了,也是我们经常使用但是又往往被忽略的一个东西,今天就展开详细说一说不同深度(2^N或者非2^N)异步FIFO的设计思想; 一:2^N深度异步FIFO设计 1…

Unity开发笔记:截取指定位置含有UI的场景截图并输出

学习记录整理,自用,也希望能帮助到有相同需求的人。 如果直接截全图: string screenshotName "Assets/Textures/UI/20230803/2.png";ScreenCapture.CaptureScreenshot(screenshotName);截取指定位置含有UI的场景截图: …

Therac-25事故:软件缺陷引发的医疗灾难与教训

目录 引言 Therac-25:背景与功能 软件缺陷导致的灾难 Bug原理解析与编程人员的反思 教训与反思 结论 引言 在计算机科技的进步与应用领域,软件的质量和安全性至关重要。然而,历史上曾经发生过一系列令人震惊的事件,突显了软…

培训报名小程序报名功能完善

目录 1 修改数据源2 修改表单3 支付成功时修改状态4 创建报名成功页5 最终的效果总结 目前我们的报名功能已经搭建了一个基础版,后续需要展示用户已经报名的信息,需要添加一个状态来显示用户是否成功付费。 1 修改数据源 打开我们的报名数据源&#xff…

google PGS 下一代id

前言:为了进一步增强用户的隐私及其多平台游戏体验,Play 游戏服务(PGS) 正在推出下一代玩家 ID,用户第一次玩游戏时,他们将始终被分配一个唯一的下一代玩家 ID,无论用户在什么设备或平台上玩游戏,该 ID 都将…

加入[无人驾驶吕同学]Apollo专属课程领礼品啦!

号外号外,无人驾驶吕同学的Apollo领航官专属课程已经上线了。用户完成课程50%即可领取专属福利(百度限定鼠标垫、Apollo限量帆布包、Apollo六周年定制钥匙扣、Apollo六周年限定徽章),四种礼品任选其一。 课程链接:htt…

使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

文章目录 前言聊天应用程序组件和技术LangChain Python框架开放人工智能模型前端 Streamlit UI使用 Docker 进行部署Docker 优化以实现轻量级和快速构建Docker-compose.yaml 文件基础设施Streamlit 公共云谷歌应用引擎使用 Google Cloud Run 部署应用1.启动服务2. 创建角色并将…

水产养殖产量低?教你个万能的方法!

水产养殖业作为重要的食品生产和经济活动之一,为人们提供了丰富的水产品,但如果不加以适当监测和管理,也可能对水质和生态系统造成负面影响。因此,水产养殖用水监测显得尤为重要。 在养殖过程中,水质的优劣直接影响着养…

Linux小型操作系统项目,《操作系统真象还原》第三章——完善MBR

前引 上一章我们完成了MBR的雏形编写,但是只打印了几个字符,这一章我们才要真正地去完成MBR的功能。 在完成MBR的功能之前我们要先了解一些知识,首先介绍什么是实模式。 书上的内容实在繁杂,简单地说,实模式没有虚拟和…

【算法|数组】双指针

算法|数组——双指针 引入 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:…

77. 组合

题目链接&#xff1a;力扣 解题思路&#xff1a; AC代码 class Solution {List<Integer> tem new ArrayList<>();List<List<Integer>> result new ArrayList<>();public List<List<Integer>> combine(int n, int k) {process(n…

重试框架入门:Spring-RetryGuava-Retry

前言 在日常工作中&#xff0c;随着业务日渐庞大&#xff0c;不可避免的涉及到调用远程服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素&#xff0c;因此&#xff0c;我们需要考虑合适的重试机制去处理这些问题&#xff0c;最基础的方式就是手动重试&#xf…

Vue3:页面A搜索后跳转到页面B,然后从页面B退回页面A重新搜索,但是得到的页面B得刷新一下才会显示正确的数据

问题 Vue3&#xff1a; 从页面A进行搜索后跳转到页面B&#xff0c;然后从页面B退回页面A重新搜索&#xff0c;但是得到的页面B得刷新一下才会显示正确的数据。 读取数据的代码格式大致如下&#xff08;代码做了一些删减&#xff09;&#xff1a; 解决 会出现上述情况&#…

DIY 一个 Docker Base Image

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…

低代码平台“高”效率开发的5个能力

迫于智改数转的压力&#xff0c;促使企业要不停地思考如何从低代码的角度释放一些重复枯燥又高成本的人力投入。历经多次重大重构及大量项目实战验证之后&#xff0c;个人认为一款高效率的低代码开发平台&#xff0c;应有以下几点能力。 一、低代码平台“高”效率开发的5个能力…