本文介绍MongoDB 5.0的主要新特性。

背景信息

MongoDB 5.0标志着一个新的发布周期的到来,以更快地交付新特性给用户。例如:版本化API与在线重新分片相结合,使用户不必担心未来的数据库升级以及业务变化问题;本地原生时间序列数据平台使MongoDB能够支持更广泛的工作负载和业务场景;新的MongoDB Shell能够提升用户体验等均为MongoDB 5.0的功能。

原生时间序列平台

MongoDB 5.0通过原生支持整个时间序列数据的生命周期(从采集、存储、查询、实时分析和可视化,到在线归档或随着数据老化自动失效),使构建和运行时间序列应用程序的速度更快、成本更低。随着MongoDB 5.0的发布,MongoDB扩展了通用的应用数据平台,使开发能够更容易地处理时间序列数据,进一步扩展其在物联网、金融分析、物流等方面的应用场景。

MongoDB的时间序列集合以高度优化和压缩的格式自动存储时间序列数据,减少了存储大小和I/O,以实现更好的性能和更大的规模。同时也缩短了开发周期,使您能够快速建立一个针对时间序列应用的性能和分析需求而调优的模型。

创建时间序列数据集合的命令示例:
db.createCollection("collection_name",{ timeseries: { timeField: "timestamp" } } )

MongoDB可以无缝地调整采集频率,并根据动态生成的时间分区自动处理无序的测量值。最新发布的MongoDB Connector for Apache Kafka实现了在本地支持时间序列,您可以直接从Kafka主题消息中自动创建时间序列集合,使您在收集数据的同时根据需要对数据进行处理和聚合,然后写入到MongoDB的时间序列集合。

时间序列集合自动创建一个按时间排序的数据聚集索引,降低查询数据的延迟。MongoDB查询API还扩展了窗口函数,您可以运行分析性查询(例如移动平均数和累积总和)。在关系型数据库系统中,这些通常被称为SQL分析函数,并支持以行为单位定义的窗口(即三行移动平均线)。MongoDB更进一步,还增加了指数移动平均线、导数和积分等强大的时间序列函数,支持您以时间为单位定义窗口(例如15分钟的移动平均线)。窗口函数可用于查询MongoDB的时间序列和常规集合,为多种应用类型提供了新的分析方式。另外,MongoDB 5.0也提供了新的时间运算符,包括$dateAdd$dateSubstract$dateDiff$dateTrunc,使您可以通过自定义的时间窗口对数据进行汇总和查询。

您可以将MongoDB的时间序列数据与企业的其他数据相结合。时间序列集合可以与同一个数据库中的常规MongoDB集合放在一起,您不必选择一个专门的时间序列数据库(它不能为任何其他类型的应用提供服务),也不需要复杂的集成来混合时间序列和其他数据。MongoDB通过提供一个统一的平台,让您建立高性能和高效的时间序列应用的同时,也为其他用例或工作负载提供支持,从而消除了整合和运行多个不同数据库的成本和复杂性。

在线数据重新分片

数据库版本 特点 实现方法
MongoDB 5.0以前 重新分片过程复杂且需要手动分片。
  • 方法一:先dump整个集合,然后用新的分片键把数据库重新加载到一个新的集合中。

    由于这是一个需要离线处理的过程,因此您的应用程序在重新加载完成之前需要中断停服较长时间。例如:在一个三分片的集群上dump和重新加载一个10 TB以上的集合可能需要几天时间。

  • 方法二:新建一个分片集群并重新设定集合的分片键,然后通过定制迁移方式,将旧分片集群中需要重新分片的集合,按新的分片键写入到新的分片集群中。
    • 该过程中需要您自行处理查询路由和迁移逻辑、不断检查迁移进度,以确保所有数据迁移成功。
    • 定制迁移是高度复杂的、劳动密集型的、有风险的任务,而且耗时很长。例如:某个MongoDB用户花了三个月才完成100亿个document的迁移。
