基本概念
只读实例
云数据库 MongoDB 支持基于当前实例的集群架构与存储引擎,在源实例可用区或其他可用区创建一个或多个全新的只读实例,将当前实例的数据自动同步至只读实例,并授予只读实例只读不写的权限,便于把当前实例的读请求分担在只读实例,提升读写性能,增加应用的吞吐量。
灾备实例
云数据库 MongoDB 支持基于当前实例的集群架构与存储引擎,跨地域创建一个或多个全新的灾备实例,将当前实例的数据自动同步至灾备实例,并授予灾备实例只读不写的权限。当前实例所在地域因任一可用区电力、网络等不可抗因素失去通信时,可直接提升灾备实例为主实例,跨地域容灾,快速支撑业务需求,帮助用户以较低的成本提升业务连续服务的能力,保障数据的可靠性。
只读实例与灾备实例区别点
只读实例与灾备实例均是基于源实例的集群架构、存储引擎重新构建一个全新的实例,具体的差异信息,请参见下表。
区别点 | 解释 | 只读实例 | 灾备实例 |
架构类型 | 只读、灾备实例集群的系统架构,支持副本集与分片集群,单节点不支持。 | 与源实例保持一致 | 与源实例保持一致 |
跨地域 | 只读、灾备实例基于源实例是否可以在其他地域构建。 | 不支持 | 支持 |
跨可用区 | 只读、灾备实例基于源实例是否可以在本地域其他可用区构建。 | 支持 | 支持 |
数据库版本 | 兼容 Mongo 的数据库版本,包括:6.0、5.0、4.4、4.2、4.0、3.6、3.2,3.2版本已停止售卖。 | 与源实例保持一致,不能升级。 | 与源实例保持一致,不能升级。 |
存储引擎 | 默认的存储引擎为 WiredTiger。 | 与源实例保持一致 | 与源实例保持一致 |
实例规格 | 为保证只读、灾备实例的服务承载能力,对 CPU、内存、磁盘容量规格的要求。 | 不能低于源实例 | 不能低于源实例 |
数据写入 | 写入数据、创建或删除数据库。 | 不支持 | 不支持 |
备份回档 | 备份数据及恢复备份数据 | 不支持 | 不支持 |
账号管理 | 创建或删除数据库访问账号 | 不支持 | 不支持 |
手动断开与源实例的关联 | 在控制台可手动断开只读或灾备实例与源实例的关联。 | 不支持,只有销毁原实例后,只读实例与源实例的关联将自动解除。只读实例提升普通实例,可以正常读写。 | 支持,在控制台可将灾备实例转正,灾备实例即转为普通实例,可以正常读写,快速支撑业务需求。 |
提升可用区 | 只读、灾备实例原单可用区是否可提升为多可用区部署。 | 支持 | 支持 |
实现原理
只读与灾备可以理解为一个数据同步服务,同步服务将源实例的数据及其增量数据(库、表、索引、文档等)持续同步至目标端的只读实例或灾备实例,并将目标端的访问权限限定为只读,达到缓解源集群压力的目的。
创建只读灾备实例之后,即发起全量数据同步,并记录数据同步的操作日志 Oplog,待全量数据同步完成,通过回放 Oplog(操作日志),针对变化的或新增的数据持续进行增量同步。大致的原理与副本集内主从同步类似。整个过程分为两个阶段:
全量阶段,也就是全量数据的同步。在开始之前会记录下当前源集群的最新 Oplog(操作日志)时间戳。开始之后会并发读取源集群所有库表的元信息、索引及数据,并发地插入到目标端的同名库表中。全量同步的持续时间与源集群的数据量大小成正比。
增量阶段,在全量阶段之后运行,会根据全量阶段开始时记录的 Oplog(操作日志)时间戳拉取源集群的 Oplog,然后在目标端进行回放。
![](https://qcloudimg.tencent-cloud.cn/image/document/a72b37ddc51ee8f247e4adfd387c8744.png)
时延说明
由于数据同步有延迟,只读实例数据同步的实时性可能无法保证,如果业务需要读写分离并且对实时要求比较高,建议业务读取主实例的从节点,具体请参见 连接 MongoDB 实例。登录 控制台,在源实例的只读灾备页面,可及时了解主实例到目标实例的同步状态及其时延。
![](https://qcloudimg.tencent-cloud.cn/image/document/1f4b75dae08fe6b2d898c15b2cc24bd1.png)
性能优化
类似 MongoDB 副本集 Oplog 的并发回放,只读灾备数据同步服务拉取 Oplog 至缓存,并发解析 Oplog,按表名进行 Hash,保证 Oplog 表级别有序,再线性把每段 Oplog 按文档 ID 进行 Hash,将同一文档的 Oplog 分配到同一个线程去处理,并行回访线程至目标端,保障增量数据同步的性能,同步延迟达秒级。
数据安全
在增量同步过程中,同步服务会将当前已同步的最新 Oplog 时间戳持久化,并且同步服务的回放过程是幂等的。因此,同步服务的增量阶段时支持断点续传,即使源集群或者目标集群出现故障,也能保证同步服务不会出现数据安全问题。
针对增量同步数据过程中,目标集群因磁盘故障、网络等原因引起主备切换,可能引起丢失数据的现象。云数据库 MongoDB 增加了一种记录同步进度的 Oplog。即数据同步服务定期向目标集群的 Oplog 流水中插入同步进度的记录,新主节点生效后,将在自身 Oplog 流水中找到最新的记录,重新同步数据,防止数据丢失。
同步稳定性
每个只读、灾备实例都有一个单独的数据同步服务支撑,每个数据同步服务都使用分布式锁和租约机制来保证服务的唯一性、可用性,并实时监控同步任务,定时调优,保证了数据同步的稳定可靠。
影响与限制
对源集群的影响
只读、灾备数据同步服务对源集群的影响仅限于从节点,会使用源集群的一个从节点(优先 hidden)来拉取数据:
全量阶段会使用 getMore 请求不断拉取数据。
增量阶段会使用 getMore 请求不断拉取 Oplog。
全量阶段与增量阶段,同步服务会在从节点上建立一个顺序读取的 Cursor,用于标记读取进度,对从节点的影响非常小。
使用限制
只读、灾备实例,隶属于源实例,无法单独存在。
只读实例以及灾备实例在创建之后被限制为不可写入。
当源实例销毁后,系统将自动断开与源实例的同步服务,只读实例将升级为普通实例,可正常读写。
数据库版本:分片集群的只读、灾备,只支持4.0、4.2、4.4版本;副本集架构 3.2、3.6、4.0、4.2、4.4版本均支持。如当前实例存在只读、灾备实例,则不允许升级当前实例的数据库版本。只读、灾备实例也不能升级版本。
数量限制:一个实例最大支持创建3个只读、3个灾备实例。
集群架构与存储引擎:只读、灾备实例与源实例的集群架构与存储引擎固定保持一致,无法修改。
账号管理:创建只读、灾备实例时,会自动同步源实例的账户信息。只读、灾备实例不支持创建或删除账户信息。创建只读、灾备实例之后,如果源实例访问账户及密码有更改,此时,并不会自动同步源实例的账户。您需要在连接访问时手动修改只读、灾备实例的账户信息,否则提示错误,无法连接。
由于网络的隔离性,金融专区与普通地灾备域之间不能互相创建灾备实例。
备份回档:只读、灾备实例均不支持备份和回档数据功能。
数据迁移:只读、灾备实例均不支持将其他实例数据迁移至只读、灾备实例。
同步限制
副本集的只读、灾备同步是通过解析 Oplog 实现的,所有 DDL 操作都会支持。
分片集群的只读、灾备同步是通过解析 Change Stream 实现的。Change Stream 在 Oplog 之上包裹一层应用,对外提供一个 API 接口,将数据进行实时推送,推送的数据类型除了基本的 CRUD 操作,目前还支持与库表结构索引等相关的 DDL 操作,包括:createIndexes、drop、rename、dropDatabase、create、createIndexes、dropIndexes、collMod、convertToCapped 等类型。