容灾与备份:如何设计逃生通道保证业务连续性

423 阅读3分钟

通常异构数据库间的数据复制有三种可选方式:

  1. 数据文件
  2. ETL(Extract-Transform-Load)
  3. CDC(Change Data Capture)

数据文件是指,在数据库之间通过文件导入导出的方式同步数据。这是一种针对全量数据的批量操作,如果要实现增量加载,则需要在数据库表的结构上做特殊设计。显然,数据文件的方式速度比较慢,而且对表结构设计有侵入性,所以不是最优选择。

ETL 是指包含了抽取(Extract)、转换(Transform)和加载(Load)三个阶段的数据加工过程,可以直连两端的数据库,也可以配合数据文件一起用,同样必须依赖表结构的特殊设计才能实现增量抽取,而且在两个数据库之间的耦合更加紧密。

CDC 其实是一个更合适的选择。CDC 的功能可以直接按照字面意思理解,就是用来捕获变更数据的组件,它的工作原理是通过读取上游的 redo log 来生成 SQL 语句发送给下游。它能够捕捉所有 DML 的变化,比如 delete 和 update,而且可以配合 redo log 的设置记录前值和后值。

CDC 工具的提供者通常是源端的数据库厂商,传统数据库中知名度较高的有 Oracle 的 OGG(Gold Gate)和 DB2 的 Inforsphere CDC。

逃生方案

image.png

这个异构高可用方案就由分布式数据库和单体数据库共同组成,分布式数据库向单体数据库异步复制数据。使用异步复制的原因是不让单体数据库的性能拖后腿。这样,当分布式数据库出现问题时,应用就可以切换到原来的单体数据库,继续提供服务。

整套方案要解决两个基本问题,分别是日志格式的适配和性能的适配。如果逃生库与分布式数据库本身兼容,则日志格式问题自然消除,这大多限于 MySQL 和 PostgreSQL 等开源数据库。如果日志格式不兼容,就要借助厂商工具或者用户定制开发来实现。传统企业由于大量使用商业数据库,这个问题较为突出。性能适配是因为分布式数据库的性能远高于基于 x86 的单体数据库,需要通过分布式消息队列来适配,缓存日志消息。

因为分布式数据库的日志是每个分片独立记录,所以当发生分布式事务时,逃生库会出现数据错误。如果有严格的事务一致性要求,则需要考虑多分片之间变更消息的顺序问题。CockroachDB 提供一种特殊的时间戳消息,用于标识节点上的时间戳关闭,这样在复制过程中也能保证多分片事务的一致性。


此文章为6月Day24学习笔记,内容来源于极客时间《分布式数据库30讲》