Amazon DocumentDB 是基于 AWS 自定义的 Aurora 平台构建的,该平台历史上一直用于托管关系数据库。虽然 Aurora 的存储层是分布式的,但计算层不是,这限制了扩展选项。
DocumentDB 支持单个主节点进行写入,并在单个 Amazon 区域内最多支持 15 个副本。虽然您可以使用副本将读操作扩展到 DocumentDB(以下将讨论限制),但尚无本地功能可以扩展写入操作以超过单个主节点。新引入的全局集群仍然存在这种限制,迫使所有写入都通过单个节点进行,因此如果托管该主节点的区域不可用,数据库仍然容易受到中断的影响。恢复是一个手动过程,需要重新配置应用程序。
这阻碍了应用随着用户群体和数据量的增长而扩展的能力,或者服务于需要分布到全球受众以提供一致、低延迟体验的应用程序。相反,开发者必须在应用程序级别手动分片数据库,这增加了开发复杂性,并阻碍了根据工作负载动态扩展和缩小集群的能力。
DocumentDB 的最大数据库大小为 64TB,每实例最多支持 30,000 个并发连接。
为了满足具有大量数据集和高吞吐量需求的应用程序的需求,MongoDB 使用称为“分片”的技术在低成本、通用硬件或云基础设施上提供数据库的水平扩展。分片自动将数据分区并分布到多个称为“分片”的物理实例中。
分片允许开发者无缝地扩展数据库,因为应用程序的增长超出了单个主数据库的硬件限制,而实现这一功能不会增加应用程序的复杂性:分片是透明的,即使在跨分片提交ACID事务时也是如此。无论是有一个还是一千个分片,查询MongoDB的应用程序代码都是相同的。为了响应工作负载需求,可以实时向集群添加或移除节点,MongoDB将自动相应地重新平衡数据,无需人工干预和停机时间。实时重新分片允许数据库管理员实时更改分片策略,而无需停机。从MongoDB 7.0开始,分片键顾问命令为用户提供有助于他们优化分片键的指标。
DocumentDB仅支持单个主节点进行写操作,并且不支持分片。
MongoDB Atlas支持的数据库大小没有实际限制,最大的实例支持高达128,000个并发连接——比DocumentDB高4倍以上。与DocumentDB类似,MongoDB Atlas会随着数据集的增长自动扩展存储容量。MongoDB Atlas还提供自动扩展实例大小的能力,以响应工作负载需求,这是DocumentDB目前不支持的功能。相反,运维人员必须不断监控其数据库实例,并根据需要手动扩展。
MongoDB Atlas全球集群允许具有分布式应用程序的组织轻松地将单个完全管理的数据库地理分区,以在全世界任何地方提供低延迟的读写操作。数据可以关联并定向到指定云区域的节点,使其与本地用户保持紧密接近,并支持遵守个人数据法规,如通用数据保护条例(GDPR)。
开发者可以在AWS、Azure和Google Cloud上通过MongoDB Atlas UI的几个点击即可启动全局集群。由于DocumentDB的写操作采用单主架构,此功能对DocumentDB的用户不可用。
图1:使用MongoDB Atlas全球集群提供始终在线、全球分布、写入到任何地方的应用程序
DocumentDB通过在可用区复制6份数据副本,最多有15个副本共享相同的物理存储卷来提供冗余。当主数据库失败时,DocumentDB将自动故障转移到副本。亚马逊在其文档中声明,此过程通常需要不到120秒,“通常不到60秒”。这意味着在主数据库失败时,应用程序通常会经历60-120秒的停机时间,等待提升副本。请注意,在我们的测试中,我们观察到一些主选举需要多达4分钟——是亚马逊宣传间隔的两倍。
开发者还需要添加异常处理代码来捕获读取和写入失败,并在主选举期间适当地处理它们。
最近添加的全局集群并没有显著改变这一状况,因为只有一个主节点可以接受写入。这种限制使得用户面临主节点或其所在区域的故障造成的断电。必须手动重新配置应用程序才能从任何此类中断中恢复。
MongoDB使用副本集来维护数据的多个副本。副本集具有自我修复和故障转移与恢复完全自动化的功能,因此无需手动干预即可在发生故障时恢复系统。副本集可以跨越多个区域,在发生全面区域性中断的情况下,具有完全自动化的恢复。
如果主副本集成员出现故障,自动从二级成员中选择一个成为主成员,通常在5秒内完成,并且客户端连接自动切换到新的主成员。在选举过程中无法处理的所有读取或写入操作,一旦新的主成员建立,驱动程序可以自动重试,MongoDB服务器确保精确一次处理语义。可重试的读取和写入操作使MongoDB能够在面对短暂故障条件的同时保证可用性,而不牺牲数据一致性,同时减少开发者需要编写、测试和维护的异常处理代码量。