云上灾备和多活架构

云数据库MongoDB版推出MongoDB实例间的同步产品:云上灾备和多活,助力企业快速复制阿里巴巴异地多活架构。

说明

云上灾备功能即将下线,未来计划通过数据传输服务DTS(Data Transmission Service)来支持灾备、双活或多活,满足多数据中心和容灾等业务需求。

架构

  • Oplog(operations log):MongoDB的日志,所有对数据库的修改都会保存在Oplog中。

  • ReplicaA、ReplicaB:ReplicaA、ReplicaB分别是独立的MongoDB三节点副本集实例。

    为保证双活,ReplicaA、ReplicaB都需要可写入。由用户端保证同一数据不会在ReplicaA、ReplicaB同时写入。

  • Oplog同步:通过BLS互相同步Oplog数据后,再在目的端重放数据。

MongoDB云上灾备和多活中,主要有以下三大组件:

  • BLS Manager:中心控制模块,负责Collector、Receiver的调度和监控等任务。

  • BLS Collector:数据采集模块,负责从源MongoDB数据库拉取Oplog数据,然后发送到Kafka通道。

  • BLS Receiver:数据回放模块,负责从Kafka通道中获取数据,然后写入目的端MongoDB数据库。

下图是MongoDB云上灾备和多活内部系统的整体架构图,其中Tunnelkafka实现。

全量加增量

同步模型采用全量+增量的方式,即在创建实例时对源数据库进行全量数据同步,后续的修改通过增量数据来同步。

双活以及多活模型

由于数据复制是异步方式,所以对于双活或者多活模式,由用户端保证不会对同一个唯一键同时进行修改。

同时修改同一个唯一键可能导致数据错乱,目前的冲突解决策略为覆盖(后面修改的数据覆盖前面的数据)或者忽略。

高效性保证

以下三条策略实现实例间数据同步的高效性:

  • 从源数据库并行拉取数据,并解决冲突依赖。

  • 将源数据库数据并行发往Kafka通道。

  • 将数据并行写入目的端数据库,同时解决依赖问题。

因地域和网络类型不同,实例间的数据同步延迟也不同。MongoDB云上灾备和多活产品理论TPS能够接近20万,即每秒传输20万条Oplog。为保证数据批量传输的高效性,数据发送过程中有缓存机制,少量数据的同步延迟可能超过5秒。

环形复制

为防止环形复制(数据从源复制到目的,又从目的复制到源),我们在Oplog日志中加入gid来解决环形复制问题。

可靠性传输

支持断点续传,实例重启时数据同步不受影响。

高可用

链路同步具有高可用性,如果同步进程出错,备用进程启动接管服务。

限制说明

  • 目前仅副本集实例支持云上灾备功能,单节点实例和分片集群实例暂不支持。

  • 源实例数据库版本须是3.2版本或3.4版本,暂不支持4.0版本。

  • 源实例存储引擎必须是WiredTiger。

  • 暂不支持在两个已有MongoDB实例之间直接搭通道同步数据。

  • 数据同步时,源实例会重启一次,重启过程中将gid加入Oplog中。如果源实例过大,重启时间将会达到分钟级。

  • 实例同步后,不支持DDL同步。如果在源实例上进行了DDL操作,目的实例将无法同步源实例的DDL操作。

  • 当前只支持双活功能,即两个MongoDB实例之间同步数据。

支持云上灾备产品的区域

以下区域中的实例支持实例间的数据同步,可以跨越城市或者国家,例如上海和新加坡。

  • 中国内地

    地域名称

    所在城市

    Region ID

    华北 1

    青岛

    cn-qingdao

    华北 2

    北京

    cn-beijing

    华东 1

    杭州

    cn-hangzhou

    华东 2

    上海

    cn-shanghai

    华南 1

    深圳

    cn-shenzhen

  • 其他国家和地区

    地域名称

    所在城市

    Region ID

    中国(香港)

    中国香港

    cn-hongkong

    美国西部

    硅谷

    us-west-1

    美国东部

    弗吉尼亚

    us-east-1