MongoDB 8.0发布说明
本页介绍 MongoDB 8.0中引入的更改和新功能。
MongoDB 8.0是一个主要版本,这意味着MongoDB Atlas和本地部署部署均支持该版本。 MongoDB 8.0包括MongoDB快速版本7.1 、 7.2和7.3中引入的更改。 本页介绍了这些快速发布和MongoDB 8中引入的更改。 0 。
要详细学习;了解主要版本和快速版本之间的差异,请参阅 MongoDB版本控制。
补丁版本
8.0.3 - 2024 年 10 月 24 日
重要
对空字节的不正确中和可能会导致MongoDB Server中的缓冲区过度读取
在 8.0.3 之前的MongoDB 8.0 中,授权用户可能会发出经特殊设计的请求,在MongoDB Server中构造格式不正确的BSON ,从而触发崩溃或接收服务器内存缓冲区过度读取的内容。
此问题会影响MongoDB Server版本:
5.0.0 - 5.0.29
6.0.0 - 6.0.18
7.0.0 - 7.0.14
8.0.0 - 8.0.2
修复的问题:
SERVER-96419 不正确的空字节中和可能会导致MongoDB Server中的缓冲区过度读取
8.0.1 - 2024 年 10 月 9 日
修复的问题:
SERVER-76883 减少外部用户的“角色不存在”日志的冗长信息
SERVER-82221 ListCollections 和 ListIndexes 应包含待提交的命名空间
SERVER-94635 使会话刷新参数可配置
SERVER-95244 9146500当客户端直接连接到分片时,导致插入的 upsert 语句可能会失败,并显示分片
WT-13409 __txn_checkpoint 中的一个 ret 未处理
8.0.0 - 2024 年 10 月 2 日
本页的其余部分介绍了MongoDB 8.0中引入的更改和新功能。
平台支持更新
从 MongoDB 8.0 开始,新的 MongoDB Server 版本(主要版本和次要版本)支持操作系统(OS)供应商定义的最低操作系统次要版本。当操作系统供应商不再支持某个操作系统次要版本之后,MongoDB 会更新 MongoDB Server,以支持下一个操作系统次要版本。有关详细信息,请参阅 MongoDB 平台支持改进。
MongoDB 8.0 支持以下最低操作系统次要版本:
Red Hat Enterprise Linux 8.8
Red Hat Enterprise Linux 9.3
SUSE Linux Enterprise Server 15 SP5
Amazon Linux 2023 版本 2023.3
日志记录
从 MongoDB 8.0 开始,可以配置数据库分析器,以根据 MongoDB 处理慢操作时花费的时间(而不是慢操作的总延迟)来记录慢操作。这意味着等待锁和流量控制等因素不会影响操作是否超过慢操作阈值。
这一更改为日志记录和查询分析提供了以下改进:
根据 MongoDB 处理查询时花费的时间,可以更准确地记录慢查询。
查询分析工具(例如 Query Profiler、Performance Advisor 和 Search Query Telemetry)会根据
workingMillis
而不是durationMillis
报告缓慢的操作。这一变更可以更准确地查看有问题的查询。慢查询日志包含一个指标
queues.execution.totalTimeQueuedMicros
,用于衡量在执行工单上排队的时间。此指标可以帮助确定一项操作之所以缓慢,是因为它需要一些时间完成,还是因为它需要一些时间等待启动。
有关更多信息,请参阅 db.setProfilingLevel()
。
数据库分析器
为数据库分析器指定过滤器时,可以根据新的 workingMillis
指标记录操作。可以根据 workingMillis
和 durationMillis
记录操作,并将每个指标设置为不同的阈值。
聚合(Aggregation)
BinData 转换
从 MongoDB 8.0 开始,可以使用 $convert
操作符执行以下转换:
字符串值转换为 binData 值
binData 值转换为字符串值
MongoDB 8.0还包括一个新的辅助表达式$toUUID
,它提供了将字符串转换为 UUID值的简化语法。
$queryStats
从MongoDB 7.1开始, $queryStats
阶段会返回已记录查询的统计信息。
变更流改进
从 MongoDB 8.0 开始,$queryStats
改进了变更流的跟踪和报告指标。有关更多信息,请参阅 $queryStats 变更流行为。
$rank 和 $denseRank 行为
从 MongoDB 8.0 开始,当计算排名时,null
与 $denseRank
和 $rank
sortBy 操作中的缺失字段值将被同等对待。这一更改将使 denseRank
和 rank
的行为与 $sort
一致。
安全性
可查询加密范围查询
从 MongoDB 8.0 开始,可查询加密支持使用 $lt
、$lte
、$gt
和 $gte
操作符对加密字段执行范围查询。有关详细信息,请参阅可查询加密支持的操作。要允许对加密字段执行范围查询,请参阅创建加密模式。
日志消息的 OCSF 模式
从 MongoDB 8.0 开始,可以为审核日志消息指定 OCSF 模式。OCSF 模式以与日志处理器兼容的标准化格式提供日志。
要设置用于日志消息的模式,请使用 auditLog.schema
配置文件选项。
有关 OCSF 格式的日志消息的示例,请参阅 OCSF 模式审核消息。
入口队列
MongoDB 8.0引入了用于入口准入控制的新队列。 等待从网络进入数据库的操作会进入入口队列。 默认,队列是不受限制的,这意味着MongoDB允许所有操作通过此阶段执行,而无需任何排队。 将队列最大值设置为特定值可让您在当前操作数量达到指定限制时在此阶段对操作进行排队。
分片
从MongoDB 8.0 开始,您可以对集合取消分片,并在分片集群上的分片之间移动未分片分片的。
移动集合
从 MongoDB 8.0 开始,可以使用 moveCollection
命令将未分片集合移到不同的分片中。
有关详细信息,请参阅可移动集合。 要开始使用,请参阅移动集合。
移动具有变更流的集合
从 MongoDB 8.0 开始,movePrimary
不会将具有变更流的集合作废。将集合移到新的分片之后,变更流可以继续从集合中读取事件。
有关详细信息,请参阅移动具有变更流的集合。
对集合取消分片
从MongoDB 8.0开始,您可以使用unshardCollection
命令或sh.unshardCollection()
方法对现有分分片的集合取消分片。 此操作将集合中的所有文档移动到指定的分分片或分片量最少的分片上。
配置分片
从MongoDB 8.0开始,您可以配置配置服务器来存储除通常的分分片集群元数据数据之外的应用程序数据。 同时提供配置服务器和分片服务器功能的mongod
节点称为配置分片。 作为不带分分片服务器功能的独立运行--configsvr
运行的mongod
节点称为专用配置服务器。
要将专用配置服务器配置为作为配置分片运行,请运行transitionFromDedicatedConfigServer
命令。
要将配置分片配置为作为专用配置服务器分片,请运行transitionToDedicatedConfigServer
命令。
有关详细信息,请参阅配置分片。要开始使用,请参阅使用配置分片启动分片集群。要将副本集转换为具有配置分片片的分片分片集群,请参阅使用嵌入式配置服务器将副本集转换为分片集群。
新的数据库命令
新的 mongosh 方法
serverStatus 指标
从MongoDB 8.0开始, serverStatus
在其输出中包含以下新的shardingStatistics
字段:
shardingStatistics.countTransitionToDedicatedConfigServerStarted
shardingStatistics.countTransitionToDedicatedConfigServerCompleted
shardingStatistics.countTransitionFromDedicatedConfigServerCompleted
MongoDB 7.1包含以下针对数据数据块迁移的新分片统计信息:
每个分片的默认数据段
从 MongoDB 7.2 开始,当您使用哈希分片键对collection进行分片时,该操作默认为每个分片创建一个数据块。Previously, the operation created two chunks by default.
directShardOperations 角色
从MongoDB 8.0开始,您可以使用directShardOperations
角色执行需要直接对分片执行命令的分片操作。
警告
使用directShardOperations
角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations
角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations
角色。
为分片集群启用排出游标
从MongoDB7.1 开始,当客户端的mongos
getMore 请求设置 exhaustAllowed 标志时, 支持耗尽游标。当客户端收到数据库服务器针对单个请求的多个回复时,这可以提高分分片的集群上的查询性能。
mongos端口范围
从MongoDB 7.1开始, mongos
接受来自 [ 0 , 65535 ] 的--port
值。 有关更多信息,请参阅--port
。
使用部分分片键进行查询
从 MongoDB 7.1开始, findAndModify
和deleteOne()
可以使用部分分片键来查询分片集合。
重新分片改进
MongoDB 7.2 在reshard collection操作中引入了显着的性能改进,从而大幅减少了操作的运行时间。
此外,如果您的应用程序和集群满足必要的要求和限制,则可以使用reshardCollection
命令对同一键上的collection重新分片,从而重新分发您的collection,这比备用范围迁移过程要快得多。
命令中添加了以下选项:
字段 | 说明 |
---|---|
forceRedistribution | 启用同键重新分片。 |
有关示例,请参阅将数据重新分发到新分片。
分片集群的自管理备份
从 MongoDB 7.1开始, fsync
和fsyncUnlock
命令可以对分片集群执行 fsync 操作。
当在mongos
上运行且lock
字段设立为true
时, fsync
命令会将写入操作从存储层刷新到磁盘并锁定每个分分片,从而阻止其他写入操作。 然后可以使用fsyncUnlock
命令解锁集群。
此功能支持使用mongodump
进行分分片的集群的自我管理备份。
分片集合上的更新或插入(upsert)或插入行为
从MongoDB 7.1开始,在分分片的集合上使用updateOne()
和upsert: true
时,您不需要在过滤中包含完整的分分片键。
具有分片集合的事务中的 $lookup 阶段
从 MongoDB 8.0 开始,可以在事务内使用 $lookup
阶段,并以分片集合为目标。
复制
多数写关注
从MongoDB 8.0开始,当大多数副本集成员已写入更改的oplog条目时,使用"majority"
写关注(write concern)的写入操作会返回确认。 这提高了"majority"
写入的性能。 在以前的版本中,这些操作将等待,并在大多数副本集成员应用更改后返回确认。
如果您的应用程序在收到来自{ w: "majority" }
写入操作的确认后立即从从从节点(secondary node from replica set)读取(没有因果一致的会话),则查询返回的结果可能不包括写入更改。
新的 replSetGetStatus 指标
从 MongoDB 8.0 开始,使用 replSetGetStatus
命令时可以使用以下指标:
oplog缓冲区
从MongoDB 8.0开始,从节点并行为每个批处理写入和应用oplog条目。 写入器线程从主节点 (primary node in the replica set)节点读取新条目并将其写入本地oplog。 应用程序线程将这些更改异步应用到本地数据库。 此更改增加了从节点的复制吞吐量。
这为metrics.repl.buffer
引入了一项破坏性变更 (breaking change),因为它现在提供了两个缓冲区(而不是一个)的指标。
MongoDB 8.0弃用了以下服务器状态指标:
MongoDB 8.0添加了以下服务器状态指标:
升级版 TCMalloc
从 MongoDB 8.0 开始,MongoDB 使用升级版 TCMalloc,此版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片,并使数据库对高压工作负载更有弹性。
新的 TCMalloc 版本直接影响之前针对透明大页面的生产建议。 要学习;了解更多信息,请参阅针对自托管部署的 TCMalloc 性能优化。
serverStatus 指标
从MongoDB 8.0开始,以下新的serverStatus
指标报告有关tcmalloc
使用情况的信息:
一般性变更
关闭性能
从 MongoDB 8.0 开始,Bulk.insert()
和数据提取工作负载可能表现得更好。不过,在运行这些工作负载之后立即关闭 MongoDB 可能需要更长的时间,因为在将额外的数据刷新到磁盘上。
将应用程序数据存储在配置分片上
从 MongoDB 8.0 开始,除了常用分片集群元数据以外,还可以配置一个配置服务器,以存储应用程序数据。此配置服务器被称为配置分片。有关详细信息,请参阅配置分片。
压缩改进
从 MongoDB 7.3开始, compact
命令包含一个新的freeSpaceTargetMB
选项,用于指定可恢复的最小存储空间量(以兆字节为单位)才能继续压缩。
后台压缩
从 MongoDB 8.0 开始,可以使用新的 autoCompact
命令执行后台压缩。如果启用,服务器会尝试将每个集合和索引内的可用空间保持在指定的 freeSpaceTargetMB
值以下。
dryRun 选项
如果启用,compact
命令将返回压缩可以从目标集合中回收的空间大小(以字节为单位)的估计值。如果在 dryRun
设置为 true
的情况下运行 compact
,MongoDB 只返回估计值,而不执行任何类型的压缩。
并发 DDL 操作
从MongoDB 7.1开始,当您运行针对同一数据库中不同集合的多个DDL 操作时, MongoDB会并发运行这些操作。
此更改向serverStatus
locks
字段和currentOp.locks
输出添加了两种新类型:
DDLDatabase
DDLCollection
mongos聚合查询的数据库验证
从 MongoDB 7.2 开始,尝试在mongos部署上使用不存在的数据库的聚合管道查询会返回验证错误。
在以前的版本中,这些聚合查询返回空游标。
DDL 操作
在 MongoDB 8.0 中,如果在集群执行 DDL 操作(修改集合的操作,例如 reshardCollection
)时添加或删除分片,将只在完成并发 DDL 操作之后执行任何添加或删除分片的操作。
超过管道大小限制的错误代码
从 MongoDB 7.1开始,当管道超过管道阶段限制时,聚合命令将引发错误。 有关更多详细信息,请参阅阶段数限制。
getField 字段支持所有字符串
从 MongoDB 7.2 开始,您可以为$getField
操作符的field
输入指定解析为字符串的任何有效表达式。 在早期版本中, field
仅接受字符串常量。
改进索引构建
从 MongoDB 7.1 开始,索引构建得到了改进,报告速度更快,韧性更强。您还可以使用新的indexBuildMinAvailableDiskSpaceMB
参数设置索引构建所需的最小可用磁盘空间,如果磁盘空间太低,该参数会停止索引构建。
添加了以下新的索引构建指标:
有关完整详细信息,请参阅索引构建。
新增参数
auditConfig 参数
MongoDB 7.1添加了auditConfig
集群参数,其中包含有关来自mongod
和mongos
服务器实例的Atlas 审核配置的信息。
defaultMaxTimeMS 参数
从 MongoDB 8.0 开始,可以使用 defaultMaxTimeMS
集群参数为要完成的个别读取操作指定默认时间限制。
indexBuildMinAvailableDiskSpaceMB 参数
MongoDB 7.1添加了indexBuildMinAvailableDiskSpaceMB
参数,该参数允许您设立索引构建所需的最小可用磁盘空间。
tcmallocEnableBackgroundThread 参数
从 MongoDB 8.0 开始,默认启用了 tcmallocEnableBackgroundThread
。这样将使 MongoDB 定期将内存重新释放给操作系统。
新的批量写入命令
从 MongoDB 8.0 开始,可以使用新的 bulkWrite
命令在一个请求中对多个集合执行很多插入、更新和删除操作。现有的 db.collection.bulkWrite()
方法只允许在一个请求中修改一个集合。
新的查询结构和查询设置
MongoDB 8.0 引入了一个新的查询结构。预先存在的查询结构已重命名为计划缓存查询结构。
从 MongoDB 8.0 开始,可以为新的查询结构添加查询设置。在查询规划期间,查询优化器使用查询设置作为附加输入,这样会影响为运行具有匹配的查询结构的查询而选择的计划。
与索引过滤器相比,查询设置具有经过改进的功能。从 MongoDB 8.0 开始,还弃用了索引过滤器,因此应避免使用它们。
要添加查询设置,请使用
setQuerySettings
命令。要删除查询设置,请使用
removeQuerySettings
命令。要检索查询设置,请在一个聚合管道中使用一个
$querySettings
阶段。要阻止查询结构,请参阅操作拒绝过滤器。
从MongoDB 8.0开始, queryShapeHash
包含在以下输出中:
explain
{ 字段中的 命令explain.queryShapeHash
从 MongoDB 8.0 开始,预先存在的 queryHash
字段被重命名为 planCacheShapeHash
。如果正在使用早期版本的 MongoDB,您将看到 queryHash
而不是 planCacheShapeHash
。
参数过滤
从 MongoDB 8.0 开始,getParameter
命令接受 setAt
字段。可以使用此字段过滤 allParameters: true
返回文档,以便只显示可以在启动或运行时设置的那些参数。
针对固定大小集合的读关注
从 MongoDB 8.0 开始,可以在固定大小集合上使用读关注 "snapshot"
。
serverStatus 输出变更
从MongoDB 7.1开始, serverStatus
命令输出包括以下新指标:
从MongoDB 7.2开始, serverStatus
命令输出包括以下新指标:
从MongoDB 7.3开始, serverStatus
命令输出包括以下新指标:
从MongoDB 8.0开始, serverStatus
命令输出包括以下新指标:
面向 updateOne 的排序支持
从 MongoDB 8.0 开始,updateOne()
方法支持 sort
选项。此选项将控制 MongoDB 在选择文档以接收更新之前如何对文档进行排序。
以前的版本使用 findAndModify()
和 findOneAndUpdate()
方法,按照用户指定的排序顺序更新第一个文档。对可重试写入的支持要求这些方法将整个文档复制到每个节点的特殊侧方集合中,这是一个比具有新的 sort
选项的 updateOne()
方法更昂贵的操作。
为不同命令指定查询索引提示
从MongoDB 7.1开始, distinct
命令中提供hint
字段,允许您指定查询的索引。
TTL Indexes
从 MongoDB7.1 开始,您可以在固定大小 集合 上创建 TTL 索引 。
查询规划和执行
块处理
从版本 8.0 开始,MongoDB 可以使用块处理来执行某些时间序列查询。这一性能改进利用数据“块”而不是单个值来处理查询。当使用时间序列集合时,块处理可提高查询执行速度和吞吐量。
要查看时间序列查询是否使用块处理,请检查解释计划输出中的 explain.queryPlanner.winningPlan.slotBasedPlan.stages
字段。
要了解更多信息,请参阅块处理。
表达查询阶段
从 MongoDB 8.0 开始,有限的一组查询(包括 _id
等值匹配)会跳过常规查询规划和执行。这些查询使用一项经过优化的索引扫描计划,该计划由以下计划阶段之一组成:
EXPRESS_CLUSTERED_IXSCAN
EXPRESS_DELETE
EXPRESS_IXSCAN
EXPRESS_UPDATE
有关查询计划的更多信息,请参阅解释结果。
被拒绝的查询计划输出
从 MongoDB 8.0 开始,被拒绝的查询计划只包含查询的 find
部分。在以前的版本中,被拒绝的计划可以包含聚合阶段,例如 $group
。查询规划器不使用这些聚合阶段来选择获胜计划,因此 rejectedPlans
字段只包含查询中用于选择获胜计划的部分。
这一更改还确保被拒绝的计划的 executionStats
不为零。因此,您现在可以查看统计信息,例如被拒绝的计划检查了多少个文档或密钥。
有关被拒绝的查询计划的更多信息,请参阅 explain.queryPlanner.rejectedPlans
。
批量多文档插入操作
从 MongoDB 8.0 开始,多文档事务的插入操作不再生成单独的 oplog
条目。相反,系统会将多文档插入操作作为单个条目进行批处理。每个文档的变更流 insert
事件具有相同的 clusterTime
。
这一更改提高了多文档插入操作的性能,并消除了多次 oplog
写入操作可能产生的复制延迟。
OIDC 身份提供程序可以共享一个发布者
从 MongoDB 8.0 开始,当定义了多个身份提供程序 (IDP) 时,只要 audience
值对于每个发布者都是唯一的,oidcIdentityProviders
参数就会接受重复的 issuer
值。在版本 7.3 和 7.0 中,也可以使用此功能。
子管道中的命名空间
从MongoDB 8.0开始,对$lookup
和$unionWith
内部子管道中的命名空间进行验证,以确保正确使用from
和coll
字段。
有关详细信息,请参阅$lookup 子管道和$unionWith 子管道。
查询规划器优化时间
explain()
方法现在会返回有关查询规划器优化时间的信息。queryPlanner.optimizationTimeMillis
状态显示查询规划器在优化上花费的时间(以毫秒为单位)。
已知问题
本部分介绍MongoDB 8.0中的已知问题及其解决状态。
版本中 | 问题 | 状态 |
---|---|---|
8.0.0 | SERVER-94741 :当包含顶级 $or $and 子句(包括隐式$and 子句)的 查询可以使用多个索引时,该查询可能会使用效率较低的索引,因为在新的MongoDB8 0中查询规划的“索引修剪”阶段。 。 | 未解决。 计划在8.0.1 中通过禁用 SERVER-94738 中的索引修剪功能来缓解。 |
8.0.0 | SERVER-95244 :当满足以下所有条件时,单分片分片的上的更新或插入操作可能会更频繁地失败:
过渡到分分片集群的推荐进程需要移动客户端以连接到 | 此问题计划在8.0.1中修复。 |
升级程序
重要
特征兼容性版本
要从 7.0 部署升级到 MongoDB 8.0,7.0 部署必须将 featureCompatibilityVersion
设置为 7.0
。要检查版本:
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
要升级到 MongoDB 8.0,请参阅特定于您的 MongoDB 部署的升级说明:
如您在升级到 8.0 版本的过程中需要指导,MongoDB 的专业服务将提供主要版本的升级支持,帮助确保您的 MongoDB 应用程序能够顺利过渡,不会中断。要了解更多信息,请参阅 MongoDB 咨询服务。
立即下载
要下载 MongoDB 8.0,请访问 MongoDB 下载中心。