本文介绍云数据库MongoDB支持的版本、引擎及版本和引擎之间的适配关系,帮助您选择适合您的业务需求的实例。
支持版本
云数据库MongoDB支持如下版本:
您可以在实例运行期间手动升级数据库版本,但版本升级后不支持降级。详情请参见升级数据库版本。
存储引擎
存储引擎 | 适用场景 | 说明 |
存储引擎 | 适用场景 | 说明 |
WiredTiger | 默认存储引擎,适用于大多数业务场景。 | 基于BTree结构组织数据,相比MongoDB早期的MMAPv1存储引擎性能提升明显,且支持数据压缩,存储成本更低。 |
RocksDB(已下线) | 适用于大量写且少读的场景。 | 基于LSM tree结构组织数据,针对性优化数据写入,将随机写入转换成了顺序写入,能保证持续高效的数据写入。 |
TerarkDB(已下线) | 适用于多读少写或批量写大量读的场景。 | 借助TerarkDB的全局压缩技术,在提高压缩率的同时,能大幅提高随机查询的性能。 |
版本和存储引擎的适配关系
存储引擎 | 4.4及以上版本 | 4.2版本 | 4.0版本 | 3.4版本(已停售) |
存储引擎 | 4.4及以上版本 | 4.2版本 | 4.0版本 | 3.4版本(已停售) |
WiredTiger |
|
|
|
|
RocksDB(已下线) | - | - | - |
|
TerarkDB(已下线) | - | - | - | 分片集群实例 |
MongoDB 8.0版本说明
新推出升级版TCMalloc、优化复制性能、优化reshard性能等功能,并在分片、日志、聚合、安全性等方面进行了增强优化。
升级版TCMalloc
升级版TCMalloc会使用每个CPU的缓存(而不是每个线程的缓存),以减少内存碎片并使数据库更能适应高压力工作负载。同时,升级版TCMalloc使用时会在后台创建一个线程,每秒尝试将内存释放回操作系统。
复制性能
从MongoDB 8.0版本开始,
writeConcern
为majority
时,MongoDB会在大多数副本集成员已经写入了相关的oplog后就返回确认,而不是等待应用这个更改后才返回,此更改提高了majority
模式下写入的性能。Secondary节点会并行写入和应用每个批次的oplog内容。当Writer线程从主节点读取新的oplog条目并将其写入本地oplog时,Applier线程会异步将这些更改应用到本地数据库。此更改提高了Secondary节点的复制吞吐量。
reshard性能
MongoDB 8.0版本支持了forceRedistribution选项,允许使用和之前相同的分片键对集合进行重新分片,将数据重新分配到新的分片上。这个过程相比Chunk进行范围迁移要快很多,还可以与zones选项搭配将数据迁移到特定区域。
分片
哈希分片会默认为每个分片创建1个Chunk(MongoDB 8.0版之前是默认2个)。
dbhash
命令可以直接在分片上运行。findAndModify
和deleteOne
命令可以使用部分Shard Key作为查询条件。在一个已经分片的集合上使用
upsert
为true
的updateOne
命令时,查询条件中可以不包含所有的Shard Key。支持通过
unshardCollection
命令或sh.unshardCollection()
方法取消现有集合的分片,此操作会将集合中的所有文档移动到指定的分片或数据量最少的分片上。支持通过
moveCollection
命令将某一个未分片的集合移动到指定的分片上,不必约束于Primary Shard。但时间序列集合和可查询加密集合不可移动,且可能会有2秒左右的集合写入阻塞。提供了新的数据库命令和mongosh帮助函数:
命令
mongosh帮助函数
说明
命令
mongosh帮助函数
说明
moveCollection
sh.moveCollection()
将一个未分片的集合移至某个Shard。
unshardCollection
sh.unshardCollection()
取消对现有分片集合的分片,并将集合数据移至某个Shard。
abortMoveCollection
sh.abortMoveCollection()
停止正在进行的
moveCollection
操作。abortUnshardCollection
sh.abortUnshardCollection()
停止正在进行的
unshardCollection
操作。无
sh.shardAndDistributeCollection()
对集合进行分片,并使用提供的分片键立即重新分配数据。
运行该帮助函数与连续运行
shardCollection
和reshardCollection
的结果相同,目的是加快数据移动速度。
日志记录
慢日志中添加了
workingMillis
字段,用于展示实际执行操作所花费的时间。区别于之前的
durationMillis
操作总延迟,workingMillis
不会包含锁等待或流量控制等因素消耗的时间。聚合
binData转换
您可以使用$convert运算符执行以下转换:
字符串值转换为binData值。
binData值转换为字符串值。
另外,$toUUID表达式提供了将字符串转换为UUID值的简化语法。
$queryStats
$queryStats阶段会返回已记录查询的统计数据,且优化了在Change Stream中的跟踪和报告指标。
安全
可查询加密
支持使用
$lt
、$lte
、$gt
、$gte
对加密字段进行范围查询。入口队列
MongoDB 8.0引入了一个新的队列用于入口准入控制(
_ticketHolder
),即从网络进入数据库的操作将进入入口队列。入口队列默认情况下不进行限制,您可以自定义队列最大值使得请求进行排队。
其他优化
引入了一种新的Query Shape,此前的Query Shape被称为Plan Cache Query Shape,同时查询优化器会将Query Settings作为附加的输入信息,影响最终的查询计划选择。
setQuerySettings添加查询设置:
可用于指定索引选择,8.0版本弃用了使用
planCacheSetFilter
来设置index filter
的方式。可用于限流设置,您可以通过
reject
选项设置拒绝某个Query Shape。
removeQuerySettings
用于删除查询设置。$querySettings
用于查看查询设置。
explain()
命令现在会通过queryPlanner.optimizationTimeMillis
返回查询计划用在优化上的时间,单位为毫秒。新增
defaultMaxTimeMS
参数,用于指定单个读取操作完成的默认时间限制,单位为毫秒。适用的操作:
find
aggregate
(不包括$merge
和$out
阶段)count
distinct
dbHash
如果客户端指定了
maxTimeMS
,那么defaultMaxTimeMS
对此操作将不再生效。
新增
bulkWrite
命令,可以在一个请求中对多个集合执行多条插入、更新、删除操作。updateOne
支持对sort
选项进行排序。支持在Capped Collection上创建TTL索引。
非事务的批量插入不会再生成单独的oplog,而是放到一个oplog中进行批处理,所有插入的文档在Change Stream事件中有相同的
clusterTime
。此改动提高了批量插入的性能,避免从节点回放多条oplog可能导致的复制延迟。支持对同一数据库下的不同集合并发执行DDL操作。
在集群执行DDL操作(如
reshardCollection
这种会修改集合的命令)的过程中添加或删除分片会被阻塞,您只能在DDL操作后执行。改进了索引构建,返回错误报告的速度更快,故障恢复能力更强。
行为
MongoDB 8.0版本
MongoDB 8.0之前版本
行为
MongoDB 8.0版本
MongoDB 8.0之前版本
发现错误停止构建索引的时机
在收集扫描阶段发现的索引错误(重复键错误除外)会立即返回,然后索引构建停止。
MongoDB 8.0可帮助您快速诊断索引错误。例如,如果发现不兼容的索引值格式,则会立即将错误返回给您。
MongoDB 8.0之前版本在收集扫描阶段发现的索引错误会在提交阶段返回错误,提交阶段发生在索引构建的末尾。
与MongoDB 8.0相比,索引构建错误可能需要很长时间才能返回,因为错误是在提交阶段索引构建结束时返回的。
弹性部署
提高部署的弹性。如果发生索引构建错误,辅助成员可以请求主成员停止索引构建,并且辅助成员不会崩溃。
停止索引构建的请求并不总是可行的,如果成员已经投票提交索引,则辅助成员无法请求停止索引构建,并且辅助成员会崩溃(类似于MongoDB 7.0及更早版本)。
索引构建错误可能导致辅助成员崩溃。
磁盘空间
改进了索引构建的磁盘空间管理。如果可用磁盘空间低于
indexBuildMinAvailableDiskSpaceMB
参数中指定的最小值,索引构建可能会自动停止。如果成员已经投票同意提交索引,则索引构建不会停止。
可用磁盘空间不足时,也会停止索引构建。
MongoDB 7.0版本说明
新推出可查询加密(Queryable Encryption)、分片元数据一致性校验、采样查询与分析分片键(analyzeShardKey)和自动合并(AutoMerger)功能,并在分片(Sharding)、时序集合(Time-Series Collection)、聚合(Aggregation)和安全性等方面进行了增强优化。
可查询加密
在MongoDB 6.0版本中,可查询加密功能为预览(Preview)版本,该功能在MongoDB 7.0版本中正式发布(Generally Available),更多信息请参见Queryable Encryption。
分片元数据一致性校验
MongoDB7.0版本中新增了checkMetadataConsistency命令,以检查不同分片中元数据不一致的情况。您可以在日常运维中增加该巡检项,尽早发现可能不一致的风险。更多信息请参见checkMetadataConsistency。
采样查询与分析分片键
支持基于采样查询(Sampled queries)的结果来分析集合的分片键是否合理,可以帮助您更好地设计Schema以及分片键、更合理使用分片架构。更多信息请参见analyShardKey与configureQueryAnalyzer。
自动合并
MongoDB 7.0为自动均衡器(Balancer)实现了一个新的自动合并器(AutoMerger),当数据或索引分布不均衡、存在过多分片或进行数据迁移时,自动合并器会合并Chunks,以均衡数据并提高性能。MongoDB 7.0默认开启该功能,您也可以通过Balancer活动窗口的控制该功能。
分片
支持通过参数
rangeDeleterHighPriority
设置删除孤儿文档是否具备更高的优先级。通常业务的删除往往具有更高的优先级, 所以该参数默认为false。不再支持用于记录目录缓存刷新行为的
operationsBlockedByRefresh
监控指标,原因为基于mongos每个利用集合路由信息的操作都会增加该计数器的次数。新增关于Resharding的监控指标。
addShard命令不再支持
maxSize
选项。调整
config.settings
集合的chunksize时,增加了合理性校验,将值限制在[1,1024]。MongoDB在6.0.3版本后对Balancer策略进行若干调整:
Balancer不再依据分片间Chunks数量的差异,而是依据分片间数据量的差异进行均衡。
将Chunk的逻辑概念转为Range。
自动分裂(auto-splitting)只会在跨分片移动时发生。
时序集合
移除了之前版本对于时序集合DELETE命令的操作限制。除了不能在多文档事务中使用相关删除命令外,当前DELETE命令再无其他限制。
COMPACT命令支持时序集合。
聚合
新增了以下操作符,支持位计算和百分位数:
字段名
描述
字段名
描述
$bitAnd
返回Int或Long类型数值的按位与运算的结果。
$bitNot
返回Int或Long类型数值的按位取反运算结果。
$bitOr
返回Int或Long类型数值的按位或运算的结果。
$bitXor
返回Int或Long类型数值的按位异或运算的结果。
$median
返回近似中位数,相当于50百分位数。
$percentile
返回指定的百分位数。
安全性
支持KMIP 1.0和1.1。
支持OpenSSL 3.0以及OpenSSL FIPS。
其他优化
慢日志新增了
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的角色。新增
analyzeShardKey
、balancer
、queryAnalyzers
相关的全局参数。serverStatus的返回结果新增更多字段,更多信息请参见serverStatus Output Change。
MongoDB 6.0版本说明
新推出可查询加密(Queryable Encryption)和集群同步(Cluster-to-Cluster Sync)功能,并在时序集合(Time Series Collection)、变更流(Change Streams)、聚合(Aggregation)、查询(Query)、弹性和安全性方面进行了增强优化。
可查询加密
允许用户从客户端加密敏感数据,将其作为完全随机的加密数据存储在数据库服务器端,并对加密数据进行丰富的查询。
可查询加密只允许在客户端查看敏感数据的明文,在查询到达服务器端时会同时包含从KMS获取的加密密钥,然后在服务器端以密文进行查询并返回,最后在客户端利用密钥解密后以明文呈现。
集群同步
推出了新的同步工具mongosync,它能支持跨任何环境(包括混合环境、Atlas、本地以及边缘环境)的数据同步(两个MongoDB实例间连续且单向的数据同步)。用户还可以实时控制和监控整个同步过程,按需启动、停止、恢复甚至反转同步。
时序集合
分别从索引、查询以及排序多个方面增强了时序集合。
引入二级和复合索引,以改善读取性能。
引入针对时空数据的地理位置索引(Geo-Indexing),将地理信息添加到时序数据,有助于更好地分析涉及距离和位置的场景。
场景示例:跟踪夏日冷链运输车的温度变化情况、监测特定航线上的货运船燃料消耗。
优化对时序数据的
last point
查询,不再需要扫描整个集合后才能查询到最后一个数据点。优化对时序数据的排序,通过时间以及元数据字段上的聚簇索引(Clustered Index)和二级索引(Secondary Index)更高效地完成排序操作。
变更流
推出了如下新特性以及优化项:
支持查看变更前的视图(Pre-image)。
MongoDB 6.0之前的版本仅支持查看变更后的视图,从MongoDB 6.0版本开始,支持查看变更前后的视图。前后视图的更多信息,请参见Change Streams with Document Pre- and Post-Images。
支持
create
、createIndexes
、modify
和shardCollection
等DDL语句,更多信息,请参见Change Events。Change Events新增
wallTime
字段,时间戳支持多种转换和展示算子(包括$toDate
、$tsSeconds
和tsIncrement
)以方便业务消费。
聚合
推出了如下新特性以及优化项:
分片集群实例支持
$lookup
和$graphLookup
。改进
$lookup
对JOINS的支持。改进
$graphLookup
对图遍历的支持。提升
$lookup
性能,部分场景中性能提升可达百倍。
$lookup
和$graphLookup
的更多信息,请参见$lookup (aggregation)和$graphLookup (aggregation)。查询
新增
$maxN
、$topN
、$minN
、$bottomN
、$lastN
和$sortArray
等操作符。通过操作符可以将更多的计算从业务层下沉到数据库中,使得业务层更加轻量化。操作符的更多信息,请参见Aggregation Pipeline Operators。
弹性
推出了如下新特性以及优化项:
将数据块(Chunk)规格的默认值从64 MB调整为128 MB,有效降低了数据迁移频率以及网络和路由层的开销。
支持
configureCollectionBalancing
命令,此命令支持的功能如下:支持为不同的分片表设置不同的数据块规格。
示例:数据规模特别大的分片表,将数据块规格调整到256 MB。数据规模相对较小但希望在分片上分布更均匀的分片表,将数据块规格调整到64 MB或32 MB。
支持主动对集合进行碎片整理。
相较于
compact
命令,configureCollectionBalancing
命令提供了更好的碎片整理服务,有效降低了磁盘空间占用率。
configureCollectionBalancing
命令的更多信息,请参见configureCollectionBalancing。安全性
对客户端字段级加密(CSFLE, Client-Side Field-Level Encryption)功能进行了优化。CSFLE将支持任何符合密钥管理互通协议(KMIP,Key Management Interoperability Protocol)的密钥管理提供商,即除了基于KeyFile的本地密钥管理外,MongoDB支持通过KMIP与第三方密钥管理设备集成,为用户提供更安全的保障。
客户端字段级加密功能被广泛应用于敏感数据的管理中,尤其是数据迁移的场景。
MongoDB 5.0版本说明
标志着一个新的发布周期的到来,以更快地交付新特性给到用户。
原生时间序列平台
通过原生支持整个时间序列数据的生命周期(从采集、存储、查询、实时分析和可视化,到在线归档或随着数据老化自动失效),使构建和运行时间序列应用程序的速度更快、成本更低。随着MongoDB 5.0的发布,MongoDB扩展了通用的应用数据平台,使开发能够更容易地处理时间序列数据,进一步扩展其在物联网、金融分析、物流等方面的应用场景。
在线重新分片
您可以在业务运行(数据不断增长)的情况下,按需改变集合的分片键(Shard key),而不需要数据库停机或在数据集合中进行复杂的迁移。您只需要在MongoDB Shell中运行reshardCollection命令,选择您需要重新分片的数据库和集合,指定新的分片键即可。
reshardCollection: "<database>.<collection>", key: <shardkey>
<database>:需要重新分片的数据库名称。
<collection>:需要重新分片的集合名称。
<shardkey>:分片键的名称。
当您调用reshardCollection命令时,MongoDB会克隆现有集合,然后将现有集合中所有oplog应用到新集合中,当所有oplog被使用后,MongoDB会自动切换到新集合,并在后台删除旧集合。
版本化API
版本化API支持MongoDB灵活地在每个版本中为数据库添加新的功能和改进内容(以新版本兼容早期版本的方式)。当您需要改变API时,可以增加新版本的API,并与现有版本化的API在同一台服务器上同时运行。随着MongoDB版本发布的加速,版本化API能够使您更快、更轻松地使用到MongoDB最新版本的功能特性。
版本化API定义了应用程序最常用的一组命令和参数(无论是数据库在年度重大发布还是季度快速发布期间,这些命令均不会改变)。通过将应用程序生命周期和数据库生命周期解耦,您可以将驱动程序固定在MongoDB API的特定版本上,即使数据库发生升级和改进,您的应用程序将可以继续运行数年而不需要修改代码。
Write Concern默认Majority级别
从MongoDB 5.0开始,Write Concern默认级别为majority,仅当写入操作被应用到Primary节点(主节点)且被持久化到大多数副本节点的日志中的时候,才会提交并返回成功,“开箱即用”地提供了更强的数据可靠性保障。
长时间运行的快照查询
长时间运行的快照查询(Long-Running Snapshot Queries)增加了应用程序的通用性和弹性。您可以通过该功能运行默认时间为5分钟的查询(或将其调整为自定义持续时间),同时保持与实时事务性数据库一致的快照隔离,也可以在Secondary节点(从节点)上进行快照查询,从而在单个集群中运行不同的工作负载,并将其扩展到不同的分片上。
新版MongoDB Shell
为了提供更好的用户体验,MongoDB 5.0从头开始重新设计了MongoDB Shell(mongosh),以提供一个更现代化的命令行体验,以及增强可用性的功能和强大的脚本环境。新版MongoDB Shell已经成为MongoDB平台的默认Shell。新版MongoDB Shell引入了语法高亮、智能自动完成、上下文帮助和有用的错误信息,为您创造一个直观、互动的体验。
版本发布调整
从MongoDB 5.0开始,MongoDB发布的版本将分为Major Release(大版本)和Rapid Releases(快速发布版本),其中Rapid Releases作为开发版本提供下载和测试体验,但不建议用在生产环境。
MongoDB 4.4版本说明
针对之前版本中用户呼声最高的痛点重点进行了改进。
Hidden Indexes
隐藏现有的索引,保证该索引在后续的查询中不会被使用,用来观察目标低效率索引的删除是否会导致业务性能抖动,如不造成影响即可放心删除该低效率索引。
Refinable Shard Keys
增加一个或多个Suffix Field来改善现有的文档在Chunk上的分布问题,避免所有访问集中在某个单一分片上,分散服务器的压力。
Compound Hashed Shard Keys
支持在复合索引中指定单个哈希字段,在极大程度上简化业务逻辑的复杂性。
Hedged Reads
在分片集群实例下,支持将一个读请求同时发送给某个分片中的两个副本集成员,并选择响应最快的返回结果来恢复客户端,以实现降低请求延迟的目的。
Streaming Replication
主库Oplog主动流向备库,相比之前版本的备库轮询方式,节省了近一半的往返时间,提升了主备复制的性能。
Simultaneous Indexing
主库与备库的索引创建操作同步进行,大幅减少主备库在索引创建过程中产生的延迟,保证备库能及时访问到最新的数据。
Mirrored Reads
主节点会按一定的比例把读流量复制到备库上执行,保证从节点承载一定的读流量,缓解业务的访问延迟。
Resumable Initial Sync
在主备库全量同步过程中,提供断点续传功能,避免因网络断连而导致全量同步工作从头进行。
Time-Based Oplog Retention
支持自定义指定Oplog的保留时长,避免主库Oplog被清理触发全量同步。
Union
新增$unionWith stage用于实现类似于SQL的
union all
功能,增强了MongoDB的查询能力。Custom Aggregation Expressions
新增$accumulator和$function用来实现自定义的Aggregation Expression,完善接口统一性和用户体验。
更多MongoDB 4.4版本的新功能,请参见MongoDB 4.4功能概览。
MongoDB 4.2版本说明
采用二段提交方式,保证分片集群事务的ACID特性,极大拓展了适用的业务场景。
分布式事务
采用二段提交方式,保证分片集群事务的ACID特性,极大拓展了MongoDB的业务场景,实现从NoSQL到NewSQL的飞跃。
可重试读
增加可重试读功能,提供弱网环境下自动重试能力,降低业务端的逻辑复杂性,保证用户业务的连续性。
通配符索引
对于非确定字段,支持创建通配符索引覆盖一个文档下的多个特征字段,管理方便且使用灵活。
字段级加密
驱动层面支持字段级加密,可以针对特定的敏感信息(例如账号、密码、价格、手机号等)单独加密。避免全库加密,提升业务灵活性和安全性。
物化视图
通过最新的物化视图可以缓存计算结果,避免重复计算提升运行效率,减少逻辑复杂度。
MongoDB 4.0版本说明
更适用于金融等对事务有依赖且使用NoSQL特性的场景。
跨文档事务支持
首个支持跨文档事务的NoSQL云数据库,将文档模型的速度,灵活性、功能与ACID保证相结合。
迁移速度提升40%
并发的读取和写入,使得新增的Shard节点能更快地完成数据迁移以承载业务压力。
读性能大幅扩展
借助事务特性,Secondary节点不再因为同步日志而阻塞读取请求。 阿里云同时在全体系版本支持多节点扩展功能,可大幅提升业务读取能力。
MongoDB 3.4版本说明(已停售)
在性能和安全性等方面较3.2版本均有不同程度的提升。
MongoDB 3.2版本已下线,详情请参见【通知】11月22日云数据库MongoDB版3.2版本下线。
更快的主备同步
在同步数据的同时建立所有索引(以前的版本仅建立_id索引)。同时在同步数据的阶段,Secondary节点不断读取新的oplog信息,确保Secondary节点的local数据库具备足够的存储空间来存储临时数据。
更高效的负载均衡
3.2及以前版本中,分片集群的负载均衡由Mongos节点负责,多个Mongos节点会抢一个分布式锁,由抢锁成功的Mongos节点执行负载均衡任务,在Shard节点间迁移块;而在3.4版本中,负载均衡由ConfigServer节点中的Primary节点负责,负载均衡的并发度和效率上均有大幅提升。
更丰富的aggregation操作
在3.4版本增加了大量的aggregation操作符,可支持更强的数据分析能力。例如,
bucket
能便捷地对数据进行分类;$grahpLookup
相较于3.2版本的$lookup
能支持更复杂的关系运算;$addFields
使得文档操作更丰富(例如将某些字段求和存储为新的字段)。支持Sharding Zones
分片集群里引入了Zone的概念,主要取代现在的tag-aware sharding机制,能将某些数据分配到指定的一个或多个Shard节点中,该特性极大地方便sharding cluster的跨机房部署。
支持Collation
在之前的版本里,文档里存储的字符串不论是中英文还是大小写,一律按字节来对比;引入Collation后,支持对字符串的内容进行解读,可以按使用的locale进行对比,也支持在对比时忽略大小写。
支持只读视图(Read-only views)
在3.4中增加了对只读视图的支持,可以将集合中满足某个查询条件的数据虚拟成一个特殊的集合,用户可以在特殊的集合上做进一步的查询操作。
- 本页导读 (1)
- 支持版本
- 存储引擎
- 版本和存储引擎的适配关系
- MongoDB 8.0版本说明
- MongoDB 7.0版本说明
- MongoDB 6.0版本说明
- MongoDB 5.0版本说明
- MongoDB 4.4版本说明
- MongoDB 4.2版本说明
- MongoDB 4.0版本说明
- MongoDB 3.4版本说明(已停售)