MongoDB 5.0开始
  • 运行reshardCollection命令即可启动重新分片。
  • 重新分片的过程高效。

    并不是简单地重新平衡数据,而是在后台将所有当前集合的数据复制并重新写入新集合,同时与应用程序新的写入保持同步。

  • 重新分片是完全自动化的。

    将重新分片花费的时间从几周或几个月压缩到几分钟或几小时,避免了冗长繁杂的手动数据迁移。

  • 通过使用在线重新分片,可以方便地在开发或测试环境中评估不同分片键的效果,也可以在您需要时修改分片键。
您可以在业务运行(数据不断增长)的情况下,按需改变集合的分片键(Shard key),而不需要数据库停机或在数据集合中进行复杂的迁移。您只需要在MongoDB Shell中运行reshardCollection命令,选择您需要重新分片的数据库和集合,指定新的分片键即可。
reshardCollection: "<database>.<collection>", key: <shardkey>
说明
  • <database>:需要重新分片的数据库名称。
  • <collection>:需要重新分片的集合名称。
  • <shardkey>:分片键的名称。
  • 当您调用reshardCollection命令时,MongoDB会克隆现有集合,然后将现有集合中所有oplog应用到新集合中,当所有oplog被使用后,MongoDB会自动切换到新集合,并在后台删除旧集合。

版本化API

  • 应用程序兼容性

    MongoDB 5.0开始,版本化API定义了应用程序最常用的一组命令和参数(无论是数据库在年度重大发布还是季度快速发布期间,这些命令均不会改变)。通过将应用程序生命周期和数据库生命周期解耦,您可以将驱动程序固定在MongoDB API的特定版本上,即使数据库发生升级和改进,您的应用程序将可以继续运行数年而不需要修改代码。

  • 灵活地添加新功能和改进内容

    版本化API支持MongoDB灵活地在每个版本中为数据库添加新的功能和改进内容(以新版本兼容早期版本的方式)。当您需要改变API时,可以增加新版本的API,并与现有版本化的API在同一台服务器上同时运行。随着MongoDB版本发布的加速,版本化API能够使您更快、更轻松地使用到MongoDB最新版本的功能特性。

Write Concern默认Majority级别

从MongoDB 5.0开始,Write Concern默认级别为majority,仅当写入操作被应用到Primary节点(主节点)且被持久化到大多数副本节点的日志中的时候,才会提交并返回成功,“开箱即用”地提供了更强的数据可靠性保障。
说明 Write Concern是完全可调的,您可以自定义配置Write Concern,以平衡应用程序对数据库性能和数据持久性的要求。

连接管理优化

默认情况下,一个客户端连接对应后端MongoDB服务器上的一个线程(net.serviceExecutor配置为synchronous)。创建、切换和销毁线程都是消耗较大的操作,当连接数过多时,线程会占用MongoDB服务器较多的资源。

连接数较多或创建连接失控的情况称为“连接风暴”,产生该情况的原因可能是多方面的,且经常是在服务已经受到影响的情况下发生。

针对这些情况,MongoDB 5.0采取了以下措施:
  • 限制在任何时候驱动程序尝试创建的连接数量,以简单有效的方式防止数据库服务器过载。
  • 减少驱动程序监控连接池时的检查频率,给无响应或过载的服务器节点一个缓冲和恢复的机会。
  • 驱动程序将工作负载导向具有最健康连接池的更快的服务器,而不是从可用的服务器中随机选择。

以上措施,加上之前版本在mongos查询路由层的改进,进一步提升了MongoDB承受高并发负载的能力。

长时间运行的快照查询

长时间运行的快照查询(Long-Running Snapshot Queries)增加了应用程序的通用性和弹性。您可以通过该功能运行默认时间为5分钟的查询(或将其调整为自定义持续时间),同时保持与实时事务性数据库一致的快照隔离,也可以在Secondary节点(从节点)上进行快照查询,从而在单个集群中运行不同的工作负载,并将其扩展到不同的分片上。

