背景

在我们的整个架构体系中,我们大量的使用了 CDC,很多同学开始不太清楚,不知道 CDC 是什么,以为 CDC 是一个具体的软件,其实 CDC 是一个统称,就像 Office 代表的是一组办公软件,而 CDC 也是各种不同名字具有 CDC 功能的软件的统称,所以简单介绍下关于 CDC 的内容。文中 CDC 主要是和数据库、MySQL 相关的内容,并不具有广泛的意义。

本期目标

  • 了解什么是 CDC
  • 各种 CDC
  • CDC 的一些使用场景和一些想象
  • 如何自己实现一个 CDC 软件

什么是 CDC

CDC 全称 Change Data Capture,下面是来自维基百科的一段说明:

In databases, change data capture (CDC) is a set of software design patterns used to determine (and track) the data that has changed so that action can be taken using the changed data. Also, Change data capture (CDC) is an approach to data integration that is based on the identification, capture and delivery of the changes made to enterprise data sources. CDC solutions occur most often in data-warehouse environments since capturing and preserving the state of data across time is one of the core functions of a data warehouse, but CDC can be utilized in any database or data repository system.

简单来说 CDC 就是记录数据变化的一个工具软件,它可以捕捉每一次的数据变化,我们使用的是阿里开源的 canal,看下下面的这个图(来自 canal 介绍),基本就理解 CDC 的工作原理了,更详细的可以点开 canal 链接,有更多的介绍。 canal 工作原理

各种 CDC

因为 CDC 软件繁多,我没有一一安装去实验,所以列举几个,供大家参考,更多的大家可以看这里

名称&站点 描述
canal 阿里巴巴出品,很多中文文档,比较成熟 github star > 4k fork > 1700 多,Java 语言开发,有配套工具链。
databus star>1800,fork>400, 大厂出品,还是值得信赖的,Java 语言实现
lapidus Nodejs 实现的 star 76 fork 10
mypipe star>300 fork>50 Scala 实现的
go-mysql-elasticsearch star > 1k fork > 250 Golang
php-mysql-replication PHP 的,哈哈哈
python-mysql-replication Python 的

CDC 使用场景和 CDC 在我们架构中的应用

CDC 的应用场景就像它的名字一样,捕捉那些变化的数据,下面简单说几个具体的例子:

  • 根据我们的业务,用户报名后会有一些列的数据变化,录取、待面试、拒绝等。
  • 电商中的订单状态变
  • 数据库数据变更更新检索
  • ……

上面列觉的这几个例子,都会涉及到数据变更时,触发一些列的业务操作,直接通过应用程序代码进行异步的事件分发也是可以实现的,代码也可以做到不嵌入业务,但是多业务在共享数据的时候,也会存在一些问题,每个业务方都要去实现监听数据变化的代码。而采用 CDC 进行数据分发,是比较好的实现方式,通过 CDC 统一分发,业务方只关心业务逻辑,不用去写大量代码来做异步实现数据监听接收,下面是我理解的一个基于 CDC 和 Queue 来做的数据分发和共享平台的架构。

CDC Queue Dispatcher Data

通过上面的这套体系,MySQL 通过 CDC 把表变化的数据分发出来,存入相应的共享队列,每个想要使用该数据的的业务方,都可以通过去订阅这份数据来完成自己的业务功能,在代码上基本是完全分离了数据采集的工作。在这里需要注意的是数据是单向流向业务方的,所以在数据使用上一定要切合实际的业务功能

目前我们的架构中,只是部分使用了这样的功能,且比较零散,没有从全局上面统筹数据分发,我们应用最多的是数据库数据变化时,更新检索。

如何实现一个 CDC?

MySQL 的一些 CDC 软件就是实现了 MySQL-replication 协议的 Slave 库,只是本身并不存储数据,做一些数据解析和分发功能。文中列举了各种语言的实现,并且都有链接地址,大家可以自行部署去玩了。

PS: 本来要自己实现一下发现有 PHP 版本了,😂,大家可以自己查看上面列出来的 PHP 的实现,一个简单的示例代码