使用 CDC 进行数据库复制
数据库复制是将数据从源数据库(MySQL、Mongo、PostgreSQL 等)复制到目标数据库的过程。这可以是单次操作,也可以是实时同步过程。
在Powerplay,我们的产品团队会不断运行各种数据查询来获取用户洞察。运行复杂的查询来构建用户仪表盘会给我们的生产数据库带来巨大的开销。因此,生产 API 的执行时间开始变长,甚至导致生产数据库崩溃了几次。正因如此,我们决定创建主生产数据库的副本,并将所有分析工作迁移到分析数据库中。
数据库复制方法
数据复制主要有三种方法。选择合适的方法取决于您的具体使用场景以及您使用的数据库类型。
- 完全加载和导出 -此方法会定期查询数据库中的所有数据,然后创建快照。之后,该快照会替换数据仓库中之前的快照。此方法适用于小型表或一次性导出。
- 增量式更新——在这种方法中,我们为每个表/集合定义一个事件。每次更新或插入行/文档时,都会触发该事件。系统会定期查询数据库以查找更改。尽管设置触发系统需要一些初始工作,但这种方法对数据库的负载较小。
- 变更数据捕获 (CDC)——它每隔几秒查询一次数据库的内部操作日志,并将变更复制到数据仓库中。这是一种更可靠的方法,对数据库性能的影响也小得多。它还有助于避免加载重复事件。对于持续更新的数据库,CDC 是最佳选择。
CDC 与 MongoDB 和 Kafka
我们选择 CDC 的原因是,我们需要将分析数据库与生产数据库实时同步,这可以通过增量更新和 CDC 方法实现。但是,增量更新方法前期投入较大,并且需要定期监控。而 CDC 则能实现无缝同步。
在了解如何使用MongoDB实现 CDC 之前,我们需要预先了解一些主题:
变革潮流 -
Change Stream是 MongoDB 3.6 版本中引入的一项 API。Change Stream 允许应用程序监听实时数据变更,而无需像追踪oplog(数据库所有修改操作的滚动记录)那样复杂且风险高。应用程序可以使用 Change Stream 订阅单个集合、数据库或整个部署的所有数据变更,并立即做出响应。
变更流仅适用于副本集。此限制是因为变更流的实现基于操作日志 (oplog),而操作日志仅在副本集上可用。
注意:变更流也适用于分片集群,但不建议这样做,因为您必须分别跟踪每个分片上的每个操作日志,这最终违背了变更流的目的。
为了将变更流数据从源数据库传递到目标数据库,我们需要一个事件流平台。Apache Kafka 正好可以胜任这一角色。
Apache Kafka -
Kafka是一个分布式事件流平台,它允许开发人员将多个系统连接起来以交换消息(数据)。它常用于 ETL 数据管道、CDC 系统等。
卡夫卡核心概念:
- 集群: 它是一组服务器的集合,这些服务器协同工作以处理消息/数据的管理。
- 消息: 以任何格式存储数据的字节数组。
- 主题: 主题是 Kafka 中存储和发布消息的类别。
- 生产者: 向 Kafka 主题写入消息。
- 消费者: 读取来自 Kafka 主题的消息。
为了在 MongoDB 和 Apache Kafka 之间建立连接,MongoDB 构建了官方框架MongoDB Kafka Connector。
MongoDB Kafka 连接器 -
借助此框架,生产者和消费者可以使用 Kafka Connect API 对 MongoDB 中的每个数据库或集合进行写入和读取更改。
连接器可以配置为源或接收器:
- 源连接器 - 此连接器充当数据源。它配置为订阅我们 MongoDB 部署中的更改,并且当该部署发生更改时,事件将发布到 Kafka 主题。
- Sink 连接器 - 它从主题中读取消息,并将文档写入 sink MongoDB 部署。
MongoDB Kafka Connector 可让您使用 CDC 和 Kafka 无缝复制 MongoDB。您可以在这里找到有关如何设置和使用它的说明。
文章来源:https://dev.to/mdfaizan7/database-replication-using-cdc-48l8

