Amazon声称从MongoDB迁移到DocumentDB "非常简单,只需要将数据库端点切换为新的 Amazon DocumentDB 集群"。但确实如此吗?
我们通过对 DocumentDB 的 API 仿真运行 6 个 MongoDB 测试套件(总计 1,481 次测试)来定期评估 DocumentDB 声称的兼容性。这些套件用于测试 MongoDB 在每个数据库版本上的一致性和正确性,它完美体现了 MongoDB API 的全部功能。
这些测试包括:
● jsCore :对MongoDB CRUD 操作和数据库命令进行大约 1,000 次测试
●聚合 :对MongoDB 聚合管道进行 300 多次测试
● jsCore_decimal :使用十进制数据类型评估应用程序的行为是否正确无误,以获取金融和科学工作负载中常见的高精度小数数据
● change_streams :测试MongoDB变更流,开发人员会利用用该变更流来构建事件驱动的数据管道,对数据库更改实时做出反应
● jsCore_txns :评估MongoDB中多文档 ACID 事务的行为是否正确无误
● jsonSchema :测试 MongoDB 提供的数据管理控制
在测试时(2022 年 1 月),DocumentDB 仿真了 MongoDB4.0 协议的子集。与 DocumentDB 不同,MongoDB Atlas (完全托管的 MongoDB 服务)支持最新的 MongoDB 6.0 版本。
测试结果
通过将 DocumentDB API 仿真与 MongoDB 进行对比,前者未能通过 64% 以上的正确性测试。对于开发人员来说,这意味着:
-
如果要将依赖此功能的任何现有 MongoDB 应用程序迁移到 DocumentDB,都需要对其进行重新设计
-
任何针对 DocumentDB API 编写的新应用程序仅支持 MongoDB 功能的子集
-
任何针对 DocumentDB 编写的应用程序都将锁定到 AWS。
*DocumentDB API 仿真不支持的功能
就功能而言,DocumentDB 最接近于 2015 年发布的 MongoDB 3.0/3.2。因此,开发人员需要:
-
返回应用程序层重新实现所需的数据库功能,减慢了应用程序开发的速度
-
将多个数据副本转移到相似 AWS 技术中,增加了开发和运营成本以及平台的复杂性
主要差距包括:
◆ DocumentDB 仅支持 MongoDB 查询语言的子集。
◆ 支持的 MongoDB 4.0 聚合管道阶段和查询语言运算符不到 50%。缺少的功能包括:
● 没有图形遍历,也没有数据的分面或分桶。
● 仅提供有限数量的算术、数组和集合运算符。
● 无按需物化视图
● 也无法将聚合表达式与查询语言一起使用。
● 聚合管道中不支持类型转换。类型转换允许您在数据库中本地运行复杂的数据转换,从而消除多个昂贵、缓慢且脆弱的 ETL 流程。
● 最新 MongoDB 版本中添加的聚合管道阶段和运算符,包括正则表达式、时间戳、三角函数、合并、自定义聚合表达式、联合等
◆ 没有用于控制数据质量的模式管理
◆ 尽管声称支持变更流,但由于存在以下缺点,DocumentDB 仍未能通过 80% 以上的 MongoDB 变更流正确性测试:
● 不支持针对非主节点启用变更流。由于不提供分片支持,应用程序的所有写入也必须通过单个 DocumentDB 主节点完成,因此添加变更流将导致潜在的严重争用,从而影响应用程序吞吐量和延迟性。
● 不支持 DDL 事件,包括 drop、rename 和 dropDatabase,妨害开发人员响应集合和数据库级的更改
● 不支持 r e p l a c e R o o t 、 replaceRoot、 replaceRoot、replaceWith、 r e d a c t 、 redact、 redact、set 或 $unset 聚合管道,过滤或修改变更流输出时受限
● Resume_after 不符合 MongoDB API 的要求,用户在 MongoDB 与 DocumentDB 之间转换应用程序时受限
● 无法按用户为变更流设置细粒度的权限。如果在数据库上启用变更流,则任何具有读取权限的用户都可以看到数据库上的所有更改。
● 变更事件默认仅存储 3 小时,然后将被删除。MongoDB 可以在 oplog 滚动更新前交付变更事件,没有硬性限制。
● 变更流在存储和交付变更时将产生额外费用。MongoDB Atlas 中的变更流不会带来额外成本。
◆ 无按需物化视图
◆ 有限的光标选项:不支持排序规则或可尾光标
◆ 没有因果一致性保证,由于删除了跨副本执行单调读取的功能,数据质量有所下降
◆ DocumentDB 未实现 MongoDB API 的可调整一致性选项。即使在需要保证高吞吐量和低持久性的场景下,如流式物联网传感器数据、用户跟踪或大型社交媒体平台,客户端也必须等待所有写入到达大多数节点
与 MongoDB 中的事务相比,DocumentDB 在 4.0 更新中新增的多文档 ACID 事务支持有局限性,未能通过一半以上的标准测试套件测试项:
◆ DocumentDB 事务仅提供同等 MongoDB Atlas 配置的约 65% 的吞吐量,且延迟时间高出近 20%。
◆ DocumentDB 事务可能是不确定和"不明确"的。
◆ 受超时或节点故障影响的事务在返回错误时,无法告知用户事务是成功还是失败,这可能会违反数据完整性和 ACID 保证。为了避免这种"不明确",亚马逊的文档建议用户重写代码,让所有更新都具有幂等性,这会浪费宝贵的开发资源。
◆ 事务不能处理超过 32MB 的数据。
◆ 由于 DocumentDB 不支持分片,因此事务的运行范围仅限于单个主节点上的集合,限制了可扩展性。
◆ DocumentDB 不支持可重试写入或提交,这意味着开发人员必须自己开发复杂的错误处理代码。
MongoDB Atlas:始终提供完整的功能
相比之下,在每个新的数据库版本"正式发布"后,Atlas 就会立即更新,这意味着开发人员不必等待数月或数年即可访问最新的平台增强功能。自 2021 年 6 月发布 MongoDB 5.0 以来,Atlas 目前的更新频率更高 ,每个季度都会发布新的 GA 版本,远远将 DocumentDB 甩在了身后。MongoDB 5.0 是第一个提供稳定 API 的版本,它允许用户将其应用程序绑定到特定版本的 MongoDB API。这让用户有信心认为,即使相关数据库进行了升级,其代码也将长时间运行,不会中断。稳定 API 能够为您提供一定程度的投资保护和 API 稳定性,这是大多数其他数据库(包括 DocumentDB)根本无法实现的。
该服务由来自 MongoDB 和合作伙伴生态系统的数千名服务工程师、顾问和解决方案架构师提供支持,他们优质的服务体现了 MongoDB 的集体智慧,而这些智慧得益于 MongoDB 在过去十年中对数以万计客户的全力支持。
免责声明
我们会自行决定产品的任何特性或功能的开发、发布和时间安排。这些信息仅用于概述我们产品的总体发展方向,不应作为制定购买决策的依据,也并非是交付任何材料、代码或功能的保证、承诺或法律义务。