MongoDB 3.2的发布说明
2015年12月8日
MongoDB 3.2现已推出。主要功能包括作为默认存储引擎的WiredTiger、复制选择增强、将服务器配置为副本集、readConcern
和文档验证。
OpsManager 2.0也可用。请参阅OpsManager文档和OpsManager发布说明了解更多信息。
默认情况下,WiredTiger
从3.2开始,MongoDB使用WiredTiger作为默认存储引擎。
要指定MMAPv1存储引擎,您必须指定存储引擎设置:
- 在带有
--storageEngine
选项的命令行上:
mongod --storageEngine mmapv1
- 或者在配置文件中使用
storage.engine
设置:
storage:
engine: mmapv1
笔记:
对于现有部署,如果您没有指定
--storageEngine
或storage.engine
设置,MongoDB 3.2可以自动确定用于在--dbpath
或storage.dbPath
中创建数据文件的存储引擎。如果指定
--storageEngine
或storage.engine
,如果dbPath
包含由指定的存储引擎以外的存储引擎创建的数据文件,则mongod
将不会启动。另见:
WiredTiger默认缓存大小
从MongoDB 3.2开始,默认情况下,WiredTiger内部缓存将使用较大的缓存:
- 60%的RAM减去1 GB,或
- 1 GB。
有关更多信息,请参阅WiredTiger和内存使用。
WiredTiger日志写入频率
MongoDB 3.2将WiredTiger配置为每50毫秒写入日志文件。这是对现有日记撰写间隔和条件的补充。有关更多信息,请参阅日志流程。
复制选举增强功能
从MongoDB 3.2开始,MongoDB减少了副本集的故障转移时间,并加快了对多个同时初选的检测。
作为此增强的一部分,MongoDB引入了该协议的第1版。默认情况下,新的副本集将使用protocolVersion: 1
以前版本的MongoDB使用协议的版本0。
此外,MongoDB引入了一个新的副本集配置选项electionTimeoutMillis
。electionTimeoutMillis
指定了检测副本集主选项何时无法到达的时间限制(以毫秒为单位)。
electionTimeoutMillis
仅在使用其replication protocol
版本1时适用。
另见:
分片集群增强功能
MongoDB 3.2不建议在配置服务器上使用三个镜像mongod
实例。
相反,从3.2开始,分片集群的配置服务器可以部署为副本集。副本集配置服务器必须运行WiredTiger存储引擎。
这一变化提高了配置服务器的一致性,因为MongoDB可以利用标准副本集读取和写入协议来分片配置数据。此外,这允许分片集群拥有超过3台配置服务器,因为副本集最多可以有50个成员。
有关更多信息,请参阅配置服务器。要部署带有副本集配置服务器的新分片集群,请参阅部署分片集群。
MongoDB 3.2不建议对分片集群的组件使用主从复制。
从3.2开始,mongos
在启动期间将继续尝试联系配置服务器,直到可用。在之前的版本中,如果mongos
找不到配置服务器,它将在启动期间关闭。
readConcern
MongoDB 3.2为副本集和副本集碎片引入了readConcern
查询选项。对于WiredTiger存储引擎,readConcern
选项允许客户端为其读取选择一定程度的隔离。您可以指定一个"majority"
的readConcern
来读取已写入大多数节点的数据,因此无法回滚。默认情况下,MongoDB使用"local"
的readConcern
返回查询时节点可用的最新数据,即使数据没有保留到大多数节点,并且可能会回滚。与MMAPv1存储引擎,您只能指定"local"
的aindConcernreadConcern
readConcern
需要为MongoDB 3.2更新MongoDB驱动程序。
有关readConcern
的详细信息,包括支持该选项的操作,请参阅阅读关注。
部分索引
MongoDB 3.2提供了创建索引的选项,该索引仅索引满足指定过滤器表达式的集合中的文档。通过对集合中的文档子集进行索引,部分索引降低了存储要求,并降低了索引创建和维护的性能成本。您可以为所有MongoDB索引类型指定partialFilterExpression选项。
partialFilterExpression
选项接受使用以下方式指定条件的文档:
有关详细信息,请参阅部分索引。
文档验证
从3.2开始,MongoDB提供了在更新和插入期间验证文档的功能。验证规则按每个集合指定。
要在新集合上指定文档验证,请使用db.createCollection()
方法中的newvalidator选项。要将文档验证添加到现有集合中,请使用collMod
命令中的新validator
选项。有关更多信息,请参阅架构验证。
要查看集合的验证规范,请使用thedbdb.getCollectionInfos()
方法。
以下命令可以使用新选项bypassDocumentValidation绕过每个操作的验证
applyOps
指挥权findAndModify
command anddbdb.collection.findAndModify()
方法mapReduce
命令和db.collection.mapReduce()
方法insert
指挥权update
指挥权$out
对于aggregate
命令anddbdb.collection.aggregate()
方法
对于启用了访问控制的部署,您必须具有bypassDocumentValidation
操作。内置角色dbAdmin
和restore
提供此操作。
聚合管道增强
MongoDB介绍:
新阶段、累加器和表达式。
性能改进在分片集群上。
新的聚合阶段
角色 | 描述 | 句法 |
---|---|---|
$sample |
从其输入中随机选择N个文档。 | { $sample: { size: <positive integer> } } |
$indexStats |
返回有关索引使用情况的统计数据。 | { $indexStats: { } } |
$lookup |
与另一个集合执行左侧外部连接。 | { $lookup: { from: localField: foreignField: as: |
新的累加器$group
阶段
累加器 | 描述 | 句法 |
---|---|---|
$stdDevSamp |
计算标准偏差。 | { $stdDevSamp: <array> } |
$stdDevPop |
计算人口标准偏差。 | { $stdDevPop: <array> } |
新的聚合算术运算符
运算符号 | 描述 | 句法 |
---|---|---|
$sqrt |
计算平方根。 | { $sqrt: <number> } |
$abs |
返回数字的绝对值。 | { $abs: <number> } |
$log |
计算指定基数中数字的日志。 | { $log: [ <number>, <base> ] } |
$log10 |
计算一个数字的日志基数10。 | { $log10: <number> } |
$ln |
计算数字的自然对数。 | { $ln: <number> } |
$pow |
向指定的指数提出一个数字。 | { $pow: [ <number>, <exponent> ] } |
$exp |
将e提升到指定的指数。 | { exp: <number> } |
$trunc |
截断一个数字到其整数。 | { $trunc: <number> } |
$ceil |
返回大于或等于指定数字的最小整数。 | { $ceil: <number> } |
$floor |
返回小于或等于指定数字的最大整数。 | { floor: <number> } |
新的聚合数组运算符
运算符号 | 描述 | 句法 |
---|---|---|
$slice |
返回数组的子集。 | { $slice: [ <array>, <n> ] } 或{ $slice: [ <array>, <position>, <n> ] } |
$arrayElemAt |
返回指定数组索引处的元素。 | { $arrayElemAt: [ <array>, <idx> ] } |
$concatArrays |
串联阵列。 | { $concatArrays: [ <array1>, <array2>, ... ]} |
$isArray |
确定操作数是否为数组。 | { $isArray: [ <expression> ] } |
$filter |
根据条件选择数组的一个子集。 | { $filter: { input: <array>, as: <string>, cond: <expression> }} |
累加器表达式可用性
从3.2版本开始,以下以前仅在$group
阶段可用的累加器表达式现在也在$project
阶段可用:
当用作$project
阶段的一部分时,这些累加器表达式可以接受以下任一:
- 单一论点:
<accumulator> : <arg>
- 多个参数:
<accumulator> : [ <arg1>, <arg2>, ... ]
一般增强功能
在MongoDB 3.2中,
$project
阶段支持使用方括号[]
直接创建新的数组字段。例如,请参阅Project New Array Fields。MongoDB 3.2为
$geoNear
阶段引入了minDistance
选项。$unwind
非阵列操作数的阶段不再出错。如果操作数没有解析为数组,但没有缺失、空数组或空数组,$unwind
将操作数视为单个元素数组。$unwind
阶段可以:- 通过在阶段规范中指定新选项
includeArrayIndex
数组元素的数组索引包含在输出中。 - 通过在阶段规范中指定新的option
preserveNullAndEmptyArrays
输出那些缺少数组字段、空数组或空数组的文档。
- 通过在阶段规范中指定新选项
优化
索引可以覆盖聚合操作。
MongoDB提高了管道在大型碎片集群中的整体性能。
如果管道以碎片键上的精确$match
开始,则整个管道仅运行在匹配的碎片上。以前,管道将被拆分,合并工作必须在主碎片上完成。
对于在多个碎片上运行的聚合操作,如果操作不需要在数据库的主碎片上运行,这些操作可以将结果路由到任何碎片,以合并结果并避免该数据库的主碎片过载。需要在数据库主碎片上运行的聚合操作是$out
阶段和$lookup
阶段。
兼容
有关兼容性更改,请参阅聚合兼容性更改。
MongoDB工具增强功能
mongodump
和mongorestore
使用新的--archive
选项添加对存档文件和标准输出/输入流的支持。此增强功能允许通过管道将转储数据流式传输到网络设备上。有关示例,请参阅mongodump
和mongorestore
使用新的--gzip
选项添加对压缩数据转储的支持。此增强功能减少了转储文件的存储空间。有关示例,请参阅:
加密存储引擎
企业功能
仅在MongoDB Enterprise中提供。
重要:
仅适用于WiredTiger存储引擎。
静态加密,当与传输加密和保护相关帐户、密码和加密密钥的良好安全策略一起使用时,可以帮助确保遵守安全和隐私标准,包括HIPAA、PCI-DSS和FERPA。
MongoDB Enterprise 3.2为WiredTiger存储引擎引入了本机加密选项。此功能允许MongoDB加密数据文件,以便只有拥有解密密钥的各方才能解码和读取数据。有关详细信息,请参阅加密存储引擎。
文本搜索增强功能
text
索引版本3
MongoDB 3.2引入了文本索引的第3版。新版本索引的主要特点是:
从MongoDB 3.2开始,版本3是新文本索引的默认版本。
另见;
$text
操作员增强
$text
运算符增加了对以下内容的支持:
- 使用新的
$caseSensitive
选项进行区分大小写的文本搜索,以及 - 使用新的
$diacriticSensitive
选项进行变音符号敏感文本搜索。
有关更多信息和示例,请参阅$text
运算符参考部分Case Insensitivity和Diacritic Insensitivity。
对其他语言的支持
企业功能:
仅在MongoDB Enterprise中提供。
从3.2开始,MongoDB Enterprise为以下语言提供支持:阿拉伯语、波斯语(特别是达里语和伊朗波斯语方言)、乌尔都语、简体中文和繁体中文。
有关详细信息,请参阅使用基础技术Rosette语言学平台进行文本搜索。
新的存储引擎
inMemory
存储引擎
企业功能
仅在MongoDB Enterprise中提供。
MongoDB Enterprise 3.2提供了一个内存存储引擎。除了一些元数据外,内存存储引擎不维护任何磁盘数据。通过避免磁盘I/O,内存存储引擎允许更可预测的数据库操作延迟。
要选择此存储引擎,请指定:
inMemory
对于--storageEngine
选项或storage.engine
设置。--dbpath
。虽然内存存储引擎不会将数据写入文件系统,但它在--dbpath
维护小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
inMemory
存储引擎使用文档级锁定。有关更多详细信息,请参阅内存存储引擎。
ephemeralForTest
存储引擎
MongoDB 3.2提供了一种新的测试存储引擎。除了一些元数据外,待测存储引擎不维护任何磁盘数据,无需在测试运行之间进行清理。测试存储引擎不受支持。
警告:
仅用于测试目的。不要在生产中使用。
要选择此存储引擎,请指定
ephemeralForTest
对于--storageEngine
选项或storage.engine
设置。--dbpath
。虽然测试存储引擎不会将数据写入文件系统,但它在--dbpath
中维护小型元数据文件。
ephemeralForTest
存储引擎使用集合级锁定。
一般增强功能
位测试查询运算符
MongoDB 3.2提供了新的查询运算符来测试位值:
SpiderMonkey JavaScript引擎
mongoDB 3.2使用SpiderMonkey作为mongo shell和mongood服务器的JavaScript引擎。SpiderMonkey提供了对其他平台的支持,并改进了存储管理模型。
此更改影响所有JavaScript行为,包括命令mapReduce
,团体,以及查询运算符$where
;但是,此更改对用户应该是完全透明的。
另见:
mongo
Shell和CRUD API
提供与MongoDB驱动程序的CRUD一致性
(创建/读取/更新/删除)API时,mongo shell 引入了与驱动程序的CRUD API 一致的其他CRUD方法:
WiredTiger 和 fsyncLock
从MongoDB 3.2开始,WirdTider存储引擎支持带锁选项的fsync
命令或mongo shell 方法db.fsyncLock()
中的一个也就是说,对于WiredTiger存储引擎来说,这些操作可以保证数据文件不发生变化,保证了创建备份的一致性。
平台支持
从3.2开始,32位二进制文件不建议使用,在未来的版本中将不可用。
MongoDB 3.2也不建议支持Red Hat Enterprise Linux 5。
$type
运算符接受字符串别名
$type
除了与BSON类型对应的数字外,运算符还接受BSON类型的字符串别名。
explain()
支持distinct()
操作
db.collection.distinct()
方法中,有关更多信息请参考
explain
支持findAndModify
和distinct
命令
explain
增加了对distinct
和findAndModify
命令的支持。有关更多信息,请参阅explain
。
HTTP接口的弃用
从3.2开始,MongoDB不建议使用其HTTP接口。
keysExamined
计数包括上次扫描的密钥
对于explain
在executionStats
或allPlansExecution
模式下运行的操作,解释输出包含keysExamined
统计信息,表示索引扫描期间检查的索引键数量。
在3.2之前,一些查询中的keysExamined
计数不包括上次扫描的键。截至3.2,此错误已更正。有关更多信息,请参阅inputStage
。
诊断日志和系统分析器报告了此统计数据。
地理空间优化
MongoDB 3.2引入了2dsphere lndexes的第3版,该版本以更精细的层次对GeoJSON几何体进行索引。新版本提高了2dsphere索引查询在较小区域上的性能。此外,对于2d lndex和2dsphere索引,geoNear查询的性能在密集数据集中得到了改进。
另见:
诊断数据采集
为了便于MongoDBengineers分析MongoDB服务器行为,MongoDB 3.2引入了一种诊断数据收集机制,用于定期将服务器统计数据记录到诊断文件中。默认情况下,该机制每隔1秒捕获数据。要修改间隔,请参阅 diagnosticDataCollectionPeriodMillis
。
MongoDB在mongod
实例的--dbpath
或storage.dbPath
下创建一个diagnostic.data
目录。诊断数据存储在此目录下的文件中。
诊断文件的最大大小可使用diagnosticDataCollectionFileSizeMB
配置,diagnostic.data
目录的最大大小可使用diagnosticDataCollectionDirectorySizeMB
配置。
捕获间隔和最大大小的默认值被选择,以便为MongoDB工程师提供对性能和存储大小影响最小的有用数据。通常,这些值只需要根据MongoDB工程师的要求进行修改,用于特定的诊断目的。
写出关注
- 对于使用
protocolVersion: 1
的副本集,辅助成员向其他各自的磁盘日子写入数据后,辅助成员确任写入操作,而不考虑j选项。 - 对于使用protocolVersion的复本集 ,w:"多数"意味着j : true
- 对于j :true,MongoDB只在请求的成员数量(包括主成员)以经写入日志之后才返回。以前的j:副本集中的true write关注点只要求主节点向日志写入,而不考虑 w: write关注点。
journalCommitInterval
用于WiredTiger
MongoDB 3.2增加了对指定WiredTiger存储引擎日志提交间隔的支持。请参阅--journalCommitInterval
选项。在之前的版本中,该选项仅适用于MMAPv1存储引擎。
对于相应的配置文件设置,MongoDB 3.2添加了
storage.journal.commitIntervalMs设置和弃用
storage.mmapv1.journal.commitIntervalMs。不建议使用的
storage.mmapv1.journal.commitIntervalMs设置充当新
storage.journal.commitIntervalMs设置。
影响兼容性的变化
一些MongoDB 3.2更改可能会影响兼容性,并可能需要用户操作。有关兼容性更改的详细列表,请参阅MongoDB 3.2中的兼容性更改。
升级流程
有关完整的升级说明,请参阅将MongoDB升级到3.2。
3.2.1中的已知问题
3.2.1版本中已知问题的列表:
- 当节点之间的时间偏差大于
electionTimeout
时,客户端可能无法发现新的主节点: 服务器-21744 fromMigrate
从未在oplog中为删除设置标志:服务器-21678- 在v3.2 mongo shell 连接到v3.0 mongos或在v3.0 mongo shell 连接到v3.0 mongos但与v3.2 shards不兼容的情况下运行explain: 服务器-21661
- connPoolStats命令的结果不再正确:服务器-21597
- ApplyOps背景索引创建可能会死锁:服务器-21583
w:majority
用副本setprotocol版本1编写的性能回归:服务器-21581- unicode感知文本处理逻辑(文本索引v3)的性能回归:服务器-19936
$indexStats
运算符的结果不考虑使用$match
或mapReduce
函数的查询:服务器-22048
3.2.0中的已知问题
3.2.0版本中的已知问题列表:
- findAndModify分析器未捕获的操作:服务器-21772
getMore
命令没有设置"nreturned"
操作计数器:服务器-21750- 当节点之间的时间偏差大于选择时,客户端可能无法发现新的主节点超时: 服务器-21744
fromMigrate
从未在oplog中为删除设置标志:服务器-21678- Running
explain
with a read preference in a v3.2mongo
shell connected to a v3.0mongos
or in a v3.0mongo
shell connected to a v3.0mongos
but with v3.2 shards is incompatible: 服务器-21661 - connPoolStats命令的结果不再正确:服务器-21597
- ApplyOps背景索引创建可能会死锁:服务器-21583
w:majority
用副本setprotocol版本1编写的性能回归:服务器-21581- unicode感知文本处理逻辑(文本索引v3)的性能回归:服务器-19936
- 使用WiredTiger在Windows下插入工作负载中的严重性能回归:服务器-21792
$indexStats
运算符的结果不考虑使用$match
或mapReduce
函数的查询:服务器-22048
下载
要下载MongoDB 3.2,请转到下载页面。
另见:
译者:韩鹏帅
参见