前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Debezium的增量快照

Debezium的增量快照

作者头像
GreatSQL社区
发布于 2023-02-22 02:23:56
发布于 2023-02-22 02:23:56
1K00
代码可运行
举报
运行总次数:0
代码可运行

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

Introduction

CDC(Change-Data-Capture)正被广泛应用于数据缓存、更新查询索引、创建派生视图、异构数据同步等场景,Debezium (https://debezium.io/) 作为 CDC 的代表项目之一,它收集数据库中的事务日志(变化事件)并以统一的事件流格式输出(支持「Kafka Connect」及「内嵌到程序中」两种应用形式)。

数据库的事务日志往往会进行定期清理,这就导致了仅使用事务日志无法涵盖所有的历史数据信息,因此 Debezium 在进行事件流捕获前通常会执行 consistent snapshot(一致性快照) 以获取当前数据库中的完整数据。默认情况下,事件流的捕获会在 consistent snapshot 完成之后 开启,不同数据量情况下,这个过程可能会耗费数小时乃至数天,并且一旦这个过程由于某些异常因素停止,那重新开启后,它将从头开始执行。

为了解决一致性快照的这些痛点问题,Debezium 提出了一个新的设计方案,并在 DDD-3 (https://github.com/debezium/debezium-design-documents/blob/main/DDD-3.md) 中详细介绍了该方案的核心理论,借鉴了 DBLog (https://arxiv.org/pdf/2010.12597v1.pdf)中的思想,使用一种基于 Watermark 的框架,实现了 Incremental snapshotting

Incremental snapshotting 的优势

  • 在任何时间都可以触发快照的动作,除了在捕获事件流前进行一次完整的快照外,在下游数据备份、丢失、恢复的场景中,往往也需要进行快照操作;
  • 快照可在执行过程中「挂起」和「恢复」,并且恢复执行后可定位到挂起前的位置,无需再从头开始;
  • 在执行快照时,不需要暂停事件流的捕获,也就是说快照可以和事件捕获同时执行,互不影响,保证了事件流的低延迟性;
  • 无锁,保证了在快照的同时数据库依然能够写入。

下面详细介绍 DBLog 论文中的方案。

DBLog

  • DBLog 使用基于 Watermark 的方法,它能在直接使用 select from 对数据库进行快照的同时捕获数据库的变化事件流,并使用相同的格式对 select 快照和事务日志捕捉进行输出。这意味着 DBLog 可选择在任意时刻开始执行快照,而不仅限于事件日志捕获开始前。
  • DBLog 同时支持快照的挂起和恢复,归功于它将数据按 chunk 进行划分,并且在外部系统(如 Zookeeper)中存储最近一次执行完成的 chunk。
  • DBLog 的输出通常为 Kafka,支持将输出结果落库和使用 API 获取。
  • DBLog 支持高可用,使用主备的方式保证同一时间会有一个活跃的实例处于正常工作状态,多个备用实例处于等待状态,一但工作中的实例发生异常,备用实例将会激活,替代原实例工作。

DBLog 的架构如下图所示:

下面将详细介绍 DBLog 的事务日志捕获和快照机制。

事务日志捕获( Transaction log capture)

事务日志捕获依赖于数据库的支持,如 MySQLPostgreSQL 都提供了 replication 协议,DBLog 将作为数据库主节点的一个从节点,数据库主节点在事务执行完成后会向 replication 从节点发送事务日志(经由 TCP)。通常的事务日志中包含 createupdatedelete 类型的事件,DBLog 对这些事件进行处理,最终包装为一种统一的格式输出,输出的结果将包含各 column 在事务发生时的状态(事务发生前后的值),每个事件的包装都会以一个 8-byte 且严格单调递增的 LSN(Log Sequence Number)标识,该 LSN 表示该事件在事务日志中的偏移量。上述处理后的输出结果将会存储在 DBLog 进程的内存中,由另外的辅助线程将这些结果搬运到最终的目的地(如 Kafka、DB 等)。

事务日志中还包含了 schema 变化相关的事件,需要妥善处理,但不是本文讨论的重点,这里暂且忽略不提。

完整状态捕获(Full state capture)

事务日志由于定期清理等原因,通常无法保存当前数据库的所有历史状态,而在许多应用场景(如同步)中,都需要保证能完整重现源库的所有数据,这就需要提供一种扩展的 Full state capture 机制。一种较为直观的手段是对每个表建立相应的 copy 表,并将原表中的数据按批(Chunk)写入到 copy 表中,这些写入操作就会按照正确的顺序产生一系列的事务日志事件,在后续处理中就可以正确消费到这些事件(此时正常的事务事件可以同时生成)。这种方式的缺点在于需要消耗 IO 和磁盘空间,虽然可以使用诸如 MySQL bloackhole engine 规避,但实现方式依赖于数据库提供商的特性,没有泛用性。

DBLog 提供了一种更为通用且对源库影响较小策略,它无需将所有的源表中的数据写入到事务日志中,而是采用分批处理的方式,以 Chunk 为单位将源表中的数据查询出来(严格要求每次查询都以主键排序),将这些数据处理成为 DBLog 中的事件结果,并添加到该过程中产生的正常事务事件结果之后。执行过程中需要在外部存储(如 Zookerper)中存储上一个已完成的 Chunk 的最后一行的主键值,这样当这个过程被挂起后,就可以根据这个主键值恢复定位到最近一次执行成功的位置。

下图为 Chunk 的示例,该表中的主键为 c1,且查询时按 c1 进行排序,Chunk size 为 3。当执行 Chunk2 的查询时,会从存储中取出一个表示 Chunk1 最后一行数据的主键 4,而后执行的 Chunk2 查询就会增加条件 c1 > 4。

由于在查询 Chunk 过程中,正常的事务事件仍然同时在产生和执行,为了保证这个过程中不会发生「新数据」被「旧数据」覆盖的情况,每个 Chunk 在与正常事件合并前需要进行特殊处理。核心算法就是在正常的事务事件流中人为插入 Watermark 事件以标记 Chunk 的起止位置,Watermark 就是我们在源端库中创建的一张特殊的表,它由唯一的名称标识,保证不与现有的任何表名冲突,这个表中仅存储 一行一列 的数据,该记录中的数据为一个永不重复的 UUID,这样每当对这个记录进行 update 时,就会在事务日志中产生一条有 UUID 标识的事件,这个事件就称为 watermark event

下面算法就是整个 Full state capture 的核心步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Algorithm: Watermark-based Chunk Selection
Input: table

(1) pause log event processing
    lw := uuid(), hw := uuid()
(2) update watermark table set value = lw
(3) chunk := select next chunk from table
(4) update watermark table set value = hw
(5) resume log event processing
    inwindow := false
    // other steps of event processing loop
    while true do
    e := next event from changelog
    if not inwindow then
        if e is not watermark then
            append e to outputbuffer
        else if e is watermark with value lw then
            inwindow := true
    else
        if e is not watermark then
(6)         if chunk contains e.key then
                remove e.key from chunk
            append e to outputbuffer
        else if e is watermark with value hw then
(7)         for each row in chunk do
                append row to outputbuffer
    // other steps of event processing loop
...

该算法流程会一直循环,直至表中的所有数据都被处理完成。

  • 步骤 1 暂停当前的正常事件日志捕获并生成两个 UUID: lwhw。注意这里是暂停 DBLog 对事件的捕获,而不是暂停源端数据库的日志写入,这个暂停过程中仍然可以有很多的写入事件发生,这个暂停的过程较为短暂,在步骤 5 中会恢复;
  • 步骤 2 和步骤 4 分别使用步骤 1 中生成 lwhw 去修改 Watermark 表中的记录,这将会在事务日志中记录两个 update 事件;
  • 步骤 3 查询某一个 Chunk 中的所有记录,并将查询的结果 chunk 保存在内存中,这个操作被夹在两个 watermark 的更新操作之间,后续的处理流程就可以以这两个位置为依据标识出哪些事件是在这次 Chunk 查询过程中发生的;
  • 步骤 5 开始,恢复正常的事件日志捕获,并循环遍历每个按顺序捕获到的事件,如果事件发生在 lw 前,则直接添加到输出结果的内存中;
  • 如果事件 e 进入到了 lwhw 的区间中,则会在步骤 3 中的结果 chunk 中剔除与 e 具有相同主键的记录,lwhw 窗口内到达的事件表示在查询 Chunk 过程中有更「新」的数据达到,因此剔除掉 chunk 结果中的「旧数据」,保证「新数据」能够被最终结果应用;
  • 如果事件 e 已经超过了 hw,则直接将 chunk 结果中剩余的所有记录附加到输出结果末尾。

下面以一个具体的例子来演示一下算法的过程:

上图中以 k1-k6 表示一张表中的主键值,change log 中的每个事务日志事件也以主键标识为对该行数据的修改,步骤 1-4 与算法中的步骤编号相对应。图中表示了某次 Chunk 的查询过程,暂停事件日志捕获后,先后执行了步骤 2-4,在内存中产生了一个 chunk 结果,并在源数据库的事务日志中记录了两条 watermark。

上图中是步骤 5-7 的过程,我们以主键作为依据,从 chunk 结果中剔除了 LH 窗口中修改数据事件对应的相关记录。

最终,将剩余的 chunk 结果附加到 H 之后,就完成了一个 Chunk 的选择过程。

总结

本文详细介绍了 Debezium 的 Incremental snapshot 的实现基础——DBLog,它在原有的 CDC 基础上使用一种基于 Watermark 的框架,扩展了 Full state capture 的功能,能够在事务日志事件捕获开启的同时执行快照,支持挂起和恢复操作,且用户能在任何时间点开启该快照操作。

Enjoy GreatSQL :)


《零基础学习MySQL》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/video/BV1Da411W7Va?spm_id_from=333.999.0.0&vd_source=ae1951b64ea7b9e6ba11f1d0bbcff0e4


文章推荐:


关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

GreatSQL社区官网: https://greatsql.cn/

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GreatSQL社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flink CDC 1.0至3.0回忆录
导读 本文主要分享 Flink CDC 1.0至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。
一臻数据
2024/12/24
1560
Flink CDC 1.0至3.0回忆录
DDIA:数据库导出就变成了流
我们已经对比了消息代理和数据库的诸多方面。在传统上,他们被认为是两个完全不同类别的系统,但在之前小节的分析我们看到,基于日志的消息系统中成功地从数据库中借鉴了许多经验。其实,我们也可以有另外一条路,从消息系统中借鉴一些思想,应用到数据库中。
木鸟杂记
2024/04/16
940
DDIA:数据库导出就变成了流
如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统
审计日志系统有很多应用场景,而不仅仅是存储用于审计目的的数据。除了合规性和安全性的目的之外,它还能够被市场营销团队使用,以便于锁定目标用户,也可以用来生成重要的告警。
Spark学习技巧
2021/03/11
1.1K0
如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统
Flink CDC + Hudi 海量数据入湖在顺丰的实践
摘要:本文整理自顺丰大数据研发工程师覃立辉在 5月 21 日 Flink CDC Meetup 的演讲。主要内容包括:
从大数据到人工智能
2022/06/27
1.2K0
Flink CDC + Hudi 海量数据入湖在顺丰的实践
DBLog:一种基于水印的变更数据捕获框架(论文翻译)
应用程序通常会使用多个异构数据库,每个数据库都用于服务于特定的需求,例如存储数据的规范形式或提供高级搜索功能。因此,对于应用程序而言,将多个数据库保持同步是非常重要的。我们发现了一系列尝试解决此问题的不同方式,例如双写和分布式事务。然而,这些方法在可行性、稳健性和维护性方面存在局限性。最近出现的一种替代方法是利用变更数据捕获(CDC)框架,从数据库的事务日志中捕获变更的行,并以低延迟将它们传递到下游系统。为了解决数据同步的问题,还需要复制数据库的完整状态,而事务日志通常不包含完整的变更历史记录。同时,某些应用场景要求事务日志事件的高可用性,以使数据库尽可能地保持同步。
tyrantlucifer
2023/10/03
6310
DBLog:一种基于水印的变更数据捕获框架(论文翻译)
数据同步工具之FlinkCDC/Canal/Debezium对比
数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术,随着国产化的需求,我们也逐步考虑基于开源产品进行准实时数据同步工具的相关开发,逐步实现对商业产品的替代。本文把市面上常见的几种开源产品,Canal、Debezium、Flink CDC 从原理和适用做了对比,供大家参考。
王知无-import_bigdata
2021/10/27
13.6K0
Flink社区 | Flink CDC 2.0 正式发布,核心改进详解
摘要:本文由社区志愿者陈政羽整理,内容来源自阿里巴巴高级开发工程师徐榜江 (雪尽) 7 月 10 日在北京站 Flink Meetup 分享的《详解 Flink-CDC》。深入讲解了最新发布的 Flink CDC 2.0.0 版本带来的核心特性,包括:全量数据的并发读取、checkpoint、无锁读取等重大改进。
大数据技术架构
2021/08/25
2.6K0
Flink社区 | Flink CDC 2.0 正式发布,核心改进详解
Debezium 初了解
在研究 Flink CDC 时,其中涉及了 Debezium,便决定研究一下 Debezium。这篇文章简单介绍了 Debezium 是什么,以及它的架构和特性。后续文章中会后续介绍其功能特性以及如何使用。
smartsi
2021/08/13
5.9K0
Flink CDC MongoDB Connector 的实现原理和使用实践
摘要:本文整理自 XTransfer 资深 Java 开发工程师、Flink CDC Maintainer 孙家宝在 Flink CDC Meetup 的演讲。主要内容包括:
从大数据到人工智能
2022/09/09
2.7K0
Flink CDC MongoDB Connector 的实现原理和使用实践
Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本
Flink CDC [1] 是基于数据库的日志 CDC 技术,实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。
857技术社区
2023/07/26
5790
Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本
基于 Kafka 与 Debezium 构建实时数据同步
在进行架构转型与分库分表之前,我们一直采用非常典型的单体应用架构:主服务是一个 Java WebApp,使用 Nginx 并选择 Session Sticky 分发策略做负载均衡和会话保持;背后是一个 MySQL 主实例,接了若干 Slave 做读写分离。在整个转型开始之前,我们就知道这会是一块难啃的硬骨头:我们要在全线业务飞速地扩张迭代的同时完成架构转型,因为这是实实在在的”给高速行驶的汽车换轮胎”。
PHP开发工程师
2021/05/08
2.6K0
基于 Kafka 与 Debezium 构建实时数据同步
「首席看架构」CDC (捕获数据变化) Debezium 介绍
Debezium是一个分布式平台,它将您现有的数据库转换为事件流,因此应用程序可以看到数据库中的每一个行级更改并立即做出响应。Debezium构建在Apache Kafka之上,并提供Kafka连接兼容的连接器来监视特定的数据库管理系统。Debezium在Kafka日志中记录数据更改的历史,您的应用程序将从这里使用它们。这使您的应用程序能够轻松、正确、完整地使用所有事件。即使您的应用程序停止(或崩溃),在重新启动时,它将开始消耗它停止的事件,因此它不会错过任何东西。
架构师研究会
2019/10/15
2.6K0
基于Apache Hudi和Debezium构建CDC入湖管道
当想要对来自事务数据库(如 Postgres 或 MySQL)的数据执行分析时,通常需要通过称为更改数据捕获[4] CDC的过程将此数据引入数据仓库或数据湖等 OLAP 系统。Debezium 是一种流行的工具,它使 CDC 变得简单,其提供了一种通过读取更改日志[5]来捕获数据库中行级更改的方法,通过这种方式 Debezium 可以避免增加数据库上的 CPU 负载,并确保捕获包括删除在内的所有变更。现在 Apache Hudi[6] 提供了 Debezium 源连接器,CDC 引入数据湖比以往任何时候都更容易,因为它具有一些独特的差异化功能[7]。Hudi 可在数据湖上实现高效的更新、合并和删除事务。Hudi 独特地提供了 Merge-On-Read[8] 写入器,与使用 Spark 或 Flink 的典型数据湖写入器相比,该写入器可以显着降低摄取延迟[9]。最后,Apache Hudi 提供增量查询[10],因此在从数据库中捕获更改后可以在所有后续 ETL 管道中以增量方式处理这些更改下游。
ApacheHudi
2022/04/01
2.2K0
基于Apache Hudi和Debezium构建CDC入湖管道
Debezium使用指南
实时数仓的第一步便是变更数据捕获(CDC),Debezium就是一款功能非常强大的CDC工具。Debezium是构建于Kafka之上的,将捕获的数据实时的采集到Kafka上
姜同学
2022/10/27
3.6K2
Debezium使用指南
Debezium的基本使用(以MySQL为例)
简单理解就是Debezium可以捕获数据库中所有行级的数据变化并包装成事件流顺序输出。
GreatSQL社区
2023/02/23
3.2K0
DDIA:流积分就是快照,快照微分就得到了流
我们在这里讨论的事件溯源(event souring)和领域驱动设计(domain-driven design,DDD)社区中的相关概念有些相似之处。由于这个概念会牵扯出流式系统中的一些重要的思想,因此我们这里简单讨论一下。
木鸟杂记
2024/04/23
980
DDIA:流积分就是快照,快照微分就得到了流
实时访问后端数据库的变更数据捕获
利用 CDC,您可以从现有的应用程序和服务中获取最新信息,创建新的事件流或者丰富其他事件流。CDC赋予您实时访问后端数据库的能力。
云云众生s
2024/03/28
2000
实时访问后端数据库的变更数据捕获
Debezium 2.0.0.Final Released
自2019年12月发布1.0版本以来,社区一直在积极构建一个全面的开源低延迟变更数据捕获(CDC)平台。在过去的三年里,我们扩展了Debezium的产品组合,包括用于Oracle的稳定连接器、社区主导的Vitess连接器、增量快照的引入、多分区支持等等。在社区活跃贡献者和提交者的帮助下,Debezium成为CDC领域事实上的领导者,部署在多个行业的许多组织的生产环境中,使用数百个连接器将数据更改从数千个数据库平台输出到实时流。
大数据技术架构
2022/12/01
3.1K0
Flink + Debezium CDC 实现原理及代码实战
Debezium 是一个分布式平台,它将现有的数据库转换为事件流,应用程序消费事件流,就可以知道数据库中的每一个行级更改,并立即做出响应。
kk大数据
2020/12/29
7.9K0
Flink + Debezium CDC 实现原理及代码实战
基于流计算 Oceanus Flink CDC 做好数据集成场景
数据时代,企业对技术创新和服务水准的要求不断提高,数据已成为企业极其重要的资产。无论是在在企业数据中台的建设,亦或者是打造一站式数据开发和数据治理的PASS平台。 首先需要做的就是进行跨应用的数据融合计算,需要将数据从孤立的数据源中采集出来,汇集到可被计算平台高效访问的目的地。此过程称之为ETL。通常所说的同步大致分为离线全量ETL、离线增量+离线全量的ETL、实时增量+离线全量ETL、实时增量ETL4种方式。 数据同步成为企业数据开发和使用一个绕不过去的技术需求。业内也存在大量的开源的解决方案。 在数据集成技术选型中,我们需要考虑的因素有哪些?主流开源方案中各自的优缺点有哪些?目前备受瞩目和推崇 Flink CDC ETL 是否能作为线上主力同步工具之一,它的优势有哪些?原理是什么?本文主要围绕以上几个疑问,进行论述。
Andy_l
2021/12/22
1.6K1
基于流计算 Oceanus Flink CDC 做好数据集成场景
推荐阅读
相关推荐
Flink CDC 1.0至3.0回忆录
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验