MongoDB通过底层存储引擎中一个名为Durable history的项目实现了长期运行的快照查询,该项目早在MongoDB 4.4中就已实现。Durable history将存储自查询开始以来所有变化的字段值的快照。通过使用Durable history,查询可以保持快照隔离,即使在数据发生变化的情况下,Durable history也有助于降低存储引擎的缓存压力,使得业务可以在高写入负载的场景下实现更高的查询吞吐量。

新版MongoDB Shell

为了提供更好的用户体验,MongoDB 5.0从头开始重新设计了MongoDB Shell(mongosh),以提供一个更现代化的命令行体验,以及增强可用性的功能和强大的脚本环境。新版MongoDB Shell已经成为MongoDB平台的默认Shell。新版MongoDB Shell引入了语法高亮、智能自动完成、上下文帮助和有用的错误信息,为您创造一个直观、互动的体验。

  • 增强的用户体验
    • 更容易编写查询和聚合,更容易阅读结果。

      新版MongoDB Shell支持语法高亮功能,方便您区分字段、值和数据类型,以避免语法错误。如果仍然发生错误,新版MongoDB Shell也可以指出问题点并告诉您解决方法。

    • 更快输入查询和命令。

      新版MongoDB Shell支持智能自动完成功能,即新版MongoDB Shell可以根据您连接的MongoDB的版本,为方法、命令、MQL表达式等给出自动完成选项的提示。

      示例:当您不记得某个命令的语法时,您可以直接从MongoDB Shell中快速查找该命令的语法。查找命令的语法
  • 高级脚本环境

    新版MongoDB Shell的脚本环境建立在Node.js REPL(交互式解释器)之上,您在脚本中可以使用所有的Node.js APINPM的任何模块。您也可以从文件系统中加载和运行脚本(和旧版MongoDB Shell一样,您可以继续使用LoadEval执行脚本)。

  • 扩展性和插件

    新版MongoDB Shell具有易扩展性,使您能够使用MongoDB的所有功能以提高生产力。

    在新版MongoDB Shell中,允许安装Snippets插件。Snippets可以自动加载至MongoDB Shell中,且Snippets可以使用所有的Node.js APINPM包。MongoDB也维护了一个Snippets仓库,提供了一些有趣的功能(例如分析指定集合模式的插件),您也可以自由地配置MongoDB Shell使用您选择的插件。
    说明 插件当前仅为MongoDB Shell的一个实验性功能。

PyMongoArrow与数据科学

随着新的PyMongoArrow API的发布,您可以在MongoDB上使用Python运行复杂的分析和机器学习。PyMongoArrow可以快速将简单的MongoDB查询结果转换为流行的数据格式(例如Pandas数据框架和NumPy数组),帮助您简化数据科学工作流程。

Schema验证改进

Schema验证(模式验证)是对MongoDB进行数据应用管理控制的一种方式。MongoDB 5.0中,模式验证变得更加简单和友好,当操作验证失败时都会产生描述性的错误信息,帮助您了解不符合集合验证器的验证规则的文档及原因,以快速识别和纠正影响验证规则的错误代码。

可恢复的索引创建任务

MongoDB 5.0支持将正在进行中的索引创建任务在节点重新启动后自动会恢复至原来的位置,减少计划中维护动作对业务的影响。例如:重新启动或升级数据库节点时,您不需要担心当前正在进行的大集合索引创建任务失效。

版本发布调整

由于MongoDB支持很多版本和平台,每个发布版本都需在20多个MongoDB支持的平台上进行验证,验证工作量大,降低了MongoDB新功能的交付速度,所以从MongoDB 5.0开始,MongoDB发布的版本将分为Major Release(大版本)和Rapid Releases(快速发布版本),其中Rapid Releases作为开发版本提供下载和测试体验,但不建议用在生产环境。

更多特性

关于MongoDB 5.0更多特性,请参见MongoDB 5.0