CDC (Change Data Capture) 新手指南
Posted ACE1985
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDC (Change Data Capture) 新手指南相关的知识,希望对你有一定的参考价值。
译者简介:ASCE1885,《android 高级进阶》[1] 和 《Android 高级进阶(源码剖析篇)》[2]作者
原文链接:A beginner’s guide to CDC (Change Data Capture)[3]
引言
在 OLTP(Online Transaction Processing,在线事务处理) 系统中,多个事务会同时访问和修改数据,数据库会从一个一致性状态过渡到新的一致性状态。OLTP 系统总是会显示数据的最新状态,从而有助于开发要求近乎实时的数据一致性保证的前端应用程序。
然而,OLTP 系统并不是孤岛,它只是企业系统中的一部分,封装了对所有数据转换的功能。当将 OLTP 系统与缓存、数据仓库或者内存数据网格集成时,我们需要通过 ETL[4] 处理流程来收集在给定时间段内 OLTP 系统数据变更的事件列表。
本文我们将介绍用于捕获事件并将其发送给其他数据处理系统的各种方法。
触发器
事件捕获最常用的技术是使用数据库或应用程序级别的触发器。这种技术仍然应用广泛的原因是比较简单而且大家都比较熟悉。
审计日志(Audit Log)是一个独立的组件,用来记录数据库中每一行数据的插入,更新或者删除操作。
数据库触发器
所有的关系型数据库都支持触发器,虽然在语法和功能上略有不同。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 通常作为大型企业系统各个模块之间信息交换的管道。
总结
如果你使用的是 OLTP 应用程序,那么当需要集成当前企业系统中的其他模块时,CDC 就派上用场了。有些人可能会说使用 Event Sourcing 更好,甚至可以完全替换 OLTP 系统,因为它可以预先记录每个事件,并在之后派生出最新的快照。
虽然 Event Sourcing 功能强大,但很多应用程序可以从 OLTP 数据模型中获益,因为事件在持久化之前经过验证,这意味着数据库并发控制机制可以消除异常事件。
否则,通过其 Bigtable[12] 数据存储倡导使用 MapReduce 进行大数据处理的 Google ,就不会投入那么多精力来构建像 Spanner[13] 这样的全球的分布式且兼容 ACID 数据库的系统,它 被设计用于构建关键任务的在线事务处理(OLTP)应用程序。
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/
以上是关于CDC (Change Data Capture) 新手指南的主要内容,如果未能解决你的问题,请参考以下文章
必须声明标识符“DBMS_CDC_PUBLISH.CREATE_CHANGE_SET”
使用 Azure EventHubs Capture 生成的 Azure Data Lake Gen1 中的 Databricks 读取 avro 数据失败
LoadRunner:把capture level设置成socket level data,录制完后发现脚本记录是空白的。为啥?