本文介绍 MongoDB 4.4 版本的主要新特性。
从 MongoDB 4.4 版开始,当 mongod 或 mongos 中的全时诊断数据采集(Full Time Diagnostic Data Capture,简称 FTDC) 线程发生故障时,系统会终止发起进程。更多详情,请参见 Full Time Diagnostic Data Capture (FTDC)。
MongoDB 4.4 版本中引入了 refineCollectionShardKey
命令来优化集合的分片键,该命令允许您通过 refineCollectionShardKey
命令在现有分片键中添加一个或多个后缀字段,来实现更细粒度的数据分发。更多详情,请参见 refineCollectionShardKey。
为减少数据读取延迟, MongoDB 4.4 版支持 Hedged Reads 功能,即在分片集群场景下,mongos 节点会把一个读请求同时路由到所查询分片下的多个节点中,并将响应最快的查询结果返回给客户端。您可以在分片集群的 Read Preference
字段中将参数 readHedgingMode
设置为 on
。更多详情,请参见 hedged reads 和 Read Preference for Sharded Clusters。
MongoDB 4.4 版本引入了复合哈希索引,允许在复合索引中指定单个哈希字段,从而提供了复合哈希片键的支持,来帮助集合数据在分片之间的均匀分布,简化业务逻辑的复杂性。更多详情,请参见 Compound Hashed Indexes。
MongoDB 4.4 版本支持隐藏索引(Hidden Indexes)功能,您可以通过 collMod
命令来隐藏已有的索引,设置隐藏之后,这些索引不会被查询计划所选择,从而帮助您评估删除该索引的影响。如果索引隐藏之后影响了线上业务,您可以取消隐藏,索引即可立刻可用。更多详情,请参见 Hidden Indexes。
MongoDB 4.4 之前的版本,从节点需要先向主节点发送读取请求并等待主节点响应后,才能获取一批 Oplog 数据。通过这种方式获取 Oplog 时,每次都需要经历一个完整的网络往返时间 RTT(Round-Trip Time)。但从 4.4 版本开始,MongoDB 从节点无需发起请求,主节点就可以持续地向从节点发送 Oplog,这种 Oplog 同步方式称为流式复制。流式复制可以在高负载和高延迟网络环境中,减少复制延迟。您可以通过 oplogFetcherUsesExhaust 参数开启流式复制功能。更多详情,请参见 Streaming Replication。
MongoDB 4.4 之前的版本,需要先等主节点索引创建完成后,从节点上才能创建。从 MongoDB 4.4 版本开始,主节点和从节点可以同时执行索引创建操作,这样可以大幅减少主从延迟事件,也可以保证即使在索引创建过程中,从节点仍然能够访问到最新的数据。更多详情,请参见 Index Builds in Replicated Environments。
MongoDB 4.4 版本提供了镜像读取功能,即主节点会按一定的比例将读流量复制到从节点上执行,帮助从节点预热缓存。这是一个非即发即弃(Fire and Forgot)的行为,不会对主节点的性能产生任何实质性的影响,但会在一定程度上增加从节点的负载。您可以通过 samplingRate
和 maxTimeMS
参数来设置流量复制的比例。更多详情,请参见 mirrorReads。
MongoDB 4.4 之前的版本,如果从节点在做全量同步时由于网络抖动而出现连接闪断,那么需要重新开始整个全量同步,当数据量较大时,这种情况会严重影响业务。但从 MongoDB 4.4 版本开始,支持从中断位置继续执行同步。如果闪断后一直无法连接成功,系统会重新选择一个可用同步源进行新的全量同步。您可以通过replication.initialSyncTransientErrorRetryPeriodSeconds
参数设置该过程的超时时间。关于该参数的更多详情,请参见 MongoDB Server Parameters。
MongoDB 的 Oplog 记录了所有数据变更详情,可用于数据同步、增量备份、数据迁移、数据订阅等场景。从 MongoDB 4.4 版本开始,您可以通过 mongod 配置文件中的 storage.oplogMinRetentionHours
参数来定义Oplog 的最短保留时长,或通过 oplogMinRetentionHours
命令在线修改 Oplog 的最短保留时长。更多详情,请参见 Minimum Oplog Retention Period。
MongoDB 4.4 版本支持在多表联合查询中添加 $unionWith
stage,可以将两个集合中的数据聚合到一个结果中。$unionWith stage
支持分片集合,您可以在 Aggregate Pipeline 中使用多个 $unionWith stage
,实现对多个集合数据做聚合。更多详情,请参见 $unionWith。
MongoDB 4.4 版本提供了两个新的运算符: $accumulator
和 $function
,您可以通过上述两个运算符,使用聚合来编写自定义 JavaScript 脚本,实现更复杂的查询能力。更多详情,请参见 Map-Reduce to Aggregation Pipeline。