CDC (Change Data Capture) 新手指南

译者简介:ASCE1885,《Android 高级进阶》[1] 和 《Android 高级进阶(源码剖析篇)》[2]作者 

原文链接:A beginner’s guide to CDC (Change Data Capture)[3]

229243e0692c87ff734694431b230144.jpeg

引言

在 OLTP(Online Transaction Processing,在线事务处理) 系统中,多个事务会同时访问和修改数据,数据库会从一个一致性状态过渡到新的一致性状态。OLTP 系统总是会显示数据的最新状态,从而有助于开发要求近乎实时的数据一致性保证的前端应用程序。

然而,OLTP 系统并不是孤岛,它只是企业系统中的一部分,封装了对所有数据转换的功能。当将 OLTP 系统与缓存、数据仓库或者内存数据网格集成时,我们需要通过 ETL[4] 处理流程来收集在给定时间段内 OLTP 系统数据变更的事件列表。

本文我们将介绍用于捕获事件并将其发送给其他数据处理系统的各种方法。

触发器

事件捕获最常用的技术是使用数据库或应用程序级别的触发器。这种技术仍然应用广泛的原因是比较简单而且大家都比较熟悉。

审计日志(Audit Log)是一个独立的组件,用来记录数据库中每一行数据的插入,更新或者删除操作。

eddca9ee65afbf8fa9d79c49665d96c0.jpeg

数据库触发器

所有的关系型数据库都支持触发器,虽然在语法和功能上略有不同。PostgreSQL 的官方 wiki 专门介绍了实现基于触发器的审计日志[5]的方案。

应用程序级别触发器

也有一些框架会在应用程序级别模拟数据库触发器,例如 Hibernate Enver[6]。它的优点是你无须考虑特定数据库的触发器语法,因为事件都由 Persistence Context 来捕获。缺点是没法记录没有通过应用程序的数据库变更事件(例如来自数据库控制台或者其他共享相同数据库的系统的变更操作)。

事务日志

虽然数据库或者应用级别的触发器是实现 CDC 的常见方式,但其实我们有更好的选择。数据库的审计日志 是数据库事务日志[7](例如 Redo Log 或者 Write-Ahead Log)的拷贝,它记录了每一行的修改。

因此,我们不需要使用数据库或者应用级别的触发器去创建新的 审计日志组件,而是直接扫描数据库的事务日志并从中抽取出 CDC 事件日志即可。

历史上,每个关系型数据库都会使用自己的方式去解码底层的事务日志:

•Oracle 提供了 GoldenGate[8]•SQL Server 提供了内置对 CDC 的支持[9]•在 Web 应用系统中广泛使用的 MySQL 则支持通过各种第三方解决方案(例如 LinkedIn 的 DataBus[10])来捕获 CDC 事件

现在我们有了一个新的成员 Debezium[11],它是一个开源框架,由 RedHat 负责管理,并为 Oracle、MySQL、PostgreSQL 甚至 MongoDB 都提供了连接器。

通过 Debezium,我们不仅能够抽取 CDC 事件,而且能够把这些事件发送给 Apache Kafka,Kafka 通常作为大型企业系统各个模块之间信息交换的管道。

1e99f08fe904b54475f8ca69dfcf3b44.jpeg

总结

如果你使用的是 OLTP 应用程序,那么当需要集成当前企业系统中的其他模块时,CDC 就派上用场了。有些人可能会说使用 Event Sourcing 更好,甚至可以完全替换 OLTP 系统,因为它可以预先记录每个事件,并在之后派生出最新的快照。

虽然 Event Sourcing 功能强大,但很多应用程序可以从 OLTP 数据模型中获益,因为事件在持久化之前经过验证,这意味着数据库并发控制机制可以消除异常事件。

否则,通过其 Bigtable[12] 数据存储倡导使用 MapReduce 进行大数据处理的 Google ,就不会投入那么多精力来构建像 Spanner[13] 这样的全球的分布式且兼容 ACID 数据库的系统,它 被设计用于构建关键任务的在线事务处理(OLTP)应用程序。

575163b79ff3668f5d5bbee687849c74.jpeg

References

[1] 《Android 高级进阶》: https://item.jd.com/11999029.html
[2] 《Android 高级进阶(源码剖析篇)》: https://xiaozhuanlan.com/android-advanced
[3] A beginner’s guide to CDC (Change Data Capture): https://vladmihalcea.com/a-beginners-guide-to-cdc-change-data-capture/
[4] ETL: https://en.wikipedia.org/wiki/Extract,_transform,_load
[5] 基于触发器的审计日志: https://wiki.postgresql.org/wiki/Audit_trigger
[6] Hibernate Enver: http://hibernate.org/orm/envers/
[7] 事务日志: https://vladmihalcea.com/how-does-a-relational-database-work/
[8] GoldenGate: http://www.oracle.com/technetwork/middleware/goldengate/overview/index.html
[9] 内置对 CDC 的支持: https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017
[10] DataBus: https://github.com/linkedin/databus
[11] Debezium: https://debezium.io/
[12] Bigtable: https://en.wikipedia.org/wiki/Bigtable
[13] Spanner: https://cloud.google.com/spanner/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值