MongoDB 7.0新特性概览

本文介绍云数据库 MongoDB 版7.0版本推出的新特性和优化项。

速览

本文将从以下方面介绍云数据库 MongoDB 版 7.0版本:

MongoDB 7.0的更多新特性以及优化项,请参见MongoDB 7.0 release-notes

可查询加密(Queryable Encryption)

MongoDB 6.0版本中,可查询加密功能为预览(Preview)版本,该功能在MongoDB 7.0版本中正式发布(Generally Available),更多信息请参见Queryable Encryption

支持分片元数据一致性校验

MongoDB 7.0版本中新增了checkMetadataConsistency命令,以检查不同分片中元数据不一致的情况,示例如下。

示例1:

// Command
db.runCommand( {
   checkMetadataConsistency: 1,
   checkIndexes: true
} )

示例2:

//mongosh
db.checkMetadataConsistency()
db.collection.checkMetadataConsistency()
sh.checkMetadataConsistency() 

您可以在日常运维中增加该巡检项,尽早发现可能不一致的风险。更多信息请参见checkMetadataConsistency

支持采样查询与分析分片键(analyzeShardKey)

支持基于采样查询(Sampled queries)的结果来分析集合的分片键是否合理,可以帮助您更好地设计Schema以及分片键、更合理使用分片架构。核心命令analyzeShardKey的语法如下:

db.adminCommand(
   {
     analyzeShardKey: <string>,
     key: <shardKey>,
     keyCharacteristics: <bool>,
     readWriteDistribution: <bool>,
     sampleRate: <double>,
     sampleSize: <int>
   }
 )
说明

尽管该命令并不会阻塞集合上的读写操作,但为了降低对业务的影响,建议配套使用secondarysecondaryPreferred模式的Read preference执行。mongos默认为secondaryPreferred模式。

更多信息请参考analyShardKeyconfigureQueryAnalyzer

自动合并(AutoMerger)

MongoDB 7.0为自动均衡器(Balancer)实现了一个新的自动合并器(AutoMerger),当数据或索引分布不均衡、存在过多分片或进行数据迁移时,自动合并器会合并Chunks,以均衡数据并提高性能。MongoDB 7.0默认开启该功能,您也可以通过Balancer活动窗口的控制该功能。

之前版本引入用于单个集合数据均衡的configureCollectionBalancing命令也支持了AutoMerge:

db.adminCommand(
   {
     configureCollectionBalancing: "<db>.<collection>",
     chunkSize: <num>,
     defragmentCollection: <bool>,
     enableAutoMerger: <bool>
   }
)

除此之外,您也可以通过mergeAllChunksOnShard命令将一个分片上所有可合并的Chunk(或Range)进行手动合并:

db.adminCommand( { mergeAllChunksOnShard: "db.coll", shard: "Shard0" } )

分片(Sharding)

除了上文提到过的AutoMerger以外,还有以下优化项:

  • 支持通过参数rangeDeleterHighPriority设置删除孤儿文档是否具备更高的优先级。通常业务的删除往往具有更高的优先级, 所以该参数默认为false

  • 不再支持用于记录目录缓存刷新行为的operationsBlockedByRefresh监控指标,原因为基于mongos每个利用集合路由信息的操作都会增加该计数器的次数。

  • 新增关于Resharding的监控指标。

  • addShard命令不再支持maxSize选项。

  • 调整config.settings集合的chunksize时,增加了合理性校验,将值限制在[1,1024]。

  • MongoDB6.0.3版本后对Balancer策略进行若干调整:

    • Balancer不再依据分片间Chunks数量的差异,而是依据分片间数据量的差异进行均衡。

    • Chunk的逻辑概念转为Range。

    • 自动分裂(auto-splitting)只会在跨分片移动时发生。

安全性

  • 支持KMIP 1.01.1。

  • 支持OpenSSL 3.0以及OpenSSL FIPS。

聚合(Aggregation)

新增了以下操作符,支持位计算和百分位数:

字段名

描述

$bitAnd

返回IntLong类型数值的按位与运算的结果。

$bitNot

返回IntLong类型数值的按位取反运算结果。

$bitOr

返回IntLong类型数值的按位或运算的结果。

$bitXor

返回IntLong类型数值的按位异或运算的结果。

$median

返回近似中位数,相当于50百分位数。

$percentile

返回指定的百分位数。

时序集合(Time-Series Collection)

  • 移除了之前版本对于时序集合DELETE命令的操作限制。除了不能在多文档事务中使用相关删除命令外,当前DELETE命令再无其他限制。

  • COMPACT命令支持时序集合。

其他优化

  • 慢日志新增了catalogCacheIndexLookupDurationMillis等字段,更多信息请参见log messages for slow queries

  • 支持动态调整存储引擎事务并发度,之前默认是128,从MongoDB 7.0起,MongoDB会自动动态调整该并发度,更多信息请参见Concurrent Storage Engine Transactions

  • currentOp新增了关于query sampling的全新字段,更多信息请参见currentop-metrics

  • 支持复合通配符索引,更多信息请参见Compound Wildcard Indexes

  • 新增$changeStreamSplitLargeEvent算子支持对超过16 MB的超大变更事件(change events)进行切分,更多信息请参见Large Change Stream Events

  • 优化基于Slot查询执行引擎的性能。

  • 新增Chunk迁移的指标,更多信息请参见New Sharding Statistics for Chunk Migrations

  • 支持通过USER_ROLES系统变量来获取当前User的角色。

  • 新增analyzeShardKeybalancerqueryAnalyzers相关的全局参数。

  • serverStatus的返回结果新增更多字段,更多信息请参见serverStatus Output Change