MongoDB 4.4 发布说明
在此页面上
警告
过去的版本限制
补丁版本
4.4.29 - 2024 年 2 月 28 日
重要
修复 MongoDB Server 可能允许成功的不可信连接的问题
由于 CVE- 2024 - 1351 ,在 MongoDB 4中。 4之前的4 。 4 。 29 ,在某些 --tlsCAFile
和CAFile
配置下,MongoDB Server 可能会跳过对等证书验证,从而导致不可信连接成功。
这可能会有效降低 TLS 提供的安全保证,并打开由于证书验证失败而应关闭的连接。此问题会影响以下 MongoDB Server 版本:
7.0.0 - 7.0.5
6.0.0 - 6.0.13
5.0.0 - 5.0.24
4.4.0 - 4.4.28
CVSS 分数:8.8
CWE:CWE-295:证书验证不正确
SERVER-70155 添加 oplog 槽对 mongod“慢速查询”日志行保持开放状态的持续时间
SERVER-82353 当 movePrimary 并发运行时,多文档事务可能会丢失文档
SERVER-83564 确保进程字段在 config.locks 中编入索引
SERVER-{385536 44} [ . ]删除未编制索引的唯一部分索引项会产生写冲突
4.4.28 - 18 1 月, 2024
SERVER-77506 分片多文档事务可能会导致数据和 ShardVersion 不匹配
SERVER-82365 优化负载均衡器集合分布状态柱状图的构建(第 2 次尝试)
SERVER-82883 当参与者处于准备就绪状态时,在升级时恢复 TransactionCoordinator 可能会阻止获取读/写票证
WT-7929 研究避免 FTDC 在检查点阶段停滞的解决方案
4.4.27 - 3 1 月, 2024
SERVER-63865 不正常关闭后独立启动恢复期间处理丢失的索引标识
SERVER-81106 接收分片不会等到集合版本在本地保存好后再开始克隆阶段
SERVER-81878 startupRecoveryForRestore 可能无法很好地与启动恢复期间应用的集合删除配合使用
SERVER-82325 配置服务器可能在负载均衡轮询期间保持不变
WT-11564 修复 RTS,使其仅在检查点中存在最新事务值时才读取该值
4.4.26 - 2023 年 11月 27 日
修复的问题:
服务器 -50792 当无法找到 shardCollection 或 refineCollectionShardKey 的分片键索引时,将返回更多有用的错误信息
SERVER-80021 使 $convert 在 double 和字符串之间正确转换
SERVER-81106 接收分片不会等到集合版本在本地保存好后再开始克隆阶段
SERVER-81966 避免在刷新期间修改以前的 ChunkMap 实例
WT-10424 如果存在许多已删除的列项,则 cursor::search_near 的性能会降低
4.4.25 - 2023 年 9 月 29 日
修复的问题:
SERVER-76299 报告从节点上的 serverStatus 中的 writeConflicts
SERVER-78828 LDAP 主机计时数据在排序过程可能不一致
WT-11031 修复 RTS,以跳过检查点中没有时间窗口信息的表格
SERVER-70973 当没有更多可用分片时,负载均衡器应停止迭代集合
SERVER-71627 当集群包含 100 万个数据块时,刷新缓存的集合路由信息会严重阻塞所有客户端请求
SERVER-78813 提交点传播无限期失败,耗尽游标的 lastCommitted optime 为空值
WT-8570 在恢复期间不增加最早的 ID
WT-10449 没有更新要写入历史存储时,不保存更新链
4.4.24 - 23 8 月, 2023
修复的问题:
SERVER-76299 报告从节点上的 serverStatus 中的 writeConflicts
SERVER-78828 LDAP 主机计时数据在排序过程可能不一致
WT-11031 修复 RTS,以跳过检查点中没有时间窗口信息的表格
4.4.23 - 2023 年 7 月 13 日
SERVER-73943 在内存受限的系统中将代码页固定在内存中
SERVER-75922 升级到 4.2 及更高版本后,在 MongoDB 4.0 上创建的部分唯一索引可能会丢失索引键,从而导致唯一性违规
SERVER-78126 对于特定类型的输入,mongo::Value() 在大端平台上始终会得到相同的哈希结果
4.4.22 - 5 月18 、 2023
SERVER-48196 将 timelib 升级到最新版本以将内置时区文件更新到最新版本
SERVER-57056 INFO 消息的系统日志严重性设置不正确
WT-10551 增量备份可能会遗漏修改后的块
4.4.21 - 2023 年 4 月 27 日
修复的问题:
SERVER-75261“listCollections”命令失败,并出现 BSONObjectTooLarge 错误
SERVER-76098 允许使用 $search 和非简单排序规则进行查询
4.4.20 - 4 月10 、 2023
修复的问题:
SERVER-51835 Mongos readPreferenceTags 未按预期工作
SERVER-74345 从旧版本(Debian、RPM 包)升级后,mongodb-org-server 4.4.19、5.0.15、6.0.5 无法启动
SERVER-75205 在降级过程和释放锁后的恢复过程之间,因所有读取工单已用完,而造成死锁
WT-9500 修复 RTS,使用单元时间窗口而不是 HS 更新的键/值时间戳
4.4.19 - 2 月27 、 2023
修复的问题:
SERVER-68122 分析了在初始同步期间复制集合 WiredTiger 配置字符串的情况
SERVER-71759 dataSize 命令无法生成
SERVER-72222 在分片集群中合并结果时,具有单个 reduce 优化的 MapReduce 会失败
SERVER-72535 分片集群允许使用替代大小写创建“admin”、“local”和“config”数据库
SERVER-70235在 v4.2-v4.4 升级时不创建范围删除文档,以防集合 uuid 不匹配
WT-9599 获取热备份锁以在块管理器中调用 fallocate
4.4.18 - 2022 年 11月 21 日
修复的问题:
SERVER-66289$out 在 v5.0.8 上错误地抛出 BSONObj 大小错误
SERVER-61185 使用 prefix_search 进行唯一索引查找
SERVER-68115 修复了“elemMatchRootLength > 0”不变触发器的错误
SERVER-50454 避免在出现重复密钥错误时将“keyValue”字段发送给驱动程序
服务器 -69443 [4.4] 当 --enableMajorityReadConcern=false 时,允许在多文档 txns 中进行推测性多数读取
4.4.17 - 2022 年 9 月 28 日
修复的问题:
SERVER-68925 在启动时重新引入检查表日志记录设置(恢复 SERVER-43664)
SERVER-56127 如果迁移数据块并且分片键模式使用嵌套字段,则可重试更新可能会执行多次
SERVER-64142 在 refineCollectionShardKey 命令中添加新的 enforceUniqueness
SERVER-65382 AutoSplitVector 不应使用 clientReadable 将分片键字段重新排序
SERVER-61275 在会话缓存关闭后销毁大小存储器
WT-9870 修复在恢复期间更新最旧时间戳时总是更新固定时间戳的问题
4.4.16 - 19 8 月, 2022
修复的问题:
SERVER-67302 由于时钟变化,发生“在没有读取时间戳或 PBWM 锁的情况下从复制的集合中读取”崩溃
SERVER-61321 改进文本索引版本对大/NaN 值的处理
SERVER-60607 改进地理索引版本对大/NaN 值的处理
SERVER-66418 由于字符串排序假设,在依赖性分析期间创建了错误的投影
WT-9096 修复当键不存在时,搜索接近有时会返回错误的键/值的问题
4.4.15 - 21 6 月, 2022
修复的问题:
SERVER-66433 向后移植截止时间等待重叠范围删除,完成到 v5.1 之前的版本
SERVER-65821 当存在尚未持久化提交/中止决策的就绪事务时,setFCV 阶段会出现死锁
SERVER-65131 禁用机会性读取定位(对冲读取除外)
SERVER-62272 在集合中添加模式验证可能会禁止失败文档的数据块迁移
SERVER-54900 阻塞网络调用可能会无限期延迟同步源解析
4.4.14 - 5 月9 、 2022
修复的问题:
SERVER-64983 在 TransactionParticipant::_resetTransactionState 中回滚 WT 事务之前,释放客户端锁
SERVER-62229 修复 recoverFromOplogAsStandalone=true 时应用索引构建条目时的不变性
SERVER-60412 主机内存限制检查不支持 cgroups v2
SERVER-55429 在接收器不清理重叠范围时,提前中止迁移
WT-8924 在检查行存储中的冲突时,如果存在插入列表,则不要对照磁盘时间窗口
4.4.13 - 2022 年 3 月 18 日
修复的问题:
SERVER-63203 如果找到超过 8192 个分割点,数据块分割器永远不会分割
SERVER-62065 从 3.6 到 4.0 的升级途径可能在分片上留下没有历史记录的数据块条目
SERVER-59754 对于具有相同 $lookup 结构的操作,queryHash/planCacheKey 日志记录不正确
SERVER-55483 添加了一个新的启动参数,用于跳过验证表日志设置
SERVER-40691 $nin:[...] 查询未编制索引
4.4.12 - 21 1 月, 2022
修复的问题:
SERVER-62203 将线程名称“健康检查进度监视器”更改为“FaultManagerProgressMonitor”
SERVER-61930 如果在进行单次健康检查时超时时间已过,各个运行状况观察器应返回一个错误
SERVER-61637 检查范围删除器批处理策略
SERVER-59362 设置故障管理器状态机
4.4.11- 2021 年 12 月 30 日
修复的问题:
WT-8395 从 4.4.3 和 4.4.4 升级到 4.4.8+ 和 5.0.2+ 之后数据不一致
SERVER-60326 X509 证书的主题名称为空时,Windows Server 无法启动
SERVER-60310 OCSP 响应验证不应考虑不相关证书的状态
SERVER-59226 降级过程中配置文件会话标记为不可中断时出现死锁
SERVER-56226 [v4.4] 在 config.collections 条目上引入“permitMigrations”字段,以禁止提交数据块迁移
SERVER-51329 关闭 mongos 服务器时出现意外的不可重试错误
SERVER-45953 使 oplog 读取器不再获取读取工单
4.4.10 - 2021 年 10 月 15 日
修复的问题:
SERVER-59876:建立出口连接时,从 libcrypto.so 返回存在较大延迟
SERVER-59867:应确定性地序列化 ReplSetConfig/MemberConfig 中的水平拆分映射
SERVER-59456:启动 LDAPReaper 线程池
SERVER-59074:不要仅仅为了设置/等待 oplog 可见性而获取存储票证
SERVER-54064:仲裁节点上的会话进行累积而无法清除
4.4.9 - 2021 年 9 月 21 日
修复的问题:
SERVER-57630: 针对 OpenSSL 1.1.1 运行时,在 Ubuntu 18.04 上启用 SSL_OP_NO_RENEGOTIATION
SERVER-34938:由于单个 oplog 批处理将内容固定在缓存中,从节点减速或挂起
WT-8005:修复了一个可能导致历史存储条目未解决的准备提交错误
WT-7995:修复全局可见性无法超出检查点可见性的问题
WT-7984:修复可能导致检查点遗漏数据页面的错误
4.4.8 - 4 8 月, 2021
修复的问题:
SERVER-58936:可能不会强制执行唯一索引约束
SERVER-58258: 在断言 'replSetGetStatus' 回复中没有 'initialSync' 字段之前,等待初始同步清除状态
SERVER-52906:moveChunk 迁移失败后,回滚的克隆索引可能会由于缺少分片键索引而无限期挂起
WT-7837:清除 wt_hs_insert_updates 中的更新结构以避免触发断言
WT-6729:在运行回滚到稳定的活动事务检查之前停止驱逐
4.4.7 - 2021 年 7 月 16 日
修复的问题:
SERVER-57476:操作可能会在拥有 oplog 插槽时由于准备冲突而阻塞,从而无限期停止复制
SERVER-56054:将复制写入器线程池的 minThreads 值改为 0
SERVER-53760: $unwind + $sort 管道在溢出到磁盘时产生大量文件句柄
SERVER-47699:将范围删除器使用的 yield 类型从 YIELD_MANUAL 更改为 YIELD_AUTO
WT-7185:如果事务强制逐出并且是最早的,应避免中止该事务
4.4.6 - 5 月10 、 2021
修复的问题:
SERVER-53604:在身份验证审核日志中包含原始 aws iam arn
SERVER-52564:在降级和 MongoDOperationContextSession 之间发生死锁
WT-7442:仅当 dhandle 更新不稳定时,RTS 才打开 dhandle
WT-7426:在创建页面图像时,设置写入代数
WT-7373:改进 oplog 上的缓慢随机游标操作
4.4.5 - 4 月8 、 2021
修复的问题:
SERVER-55298:重现并调查 BSONObjectTooLarge 错误
SERVER-53566:调查并重现“opCtx != nullptr && _opCtx == nullptr”不变量
SERVER-51281:mongod 实时锁定
SERVER-46686:解释不遵循 maxTimeMS
SERVER-45836:在默认日志级别提供更多 LDAP 详细信息(例如服务器 IP)
4.4.4 - 2 月16 、 2021
修复的问题:
SERVER-48471:哈希索引可能被错误地标记为多键,而不适合作为分片键
SERVER-50769:服务器在 expr{"expr":"_currentApplyOps.getArrayLength() > 0","file":"src/mongo/db/pipeline/document_source_change_stream_transform.cpp","line":535}} 之后重启
SERVER-52919:没有为初始同步启用线路压缩
WT-7109:保留不再支持的配置选项以保持向后兼容
WT-7117:RTS 在恢复更新时跳过比磁盘基础更新更新的修改
4.4.3 - Jan 4, 2021
修复的问题:
SERVER-33966: 聚合中的冗余 $sort 会阻止最佳 $limit $sort 合并
SERVER-40361:减少计划缓存条目的内存占用
SERVER-52654:新的签名密钥不是由 monitoring-keys-for-HMAC 线程生成的
SERVER-52824:支持具有路径的 AWS 角色
SERVER-52929:正确处理 32 键复合索引
4.4.2 - 2020 年 11月 18 日
修复的问题:
SERVER-48067:减少使用大量非唯一键构建唯一索引的内存消耗
SERVER-48523:在尝试恢复变更流时,无条件地检查 oplog 中的第一个条目
SERVER-50365:停滞在无法超时的长时间运行的事务中
SERVER-50394:在分片环境中,mongod 审核日志将 DDL 操作归属于 __system 用户
SERVER-51041:限制从节点读取的起始事务
SERVER-51120:指定排序规则时,使用 MERGE_SORT 查找查询会错误地对结果进行排序
4.4.1 - 2020 年 9 月 9 日
修复的问题:
SERVER-48531: 在数据块拆分器、准备的事务和降级线程之间可能发生3向死锁。
SERVER-48641:由于 MigrationDestinationManager 等待写关注并签出会话而导致死锁
SERVER-49546:setFCV to 4.4 应批量插入范围删除任务,而不是一次插入一个
SERVER-49694:在分片集群上,最近的或对冲的读取可能不会路由到附近的分片副本。
SERVER-50137:由于 3.4 中生成的 oplog 条目,MongoDB 由于不变量失败而崩溃
SERVER-50140: 在非正常重新启动同步源后,初始同步无法继续存在
SERVER-50170:修复 mongos 上的服务器选择失败问题
WT-6623: 设置恢复文件扫描中的连接级别文件 ID
全时诊断数据捕获要求
从版本 4.4 开始,如果 mongod
或 mongos
中的全时诊断数据捕获 (FTDC) 线程失败,则会终止发起进程。为避免最常见的故障,请确认运行 mongod
/mongos
的用户拥有在 storage.dbPath
中(对于 mongod
)或平行于 systemLog.path
的位置(对于 mongos
)创建 FTDC diagnostic.data
目录的权限。
聚合(Aggregation)
Union All($unionWith
阶段)
MongoDB 4.4 添加了$unionWith
聚合阶段,能够将来自多个集合的管道结果组合成一个结果集。
有关详细信息,请参阅$unionWith
。
自定义聚合表达式(Custom Aggregation Expressions)
从版本 4.4 开始,MongoDB 提供以下这些新操作符,允许用户定义自定义聚合表达式:
通过添加这些新操作符,您可以使用聚合来写入自定义 JavaScript 表达式,而不必依赖 mapReduce
和 $where
。
有关更多信息,请参阅 Map-Reduce 到聚合管道。
新聚合操作符
常规聚合改进
$out
从 MongoDB 4.4 开始:
$indexStats
从 MongoDB 4.4 (4.2.4 亦可)开始:$indexStats
会在其输出中包含以下字段:
$merge
从 MongoDB 4.4 开始:
只有当集群中的所有节点都将 featureCompatibilityVersion 设置为
4.4
或更高版本且读取偏好允许从节点读取时,$merge
才能在副本集从节点上运行。查看驱动程序文档,了解驱动程序何时添加了支持。
$planCacheStats
更改
从版本 4.4 开始,
$planCacheStats
阶段可以在mongos
实例上运行,也可以在mongod
实例上运行。在 4.2 中,$planCacheStats
阶段只能在mongod
实例上运行。$planCacheStats
包括新的字段:主机字段,以及针对mongos
运行时的分片字段。mongo
shell 提供PlanCache.list()
方法作为$planCacheStats
聚合阶段的包装器。MongoDB 删除以下内容:
planCacheListPlans
和planCacheListQueryShapes
命令,以及PlanCache.getPlansByQuery()
和PlanCache.listQueryShapes()
方法。
$collStats
更改
从 MongoDB 4.4 开始,$collStats
接受 queryExecStats
字段作为参数文档。提供此字段会在输出中返回以下字段:
collectionScans
字段包含一个包含以下字段的嵌入式文档:
字段名称 | 说明 |
---|---|
total | 一个 64 位整数,表示执行collection扫描的查询总数。总数包括使用和未使用可追加游标的查询。 |
nonTailable | 一个 64 位整数,给出执行未使用可追加游标的集合扫描的查询数量。 |
explain
更改
从 MongoDB 4.4 开始,当您在 executionStats
和 allPlansExecution
模式中运行 db.collection.explain().aggregate()
方法时,在解释输出中列出的每个管道阶段均包含 nReturned
和 executionTimeMillisEstimate
。
副本集
可恢复的初始化同步 (Resumable Initial Sync)
从 MongoDB 4.4 开始,如果被暂时(即临时)网络错误、集合删除或集合重命名中断,从节点执行初始同步以尝试恢复同步进程。同步源还必须运行 MongoDB 4.4 以支持可恢复初始同步。如果同步源运行 MongoDB 4.2 或更早版本,从节点就像遇到非暂时性网络错误一样必须重启初始同步进程。
默认情况下,从节点会尝试在 24 小时内恢复初始同步。MongoDB 4.4 增加了 initialSyncTransientErrorRetryPeriodSeconds
服务器参数,用于控制从节点尝试恢复初始同步的时间长度。如果从节点无法在配置的时间段内成功恢复初始同步进程,则会从副本集中选择一个新的健康源,然后从头开始重新启动初始同步进程。
在 MongoDB 4.4 之前,如果从节点在进程中遇到错误,它将重新启动整个初始同步。
流复制 (Streaming Replication)
从 MongoDB 4.4 开始,来自源的同步会向其同步从节点发送连续的 oplog 条目流。
在比 MongoDB 4.4 更早的版本中,从节点通过向其同步源发出请求并等待响应来获取批量 oplog 条目。这需要对每批 oplog 条目进行一次网络往返。MongoDB 4.4 添加了 oplogFetcherUsesExhaust
启动参数,用于禁用流复制和使用较早的复制行为。
有关详细信息,请参阅流复制。
回滚目录
从 Mongo 4.4 开始,集合的回滚目录以集合的 UUID 命名,而不是以集合命名空间命名;例如
<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson
有关详细信息,请参阅回滚数据。
最短 Oplog 保留期
您可以指定保留 oplog 条目的最小小时数,在此期间, mongod
仅在以下两个条件都满足时才会删除 oplog 条目:
oplog 已达到最大配置大小。
oplog 条目早于根据主机系统时钟配置的小时数。
默认情况下,MongoDB 不设置最小 oplog 保留期,并自动从最旧的条目开始截断 oplog,以维持配置的 oplog 最大大小。
要在启动 mongod
时配置 oplog 最短保留期,请执行以下任一操作:
将
storage.oplogMinRetentionHours
设置添加到mongod
配置文件中。-或-
添加
--oplogMinRetentionHours
命令行选项。
要在正在运行的 mongod
上配置最短 oplog 保留期,请使用 replSetResizeOplog
。在 mongod
运行时设置最短 oplog 保留期会覆盖启动时设置的任何值。您必须更新相应配置文件设置或命令行选项的值,才能在服务器重启后继续保持这些更改。
重要
oplog 的大小可以不受限制地增长,以便在配置的小时数内保留 oplog 条目。由于写入量高且保留期长,这可能会导致系统磁盘空间减少或耗尽。
slowOpSampleRate
影响从节点日志
从 MongoDB 4.4 开始,副本集从节点上的慢 oplog 应用程序日志会受到 slowOpSampleRate
的影响。在以前的版本中,无论采样率如何,MongoDB 都会记录所有慢 oplog 条目。
slowOpSampleRate
指定应分析或记录的慢速操作的比例。
索引在承载数据的副本集节点上同时构建
注意
需要 featureCompatibilityVersion 4.4+
副本集或分片集群中的每个 mongod
必须将 featureCompatibilityVersion 设置为至少 4.4
,才能跨副本集节点同时启动索引构建。
索引构建在副本集或分片集群上,并在所有数据承载副本集成员上同时构建。对于分片集群,索引构建仅会在包含当前被索引集合的数据的分片上进行。主节点需要最少数量的数据承载 voting
节点(即提交法定节点数),包括其自身,这些节点必须在将索引标记为可供使用之前完成构建。
默认情况下,索引构建使用所有数据承载投票节点的提交法定人数。为了使用非默认提交法定人数启动索引构建,MongoDB 4.4 会将 commitQuorum 参数添加到 createIndexes
或其 shell 助手 db.collection.createIndex()
和 db.collection.createIndexes()
。
为了修改正在进行的索引构建所需的 quorum,MongoDB 4.4 引入了新的 setIndexCommitQuorum
命令。
有关详细信息,请参阅复制环境中的索引构建。
副本集重新配置更改
更改为 replSetReconfig
从 MongoDB 4.4 开始,replSetReconfig
命令会等待大多数投票节点安装副本配置后才返回成功。投票节点是 members[n].votes
为 1
的任何副本节点,包括仲裁节点。首先,该操作会等到当前配置提交后才在主节点上安装新 配置。然后,该操作会等待大多数投票节点安装新配置后再成功返回。有关详细信息,请参阅重新配置等待直到大多数节点安装副本配置。
replSetReconfig
会无限期地等待多数投票节点默认安装配置。MongoDB 4.4 还为 replSetReconfig
添加了可选的 maxTimeMS 参数,用于指定等待操作成功返回的最长时间。
从 MongoDB 4.4 开始,replSetReconfig
命令允许一次添加或删除不超过 1
个 voting
节点。要添加或删除多个投票节点,请发出一系列 replSetReconfig
或 rs.reconfig()
操作,每次添加或删除一个节点。要了解更多信息,请参阅重新配置一次最多可以添加或删除一个投票节点。
更改为 replSetGetConfig
replSetGetConfig
命令在主节点上运行时可以指定新选项 commentStatus: true。使用该选项运行时,该命令在输出中会包含 commitmentStatus 字段。此输出字段将指示副本集之前的重新配置是否已提交,以便副本集准备好再次重新配置。有关更多信息,请参阅 replSetGetConfig 命令。
对副本配置文档的更改
MongoDB 4.4 将 term
字段添加到副本集配置文档中。副本集节点使用 term
和 version
就“最新”副本配置达成共识。设置 featureCompatibilityVersion (fCV) : "4.4" 隐式执行 replSetReconfig
将 term
字段添加到配置文档中并阻塞直到新配置传播到多数副本集节点。与之类似,降级至fCV : "4.2"
会隐式执行重新配置以删除 term
字段。
首选的初始同步源
从 MongoDB 4.4 开始,您可以使用 initialSyncSourceReadPreference
参数指定首选的初始同步源。您只能在 mongod
启动时使用 setParameter
配置文件设置或 --setParameter
命令行选项设置该参数。
initialSyncSourceReadPreference
支持以下读取偏好模式:
primaryPreferred
(投票副本集成员的默认值)nearest
(新增或无投票权的副本集成员的默认值)
如果副本集已禁用 chaining
,则默认 initialSyncSourceReadPreference
读取偏好模式为 primary
。
无法为 initialSyncSourceReadPreference
指定标签集或 maxStalenessSeconds
。
镜像读取 (Mirrored Reads)
从版本 4.4 开始,MongoDB 使用最近访问的数据提供镜像读,以预热可选举从节点的缓存。通过镜像读,主节点可以镜像其接收的一部分操作,并将其发送到可选举从节点的子集。预热从节点的缓存有助于在选举后更快地恢复性能。
注意
主节点对客户端的响应不受镜像读取的影响。镜像读是主节点的“即发即弃”操作;即主节点不等待镜像读的响应。
镜像读参数
MongoDB 4.4 添加以下镜像读取参数。您可以在启动时使用 setParameter
配置文件设置或 --setParameter
命令行选项来设置参数,也可以在运行时使用 setParameter
命令来设置参数:
Parameter | 说明 |
---|---|
为镜像读指定
设为 |
镜像读取指标
如果在操作中指定包含字段,命令 serverStatus
及其相应的 mongo
shell 方法 db.serverStatus()
将返回mirroredReads
:
db.runCommand( { serverStatus: 1, mirroredReads: 1 } )
or
db.serverStatus( { mirroredReads: 1 } )
分片集群
可优化的分片键 (Refinable Shard Keys)
从 4.4 开始,MongoDB 提供 refineCollectionShardKey
命令。使用新命令,您可以通过向现有键添加一个或多个后缀字段来优化集合的分片键。优化集合的分片键可以实现更细粒度的数据分布,并可解决现有键由于关联基数不足而导致巨型(即可不可分割)数据块的问题。
例如,您可能有一个现有的 orders
集合,其分片键为 { customer_id: 1 }
。您可以通过向分片键添加后缀 order_id
字段来更改分片键,以便 {
customer_id: 1, order_id: 1 }
成为新的分片键,从而允许按 customer_id
字段和 order_id
字段来分发数据。
要使用 refineCollectionShardKey
命令,分片集群的特征兼容性版本(fcv)必须为 4.4
。有关更多信息,请参阅 refineCollectionShardKey
命令。
注意
优化分片键后,可能并非集合中的所有文档都具有后缀字段。要填充缺失的分片键字段,请参阅缺失的分片键字段。
在细化分片键之前,请确保集合中的所有或大多数文档都具有后缀字段(如果可能),以避免后期再填充字段。
在早期版本中,一旦选定分片键,就无法修改该分片键。
重要
缺少分片键
由于具有使用后缀来优化分片键的能力,因此集合中并非所有文档都具有后缀字段。从版本 4.4 开始,分片集合中的文档可能会缺失分片键字段。在早期版本中,分片集合的每个文档中都必须存在分片键字段。有关详细信息,请参阅缺少分片键字段。
对冲读 (Hedged Reads)
为尽量减少延迟,mongos
实例默认可以使用对冲读。通过对冲读,mongos
实例可以将读取操作路由到每个查询分片的多个成员,并从每个分片的第一个响应者返回结果。默认情况下,mongos
实例支持使用对冲读。要关闭 mongos
实例对对冲读的支持,请设置 mongos
的 readHedgingMode
参数。
作为读取偏好的一部分,为每个操作都指定了对冲读。非primary
读取偏好支持对冲读。读取偏好nearest
默认指定对冲读。
有关更多信息,请参阅:
对冲读参数
读取偏好的对冲读选项
为了为读取偏好指定对冲读,MongoDB 4.4 引入了对冲读选项。如要使用 MongoDB 驱动程序进行设置,请参阅驱动程序读取偏好 API 文档。
以下 mongo
shell 方法可以接受对冲选项,以针对指定的读取偏好启用对冲读:
对冲读指标
命令 serverStatus
及其对应的 mongo
Shell 方法 db.serverStatus()
返回 hedgingMetrics
。
balancerCollectionStatus
命令
MongoDB 4.4 提供了命令 balancerCollectionStatus
和 mongo
Shell 助手方法 sh.balancerCollectionStatus()
,用于返回分片集合的数据块在命令运行时是平衡(即不需要移动)还是需要移动的信息。使用该命令,用户可以验证初始数据块创建和迁移是否已完成。
改进的mongos
启动过程
从 MongoDB 4.4 开始,mongos
添加了以下新的默认初创企业行为:
此行为使得在启动或重新启动 mongos
实例后能够更快地为初始客户端连接提供服务。具体来说,这允许使用多个 mongos
实例的站点根据需要重新启动它们,或添加新的实例,而无需等待连接建立对这些实例的初始客户端请求。
默认情况下,路由表预加载和连接池预热都处于启用状态。
MongoDB 4.4 添加了以下参数来控制此行为:
默认值:
true
(已启用)启用或禁用对
mongos
启动时预加载路由表的支持。
warmMinConnectionsInShardingTaskExecutorPoolOnStartup
默认值:
true
(已启用)启用或禁用对
mongos
启动时预热连接池的支持。
warmMinConnectionsInShardingTaskExecutorPoolOnStartupWaitMS
默认:
2000
(2 秒)设置在允许客户端连接到
mongos
之前的超时时间(以毫秒为单位),无论已建立的连接池大小如何。
改进路由表更新
执行 movePrimary
或 dropDatabase
命令后,不需要再运行 flushRouterConfig
。现在,这两个命令会在运行时根据需要自动刷新分片集群的路由表。在 flushRouterConfig 注意事项中所述的情况下,仍建议手动发出 flushRouterConfig
命令。
组合哈希分片键 (Compound Hashed Shard Keys)
从 MongoDB 4.4开始,您可以使用具有单个哈希字段的复合分片键对集合进行分片。在版本 4.4 之前,MongoDB 不支持带有哈希字段的复合分片键。
复合哈希分片支持区域分片等功能,其中前缀(即 first)非哈希字段支持区域范围,而哈希字段支持更均匀的分片数据分布。例如,以下操作根据支持区域分片的组合哈希分片键对集合进行分片:
sh.shardCollection( "examples.compoundHashedCollection", { "fieldA" : 1, "fieldB" : 1, "fieldC" : "hashed" } )
复合哈希分片还支持带有哈希前缀的哈希分片键,以解析与单调递增字段相关的数据分布问题。例如,以下操作会在组合哈希分片键上分片一个集合,其中哈希字段是分片键前缀:
sh.shardCollection( "examples.compoundHashedCollection", { "_id" : "hashed", "fieldA" : 1} )
数据块迁移故障转移弹性改进
从 MongoDB 4.4 开始,以下变更将改进故障转移过程中的块迁移和孤立文档清理的弹性:
数据块迁移后等待清理的数据块范围现在会持久保留在
config.rangeDeletions
集合中,并在整个分片中复制。如果发生故障转移,分片的新主节点将读取config.rangeDeletions
集合中的文档并继续删除相应的范围。描述等待清理的范围的文档在该范围被删除后将从config.rangeDeletions
集合中删除。cleanupOrphaned
命令不再从分片中删除孤立文档。相反,cleanupOrphaned
会等待从分片中删除计划删除的孤立文档。
将分片主节点上的 disableResumableRangeDeleter
参数设置为 true
,以暂停分片上的范围删除。
常规分片集群改进
索引一致性检查
从 MongoDB 4.4 开始,配置服务器主节点默认检查分片集合的分片之间是否存在索引不一致问题。在配置服务器主节点上运行时,命令 serverStatus
返回字段 shardedIndexConsistency
以报告索引不一致的情况。
为了配置索引一致性检查,MongoDB 提供了以下参数:
Parameter | 说明 |
---|---|
启用或禁用索引一致性检查。 | |
配置服务器的主节点检查分片集合索引一致性的频率。 |
并发removeShard
操作
从 MongoDB 4.4 开始,您可以同时进行多个 removeShard
操作。
在早期版本中,如果正在执行另一个 removeShard
操作,removeShard
会返回错误信息。
分片键限制
从版本 4.4 开始,MongoDB 取消了对分片键大小的 512 字节限制。对于 MongoDB 4.2 及更早版本,分片键不能超过 512 字节。
部分结果
从 4.4 开始,如果 find
或后续 getMore
命令由于所查询的分片不可用而返回部分结果,输出中会包含一个布尔标志 partialResultsReturned
。
巨型数据块迁移
对于太大而无法迁移的数据块,从 MongoDB 4.4 开始:
新的负载均衡器设置
attemptToBalanceJumboChunks
允许负载均衡器迁移太大而无法移动的数据块,只要这些数据块未标记为 jumbo。有关详情,请参阅超出大小限制的负载均衡范围。moveChunk
命令可以指定一个新选项 forceJumbo,以便迁移过大而无法移动的数据块。这些数据块可能会也可能不会标记为 jumbo。
已改进目录缓存刷新
从 4.4 开始,如果存在过时的数据块,则仅当路由器访问以前具有或当前具有该数据块的分片时才会刷新目录缓存。
在 MongoDB 4.4之前,任何过时的数据段都会导致集合的整个数据段分布被标记为过时,并强制联系分片的所有路由器刷新其分片目录缓存。 MongoDB 4.4添加了enableFinerGrainedCatalogCacheRefresh
启动参数,用于仅对目标分片禁用目录缓存刷新并使用较早的目录缓存刷新行为。 enableFinerGrainedCatalogCacheRefresh
参数默认为true
。
system.sessions
自动拆分 集合
从版本 4.4(和 4.2.7)开始,MongoDB 会自动将 system.sessions
集合分割为至少 1024 个数据块,并将这些数据块均匀地分布在集群中的分片中。
投射
从 MongoDB 4.4 开始,作为使find()
和findAndModify()
投影与聚合的$project
阶段保持一致的一部分,
find()
和findAndModify()
投影可以接受聚合表达式和聚合语法,包括使用字面量和聚合变量。使用聚合表达式和语法,您可以投影新字段或使用新值投影现有字段。find()
和findAndModify()
投影可以使用嵌套形式指定嵌入字段,例如{ field: { nestedfield: 1 } }
以及点表示法。在早期版本中,您只能使用点表示法。
有关更多信息,请参阅:
$meta
Operator
$meta
关键字支持
从 MongoDB 4.4 开始,$meta
操作符添加了对检索 indexKey
元数据的支持。indexKey
元数据仅用于调试目的,不适用于应用程序逻辑。有关更多信息,请参阅$meta
。
{ $meta: "textScore" }
用法与 find()
从版本 4.4 开始,MongoDB 在与 db.collection.find()
一起使用时会进行以下 { $meta: "textScore" }
更改:
要使用
{ $meta: "textScore" }
,必须在查询谓词中指定$text
操作符。注意
$text
为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供了改进的全文查询解决方案Atlas Search。可以根据搜索相关性对结果文档进行排序,即
{ $meta: "textScore" }
,而无需同时对textScore
投影。In earlier versions, to include{ $meta: "textScore" }
expression in thesort()
, you must also include the same expression in the projection.如果在投影和排序中都包含
{ $meta: "textScore" }
表达式,即db.collection.find(<$text search>, <projection>).sort(<sort>)
,则投影和排序文档可以为该表达式使用不同的字段名称。In previous versions of MongoDB, if you include the{ $meta: "textScore" }
in both the projection and sort, you must specify the same field name in both places.
有关详细信息,请参阅文本分数元数据$meta: "textScore"
。有关"textScore"
投影和排序的示例,请参阅相关性分数示例。
事务
从含特征兼容性版本 (fcv) "4.4"
的 MongoDB 4.4 开始,除非事务是跨分片写事务,否则可以在多文档事务中创建集合和索引。
在事务中创建集合时:
您可以隐式创建一个集合,例如:
针对不存在的集合执行插入操作;
针对不存在的集合执行带有
upsert: true
的 update/findAndModify 操作。
您可以使用
create
命令或其辅助函数db.createCollection()
明确创建一个集合。如果针对系统集合执行
db.createCollection()
方法,则该方法将失败。
在事务中创建索引时:
您可以在不存在的集合上创建索引。集合作为操作的一部分创建。
您可以在先前同一事务中创建的新空集合上创建索引。
如果针对系统集合执行
db.collection.createIndex()
方法,则该方法将失败。
有关更多详细信息,请参阅在事务中创建集合和索引。
MongoDB 4.4 添加了一个新参数 shouldMultiDocTxnCreateCollectionAndIndexes
,它可以启用(默认)或禁用事务内部的集合和索引创建。为分片集群设置参数时,在所有分片上设置该参数。
要在事务内显式创建集合或索引,事务读关注级别必须为 "local"
。显式创建通过以下方式实现:
命令 | 方法 |
---|---|
排序
$sort
更改
从 MongoDB 4.4 开始,sort()
方法现在使用与 $sort
聚合阶段相同的排序算法。进行此更改后,对包含重复值的字段执行 sort()
操作的查询很可能会导致这些值的排序顺序不一致。
在对重复值使用 sort()
时,为保证排序的一致性,请在排序中加入一个只包含唯一值的附加字段。
通过在排序中添加 _id
字段可以轻松完成此操作。
有关更多信息,请参阅排序一致性。
安全改进
新的 Kerberos 验证工具 mongokerberos
MongoDB Enterprise 4.4 提供了一种新的 mongokerberos
工具,用于验证平台的 Kerberos 配置是否可用于 MongoDB,以及测试通过 Kerberos 进行的端到端客户端身份验证。运行时, mongokerberos
将返回一份报告,指出遇到的任何问题,并提供解决这些问题的潜在建议。mongokerberos
仅在 MongoDB Enterprise 中可用。
OCSP
从版本 4.4 开始,MongoDB 默认启用 OCSP(在线证书状态协议)来检查证书是否撤销。使用 OCSP 后,无需定期下载 Certificate Revocation List (CRL)
并使用已更新的 CRL 重新启动 mongod
/mongos
。
在版本 4.0 和 4.2 中,只能通过在 Windows 或 macOS 上使用 system certificate store
来使用 OCSP。
OCSP 装订/必备装订
作为 OSCP 支持的一部分,MongoDB 4.4 在 Linux 上支持以下功能:
OCSP 装订。通过 OCSP 装订,
mongod
和mongos
实例可以在 TLS/SSL 握手期间向客户端提供其证书时,将 OCSP 状态响应附加或“装订”到这些证书中。通过将 OCSP 状态响应包含在证书中,OCSP 装订可以让客户端无需发出单独请求来检索所提供证书的 OCSP 状态。OCSP 必备装订扩展 。 OCSP 必须装订是一个可以添加到服务器证书中的扩展,它告诉客户端在 TLS/SSL 握手期间接收证书时需要 OCSP 装订。
OCSP 参数
MongoDB 4.4 添加了以下 OCSP 参数。您可以使用 setParameter
配置文件设置或 --setParameter
命令行选项在启动时设置这些参数:
Parameter | 说明 |
---|---|
启用或禁用 OCSP 支持。 | |
指定在刷新装订的 OCSP 状态响应之前等待的秒数。 | |
x.509 证书即将过期触发警告
从 MongoDB 4.4 开始,如果提供的 x.509 证书在 mongod/mongos
系统时钟的 30
天内过期,则 mongod
/mongos
会记录连接上的警告。具体而言,以下与 mongod
或 mongos
的连接可能会触发 x.509 证书过期警告:
使用 MongoDB 驱动程序建立 TLS 连接或执行 x.509 客户端身份验证的
mongo
shell 或应用程序,其证书过期时间不超过 30 天。(即指定给--tlsCertificateKeyFile
或tlsCertificateKeyFile
的证书)。一个正在执行 x.509 会员身份验证且证书将于 30 天内到期的
mongod
集群节点。(即指定给net.tls.clusterFile
、net.tls.clusterCertificateSelector
、mongod --tlsClusterFile
或mongod --tlsClusterCertificateSelector
的证书)。一个正在执行 x.509 会员身份验证且证书将于 30 天内到期的
mongos
集群节点。(即指定给net.tls.clusterFile
、net.tls.clusterCertificateSelector
、mongos --tlsClusterFile
或mongos --tlsClusterCertificateSelector
的证书)。
警告日志消息类似于以下内容:
<Timestamp> W NETWORK [connection] Peer certificate <Certificate Subject Name> expires...
请考虑主动续订即将到期的客户端 x.509 证书,确保与集群的持续连接。
MongoDB 4.4 添加了用于控制证书到期警告阈值的 tlsX509ExpirationWarningThresholdDays
参数。将参数设置为 0
以禁用警告。有关完整文档,请参阅 tlsX509ExpirationWarningThresholdDays
。
TLS 1.3 支持
在 CentOS 8 和 RHEL 8 上,MongoDB 4.4(以及 4.2、4.0 和 3.6)支持 TLS1.3。
网络或身份验证失败时用户到 DN 的映射退出
如果由于联网或 LDAP 服务器身份验证失败导致无法评估某个用户与标识名 (DN) 的映射,mongod
mongos
或 mongoldap
将返回错误信息。
mongod
、mongos
或 mongoldap
拒绝连接请求,并且不检查其余映射(如果有)。
要指定用户到 DN 映射,请参阅:
结构化日志
从 MongoDB 4.4 开始,mongod
/ mongos
实例现在以结构化 JSON 格式输出所有日志消息。日志条目以一系列键值对的形式编写,每个键表示日志消息字段类型,例如“严重性”,每个对应的值记录该字段类型的关联日志信息,例如“信息”。
这包括发送到文件、syslog 和 stdout(标准输出)日志目标的日志输出,以及 getLog
命令的输出。
以前,日志条目以明文形式输出。
以下 JSON 格式的日志消息表明 mongod
正在侦听并准备连接:
{"t":{"$date":"2020-05-18T20:18:13.533+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"127.0.0.1"}} {"t":{"$date":"2020-05-18T20:18:13.533+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27001,"ssl":"off"}}
使用键值对进行结构化日志记录,可让自动化工具或日志摄取服务进行高效的日志分析,并使程序化日志解析变得更简单、更强大。
在使用 MongoDB 结构化日志时,第三方 jq 命令行实用程序 非常有用,可以轻松美观地打印日志条目,并提供强大的基于键的匹配和过滤功能。
jq
是一个开源 JSON 解析器,用于 Linux、Windows 和 macOS。
有关结构化日志的更多信息,包括对日志条目组件的详细检查以及命令行解析示例,请参阅日志消息。
多 LDAP 密码支持
从 MongoDB 4.4 开始,ldapQueryPassword
setParameter
命令接受字符串或字符串数组。如果设置为数组,则尝试每个密码,直到成功为止。执行 LDAP 帐户密码轮换,MongoDB 无需停机。
平台支持
添加平台
MongoDB 4.4 增加了对以下平台的支持:
已删除的平台
MongoDB 4.4 删除了对以下平台的支持:
Amazon Linux 2013.03
s390x 架构上的 RHEL 6 / CentOS 6 / Oracle 6
Windows 7 / 服务器 2008 R2
Windows 8 / Server 2012
Windows 8.1 / 服务器 2012 R2
macOS 10.12
如需获取 MongoDB 4.4 支持的平台和架构的完整列表,请参阅平台支持。
Mongo Shell
Mongo Shell 支持 Atlas 集群的 AWS IAM 凭证
从 MongoDB4.4 开始,mongo
Shell 支持使用 AWS IAM 凭证对已配置为 AWS IAM 身份验证的 MongoDB Atlas 集群进行身份验证。
这种身份验证方式使用新的 MONGODB-AWS
authentication mechanism
,需要提供 AWS 访问密钥 ID 和秘密访问密钥,这可以在连接字符串中指定,也可以通过 --username
和 --password
选项在命令行中指定。
此外,如果在使用 AssumeRole 请求,您使用 AWS 会话令牌通过临时凭据进行身份验证,或在使用指定此值的 AWS 资源(如 Lambda)时,您可以在连接字符串中使用 AWS_SESSION_TOKEN
authMechanismProperties
值提供该会话令牌,或在命令行中通过 --awsIamSessionToken
选项提供该会话令牌。
或者,如果 AWS 访问密钥 ID、秘密访问密钥或会话令牌是通过各自的 AWS IAM 环境变量在您的平台上定义的,则 mongo
shell 将使用这些环境变量值进行身份验证;无需在连接字符串中指定。
有关用法,请参阅连接字符串身份验证选项,以及使用 MONGODB-AWS 连接到 Atlas 集群以获取示例。
工具
迁移到 MongoDB Database Tools 项目
从 MongoDB 4.4 开始,以下工具的文档已迁移到 MongoDB 数据库工具项目:
MongoDB 数据库工具使用 Apache 许可证(版本 2.0)。有关源代码,请参阅 mongodb/mongo-tools。
注意
新的mongokerberos
Kerberos 验证工具
MongoDB Enterprise 4.4 提供了一种新的 mongokerberos
工具,用于验证平台的 Kerberos 配置是否可用于 MongoDB,以及测试通过 Kerberos 进行的端到端客户端身份验证。运行时, mongokerberos
将返回一份报告,指出遇到的任何问题,并提供解决这些问题的潜在建议。mongokerberos
仅在 MongoDB Enterprise 中可用。
请参阅 mongokerberos
参考页以了解更多信息。
mongoreplay
从 MongoDB 包装中删除
从 MongoDB 4.4 开始,mongoreplay
已从 MongoDB 包中移除。mongoreplay
及其相关文档已迁移至 mongodb-labs github 项目。mongodb-labs
中的项目是实验性的项目,并未得到 MongoDB 的官方支持。
指向较旧文档的快速链接
MongoDB Database Tools 未随 Windows MSI 打包
社区版和企业版的 Windows MSI 安装程序不包含 MongoDB Database Tools(mongoimport
和 mongoexport
等)。如要在 Windows 上下载并安装 MongoDB Database Tools,请参阅安装 MongoDB Database Tools。
如果您使用 MongoDB 4.2 或以前的 MSI 安装程序,要将Database Tools 与 MongoDB Server 一起安装,现在必须单独下载 Database Tools。
驱动程序
新驱动程序
官方 MongoDB Rust 驱动程序现已发布。
MongoDB Swift 驱动程序官方版本现已发布。
索引
复合哈希索引
MongoDB 4.4 增加了对使用单个哈希字段创建复合索引的支持。MongoDB 4.2 及更早版本仅支持单字段哈希索引。
以下操作会在 country
和 _id
上上创建组合哈希索引:
db.examples.createIndex( { "country" : 1, "_id" : "hashed" } )
复合哈希索引需要将 featureCompatibilityVersion 设置为 4.4
。
Hidden Indexes
从版本 4.4 开始,MongoDB 添加了对查询规划器隐藏或取消隐藏索引的功能。向查询规划器隐藏的索引不会作为查询计划选择的一部分进行求值。
通过向规划器隐藏索引,用户可以评估在不实际删除索引的情况下删除索引的潜在影响。如有不利影响,您可以取消隐藏该索引,而不必重新创建删除的索引。由于索引在隐藏期间得到完全维护,因此一旦取消隐藏,索引就立即可用。
有关详情,请参阅隐藏索引。
为了支持隐藏索引,MongoDB 引入了:
新的索引选项
hidden
。可以在以下操作中指定该选项:用于隐藏或取消隐藏现有索引的新
mongo
Shell 助手方法:
dropIndexes
可以中止正在进行的索引构建
如果为 dropIndexes
指定的索引仍在构建中,dropIndexes
会尝试中止正在进行的构建。中止索引构建与删除构建的索引具有相同的效果。在 MongoDB 4.4之前,如果集合中有任何正在进行的索引构建,dropIndexes
将会返回错误。此行为也适用于 shell 助手 db.collection.dropIndex()
和 db.collection.dropIndexes()
。
为
dropIndexes
/dropIndexes()
指定的索引必须是与给定的索引生成器相关联的整个正在构建的索引集,即通过单个createIndexes
或db.collection.createIndexes()
操作构建的索引。指定给
dropIndex()
的索引必须是与索引生成器相关的唯一索引,即由单个createIndexes
或db.collection.createIndexes()
操作构建的索引。
要从一组正在进行的相关构建中删除特定索引,请等待索引构建完成,并将该索引指定为 dropIndexes
或其 shell 助手。
有关更完整的文档,请参阅:
停止正在进行的索引生成,以执行
dropIndexes
命令。停止正在进行的索引生成,以执行
dropIndexes()
方法。停止正在进行的索引生成,以执行
dropIndex()
方法。
drop()
可以中止正在进行的索引构建
在删除目标集合之前,db.collection.drop()
方法和 drop
命令会中止目标集合上任何正在进行的索引构建。
对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort
oplog 条目。从节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。
对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort
oplog 条目。从节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。
dropDatabase
可以中止正在进行的索引构建
db.dropDatabase()
方法和 dropDatabase
命令将会先中止在目标数据库中的集合上构建的任何正在进行的索引,然后再丢弃数据库。中止索引构建与删除构建的索引具有相同的效果。
弃用geoHaystack
索引和geoSearch
命令
MongoDB 4.4 弃用了 geoHaystack 索引和 geoSearch
命令。请改用带有 $geoNear
或 $geoWithin
的 2d 索引。
已删除的命令
MongoDB 删除了以下命令和 mongo
shell 助手:
已删除的命令 | 已删除助手 | 替代方案 |
---|---|---|
cloneCollection | db.cloneCollection() |
|
planCacheListPlans | PlanCache.getPlansByQuery() |
See also $planCacheStats Changes. |
planCacheListQueryShapes | PlanCache.listQueryShapes() |
See also $planCacheStats Changes. |
网络
支持 TCP 快速打开
从 MongoDB 4.4 开始,mongod
和 mongos
默认支持 TCP 快速打开 (TFO) 连接。TFO 需要客户端和 mongod/mongos
主机支持并启用 TFO:
- Windows
以下 Windows 操作系统支持 TFO:
Microsoft Windows Server 2016 及更高版本。
Microsoft Windows 10 更新 1607 或更高版本。
- macOS
- macOS 10.11 (El Capitan) 及更高版本支持 TFO
- Linux
运行 Linux Kernel 3.7 或更高版本的 Linux 操作系统可以支持入站 TFO 连接。
运行 Linux Kernel 4.11 或更高版本的 Linux 操作系统可以支持入站和出站 TFO 连接。
设置
/proc/sys/net/ipv4/tcp_fastopen
的值以启用对入站和/或出站 TFO 连接的支持:设置为
1
以仅启用出站 TFO 连接。设置为
2
以仅启用入站 TFO 连接设置为
3
以启用入站和出站 TFO 连接。
MongoDB 4.4 添加了以下参数来控制 TFO:
Parameter | 说明 |
---|---|
默认值: 启用或禁用对入站 TFO 连接的支持
| |
默认值: 仅 Linux 操作系统 启用或禁用对来自 | |
默认值: 控制待处理的 TFO 连接队列的大小。 |
MongoDB 4.4 会在 serverStatus
和 db.serverStatus()
的输出中添加以下计数器:
计数器 | 说明 |
---|---|
仅 Linux 表示内核对 TFO 的支持。 | |
表示操作系统支持传入 TFO 连接。 | |
指示操作系统支持传出 TFO 连接。 | |
对 TFO 的完整讨论超出了本文档的范围。有关 TFO 的更多信息,请参阅以下外部资源:
总体改进
阻塞排序限制增加
如果 MongoDB 无法使用一个或多个索引来获取给定 cursor.sort()
操作的排序顺序,则 MongoDB 必须对数据执行阻塞排序。阻塞排序表示 MongoDB 必须在返回结果之前消耗并处理排序的所有输入文档。阻塞排序不会阻塞对集合或数据库的并发操作。
MongoDB 4.4 之前,如果阻塞排序操作需要超过 32 MB 的系统内存,则 MongoDB 将返回错误。从 MongoDB 4.4 开始,阻塞排序操作会将用于排序操作的系统内存限制增加到 100 MB。对于需要超过 100 MB 系统内存的阻塞排序操作,除非查询指定了 cursor.allowDiskUse()
,否则 MongoDB 会返回错误(MongoDB 4.4 新增)。
有关排序和索引使用的更多信息,请参阅排序和索引使用。
find
可以使用临时文件来支持大型非索引排序
MongoDB 4.4 在 find
命令中添加新选项 allowDiskUse。借助 allowDiskUse: true,在处理超过 100 兆字节内存限制的非索引(“blocking”)排序操作时,操作可以使用磁盘上的临时文件。在 MongoDB 4.4 之前,如果在处理排序过程中超过了内存限制,那么含阻塞排序的 find
操作就会失败。
针对含 db.collection.find()
的cursor.sort()
shell 方法,MongoDB4.4 添加了 cursor.allowDiskUse()
光标修饰符。
如果 MongoDB 可以使用索引满足排序要求,或者阻塞排序需要的内存少于 100 MB,allowDiskUse 和 cursor.allowDiskUse()
将不会产生任何影响。
有关如何为通过 MongoDB 驱动程序发出的查询启用 allowDiskUse 的说明,请参考您所选择的兼容 MongoDB 4.4 的驱动程序文档。
集合命名空间限制
从 MongoDB 4.4 开始,
未分片集合和视图的命名空间长度限制为 255 字节,分片集合的命名空间长度限制为 235 字节。对于集合或视图,命名空间包括数据库名称、点 (.
) 分隔符和集合/视图名称(如 <database>.<collection>
)。
验证数据吞吐量信息
$currentOp
和 currentOp
命令包含用于正在进行的验证操作的 dataThroughputAverage
和 dataThroughputLastSecond
信息。
验证操作的日志消息包括 dataThroughputAverage
和 dataThroughputLastSecond
信息。
compact
行为变更
阻塞
从 MongoDB 4.4 开始,compact
仅阻塞以下元数据操作:
compact
不会阻止其当前正在运行的数据库的 MongoDB CRUD 操作。
以前,compact
会阻止其运行的数据库的所有操作,包括 MongoDB CRUD 操作,因此只适合在计划维护期间使用。
force
选项
从 MongoDB 4.4 开始,force
标记会强制 compact
在副本集中的主节点上运行。
先前,force
选项设置为 true
时,compact
可以在副本集中的主节点上运行,若其设置为 false
,则在主节点上运行时会返回错误信息。
mongod --repair
行为变更
从 MongoDB 4.4 开始,mongod --repair
会为以下内容重建所有索引:
集合数据与一个或多个索引不一致的集合。
已修复和修改的集合。
在 MongoDB 的早期版本中,mongod --repair
选项会为所有集合重建所有索引。
serverStatus
输出变化
字段名称更改
serverStatus
返回 flowControl.locksPerKiloOp
而不是 flowControl.locksPerOp
。
新字段
serverStatus
在其输出中包含以下新字段:
聚合指标
metrics.aggStageCounters
(也适用于 4.2.6+ 和 4.0.19+)
连接指标
默认读关注写关注指标
闩锁指标
latchAnalysis
镜像读取指标
查询执行指标
复制指标
网络指标
安全指标
分片指标
serverStatus
分片统计信息输出更改
shardingStatistics.numHostsTargeted
报告 CRUD 操作和聚合命令所针对的分片数量。它会在集群上的每个操作中递增相关的查找、插入、更新、删除或聚合指标。
replSetGetStatus
输出变化
replSetGetStatus
返回以下新字段:
db.auth() 可以提示输入密码
从 MongoDB 4.4 开始,如果不输入密码,mongo
shell 方法 db.auth(<username>, <password>)
会提示输入密码;如果不输入密码,<password>
的 passwordPrompt()
方法也会提示输入密码。
支持$natural
对视图进行排序
支持生成诊断回溯
对于在 Linux 上运行的 MongoDB 实例:
回溯功能可用于以下架构:
x86_64
arm64
(从 MongoDB 5.0.10 和 6.0 开始)
有关更多信息,请参阅生成回溯。
容器感知 FTDC 报告
从 MongoDB 4.4 开始,FTDC 现在可以从容器(而不是主机操作系统)的角度报告容器中运行的 mongod
的利用率数据。更多信息,请参阅全时诊断数据捕获 。
更新了ulimit
启动警告
从 MongoDB 4.4 开始,如果平台配置的打开文件数的 ulimit
值低于64000
,则 mongod
将会记录启动警告。以前,只有当该值低于 1000
时才会记录警告。有关更多信息,请参阅推荐的 ulimit
设置。
replanReason
新的 数据库分析器输出字段
MongoDB 4.4 将 replanReason
字段添加到数据库分析器输出和诊断日志消息中。replanReason
字段包含查询系统逐出缓存计划的原因。
dbStats
和collStats
输出
dbStats
命令及其 mongo
Shell 助手 db.stats()
返回:
collStats
命令、其mongo
Shell 助手 db.collection.stats()
和 $collStats
聚合阶段返回:
freeStorageSize
,即为可重复使用的存储量。
可提供用于其他数据库命令的提示
从 MongoDB 4.4 开始,以下数据库命令可以接受 hint
参数来指定要使用的索引:
delete
命令及相关的mongo
shell 方法db.collection.deleteOne()
和db.collection.deleteMany()
。findAndModify
命令和相关的mongo
shell 方法:
请参阅:
JavaScript 执行于 mongos
从 MongoDB 4.4 开始,MongoDB 允许在 mongos
实例上执行 JavaScript。如要在 mongos
实例上禁用 JavaScript 执行:
将
security.javascriptEnabled
配置选项设置为 false,或者指定
--noscripting
命令行选项。
在早期版本中,MongoDB 不允许在 mongos
实例上执行 JavaScript。
全局默认读关注和写关注
注意
需要 featureCompatibilityVersion 4.4+
副本集或分片群集中的每个 mongod
都必须将 featureCompatibilityVersion 设置为至少 4.4
,才能配置全局默认读关注和写关注。
从 MongoDB 4.4 开始,副本集和分片集群支持配置全局默认读写关注设置。未显式指定给定读关注或写关注设置的客户端会继承相应的全局默认设置。
为了配置默认的全局默认读取或写关注,MongoDB 添加了 setDefaultRWConcern
管理命令。对于副本集,请针对主节点成员发出命令。对于分片集群,请从 mongos
发出命令。
为了检索全局默认读取或写关注设置,MongoDB 添加了 getDefaultRWConcern
管理命令。
读关注来源
从 MongoDB 4.4 开始,读关注对象可能包含一个 provenance
字段,指示读关注的来源。
下表显示了可能的读关注 provenance
值及其重要性:
来源 | 说明 |
---|---|
clientSupplied | 应用程序中指定了读关注问题。 |
customDefault | 读关注源于一个自定义的默认值。参见 setDefaultRWConcern 。 |
implicitDefault | 由于没有其他写关注规范,写关注源自服务器。 |
如果记录或分析读取操作,则操作条目包含读关注对象,包括 provenance
字段。
MongoDB 不建议在向服务器发出的请求中指定 provenance
字段。此字段只能用于诊断目的。
写关注来源
从 MongoDB 4.4 开始,写关注对象可以包含一个 provenance
字段,指示写关注的来源。
下表显示了可能的写关注 provenance
值及其重要性:
来源 | 说明 |
---|---|
clientSupplied | 应用程序中指定了写关注。 |
customDefault | 写入关注源自自定义的默认值。请参阅 setDefaultRWConcern 。 |
getLastErrorDefaults | 写关注源自副本集的 settings.getLastErrorDefaults 字段。 |
implicitDefault | 在没有所有其他写入关注规范的情况下,写入关注源自服务器。 |
如果记录或分析了写入操作,则操作条目将包含写关注对象,包括 provenance
字段。
MongoDB 不建议在向服务器发出的请求中指定 provenance
字段。此字段只能用于诊断目的。
currentOp
输出
$currentOp
在报告正在进行的验证操作时包括dataThroughputAverage
和dataThroughputLastSecond
信息。currentOp
命令在报告正在进行的验证操作时包括dataThroughputAverage
和dataThroughputLastSecond
信息。
新的 KMIP 连接参数 mongod
MongoDB 4.4 Enterprise 引入了两个新的配置设置来增强与 KMIP 服务器的初始连接,作为 Kerberos 身份验证的一部分:
连接重试
要控制 mongod
重试与 KMIP 服务器的初始连接失败的次数,请执行以下操作:
设置
security.kmip.connectRetries
配置选项,或者指定
mongod --kmipConnectRetries
命令行选项。
连接超时
控制等待 KMIP 服务器初始响应的超时时间(以毫秒为单位),然后再放弃或重试:
设置
security.kmip.connectTimeoutMS
配置选项,或者指定
mongod --kmipConnectTimeoutMS
命令行选项。
这些设置仅适用于 MongoDB Enterprise。
新的初创企业选项 mongod
当 honorSystemUmask
设置为 false
时,mongod
新增的 processUmask
启动选项允许您通过 umask 为群组和其他用户设置权限。
mapReduce
忽略verbose
选项
从 MongoDB 4.4 开始,mapReduce
命令和 db.collection.mapReduce()
shell 方法会忽略 verbose 选项。
explain
支持 mapReduce
从 MongoDB 4.4 开始,您可以使用 explain
命令或 db.collection.explain()
shell 方法来预览 mapReduce
或 db.collection.mapReduce()
的结果。
对 结果的改进explain
从版本 4.4 开始:
在分片集群上运行的命令的 解释结果 包括 的顶级 serverInfo
mongos
serverInfo
对象以及为每个分片返回的 对象。这在版本 4.2.2、4.0.14 和 3.6.16 中也可用。当
optimizedPipeline
为 时, 解释结果 包括 serverInfotrue
对象。在 MongoDB 的早期版本中,当optimizedPipeline
为true
时,explain
结果有时不包含serverInfo
对象。 这在版本 4.2.2、4.0.14 和 3.6.16 中也可用。当您在
executionStats
和allPlansExecution
模式下运行db.collection.explain().aggregate()
方法时,聚合的解释结果包括每个管道阶段的nReturned
和executionTimeMillisEstimate
字段。
comment
适用于所有数据库命令的选项
从 MongoDB 4.4 开始,所有数据库命令都支持按以下方式指定 comment
字段:
例子
db.runCommand( { <command> , "comment" : <any BSON type> })
设置后,该注释将与该命令的记录一起出现在以下位置:
mongod 日志消息,位于
attr.command.cursor.comment
字段中。command.comment
字段中的数据库分析器输出。currentOp
输出,在command.comment
字段。
注释必须是有效的 BSON 对象(string、整数、数组等)。
对位置 操作符的改进$
从 MongoDB 4.4 开始,当使用位置 $
操作符时,您可以在查询文档和投影文档之间指定不同的数组字段。
例如,如果将以下文档插入到集合中:
db.foo.insertOne( { a: [ "one", "two", "three" ], b: [ 1, 2, 3 ] } )
从 MongoDB 4.4 开始,对于与字段 a
上指定的查询匹配的文档,您可以使用以下查询仅投影字段 b
中的第一个元素:
db.foo.findOne( { a: "one" }, { "b.$": 1 } )
重要
为确保达到预期行为,查询文档和投影文档中使用的数组必须具有相同长度。 如果数组的长度不同,在某些情况下操作可能会出错。
在 MongoDB 以前的版本中,该操作会失败,因为被限制的数组字段必须出现在查询文档中。
影响兼容性的变更
有些更改会影响兼容性,可能需要用户执行操作。如需兼容性变更的详细列表,请参阅 MongoDB 4.4 中的兼容性变更。
升级程序
重要
特征兼容性版本
要从 4.2 部署升级,4.2 部署必须将 featureCompatibilityVersion
设置为 4.2
。若要检查版本,您可以:
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
有关验证和设置 featureCompatibilityVersion
的具体详细信息,以及升级的其他先决条件/注意事项的详细信息,请参阅各个升级说明:
如需有关升级到 4.4 的指导,MongoDB 专业服务提供主要版本升级支持,帮助您顺利过渡,不会中断您的 MongoDB 应用程序。
降级考虑因素
MongoDB 仅支持单版本降级。您无法降级到比当前版本落后多个版本的版本。
例如,您可以将 4.4 系列降级为 4.2 系列部署。但是,不支持进一步降级该 4.2 系列部署到 4.0 系列部署。
立即下载
要下载 MongoDB 4.4,请访问 MongoDB 下载中心。
已知问题
版本中 | 问题 | 状态 |
---|---|---|
4.4.0 | 未解决 | |
4.4.0 | 已在 4.4.1 中修复 | |
4.4.0 | WT-6623:设置恢复文件扫描中的连接级别文件 ID | 已在 4.4.1 中修复 |
报告问题
如要报告问题,请参阅 https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports有关如何为 MongoDB 服务器或相关项目之一提交 JIRA 工单的说明,请参阅