MongoDB 4.0的发布说明
多文件交易
从4.0版本开始,MongoDB提供了对副本集执行多文档事务的能力。对于多文档事务,在事务提交之前,事务中不会在事务之外看到写入操作。也就是说,多文档交易是原子的。
重要:
在大多数情况下,多文档事务比单文档写入带来更高的性能成本,多文档事务的可用性不应成为有效模式设计所取代的场所。在许多情况下,去规范化数据模型(嵌入式文档和数组)将继续最适合您的数据和用例。也就是说,对于许多场景,适当建模您的数据将最大限度地减少对多文档交易的需求。
有关其他事务使用注意事项(如运行时限制和oplog大小限制),另请参阅生产注意事项。
功能兼容性
副本集所有成员featureCompatibilityVersion必须为4.0或更高。要检查成员featureCompatibilityVersion,请连接到成员并运行以下命令:
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
有关 featureCompatibilityVersion标志的更多信息,请参阅seesetFeatureCompatibilityVersion。
mongoshell方法
| 方法 | 描述 |
|---|---|
Session.startTransaction() |
启动多陈述事务。 |
Session.commitTransaction() |
提交交易。 |
Session.abortTransaction() |
中止交易。 |
MongoDB驱动程序
客户需要MongoDB驱动程序为MongoDB 4.0更新使用交易。
阅读关注snapshot
MongoDB 4.0为多文档事务引入了新的读取关注级别"snapshot"”。
对于多文档事务,MongoDB有时可能会用更强的读取关注来代替"local"和"majority"读取关注。
有关所有接受读取顾虑的操作的列表,请参阅支持读取关注的操作。
阅读偏好
包含读取操作的多文档事务必须使用读取首选项primary。给定事务中的所有操作都必须路由到同一成员。
命令
-
Use the corresponding driver method or
mongoshell helperSession.abortTransaction()instead. -
Use the corresponding driver method or
mongoshell helperSession.commitTransaction()instead.
锁
默认情况下,多文档事务等待5毫秒才能获得事务中操作所需的锁。如果事务无法在5毫秒内获得所需的锁,则交易将中止。
您可以使用maxTransactionLockRequestTimeoutMillis参数来调整交易等待获取锁的时间。
事务在中止或提交时释放所有锁。
$currentOp
聚合管道阶段 $currentOp (以及 currentOp命令 和 mongo shell 助手 db.currentOp() 方法) 返回关于作为事务一部分有锁的非活动会话的消息
参数
transactionLifetimeLimitSeconds指定多文档事务的生命周期,之后事务被视为已过期,并将在下一次运行定期清理过程时中止。maxTransactionLockRequestTimeoutMillis指定多文档事务应该等待多长时间才能获得事务中操作所需的锁。
集合
新型转换运算符
MongoDB 4.0为类型转换添加了以下新的聚合运算符:
| 运算符号 | 描述 |
|---|---|
$convert |
将值转换为指定类型。 |
$toBool |
将值转换为布尔值。 |
$toDate |
将值转换为日期。 |
$toDecimal |
货币转换器 值为 Decimal128。 |
$toDouble |
将值转换为Double。 |
$toInt |
将值转换为整数。 |
$toLong |
将值转换为长。 |
$toObjectId |
将值转换为ObjectId。 |
$toString |
将值转换为字符串。 |
新的字符串运算符
MongoDB 4.0添加了以下新的聚合字符串运算符:
| 运算符号 | 描述 |
|---|---|
$ltrim |
从字符串开头删除空格或指定字符。 |
$rtrim |
从设置末尾删除空格或指定字符。 |
$trim |
从字符串的开头和结尾删除空格或指定字符。 |
其他改进
$bucket
$bucket阶段不再要求boundaries文档参数用$literal包装。
$dateToString
$dateToString聚合运算符具有以下选项更改:
笔记:
Requires
featureCompatibilityVersion(fcv) set to"4.0"or greater.
- 一个新的
onNull选择指定了在date为空或缺失时返回的值。 - 选项
format现在是可选的。
$dateFromParts
如果为year、isoYear和timezone以外的字段指定的值超出有效范围,$dateFromParts携带或减去其他日期部分的差额来计算日期。有关更多信息,请参阅值范围。
$dateFromString
$dateFromString聚合运算符采用可选format字段。
$currentOp
聚合管道阶段$currentOp支持以下新选项:
idleSessions选项返回作为事务的一部分持有锁的不活动会话的信息。localOps选项是报告在当前mongos实例上本地运行的操作,而不是报告在碎片上运行的操作。
MongoDB驱动程序
以下驱动程序的功能与MongoDB 4.0兼容:
| Java 3.8.0 | C# 2.7 | Perl 2.0.0 |
| Python 3.7.0 | Node3.1.0 | PHP(PHPC)1.5.0 |
| C 1.11.0 | Ruby2.6.0 | cala 2.4.0 |
安全
添加支持SCRAM-SHA-256
笔记:
要使用SCRAM-SHA-256,
featureCompatibilityVersion必须设置为4.0。有关 featureCompatibilityVersion的更多信息,请参阅Get FeatureCompatibilityVersion和setFeatureCompatibilityVersion。
MongoDB增加了对SCRAM身份验证机制SCRAM-SHA-256的支持,该机制使用SHA-256哈希函数。为了修改SCRAM-SHA-256的迭代计数,MongoDB添加了一个新的参数scramSHA256IterationCount。
创建和更新用户操作的新选项
当创建或更新一个scram用户时,您可以指定用于用户凭证的特定scram机制。具体来说, MongoDB 4.0 在以下命令和mongo shell helper中添加了mechanisms选项
| 指挥权 | 方法 |
|---|---|
createUser |
db.createUser() |
updateUser |
db.updateUser() |
使用SCRAM-SHA-256时,MongoDB(即服务器)需要解锁密码。从MongoDB 4.0开始,digestPassword的默认值对createUser为true,passwordDigestor的默认值为"server"在早期的MongoDB版本中,digestPassword分别是false和client。
isMaster命令的新选项
从MongoDB 4.0开始,isMaster命令接受可选字段saslSupportedMechs: <db.user>在其结果中返回额外的fieldisMasterisMaster.saslSupportedMechs。
isMaster.saslSupportedMechs是用于创建指定用户凭据的SASL机制数组。
移除对MONGODB-CR
从4.0版本开始,MongoDB取消了对已弃用的MongoDB挑战响应(MONGODB-CR)身份验证机制的支持。
自3.0版本以来,MongoDB不支持创建MONGODB-CR用户,除非部署已从2.6或更早的部署升级,该部署已经拥有MONGODB-CR用户,并且尚未升级身份验证模式。
如果您的部署在MONGODB-CR模式中存储了用户凭据,则在升级到4.0版本之前,您必须升级到咸味挑战响应身份验证机制(SCRAM)。有关升级到SCRAM的信息,请参阅升级到SCRAM。
usersInfo增强
usersInfo命令可以通过指定以下方式返回所有数据库的信息:
{ usersInfo: { forAllDBs: true } }
usersInfo 和 mongo shell 辅助程序 db.getUser() 和 db.getUsers() 方法接受一个新的可选过滤器文档filter 文档指定$match 阶段条件,以便仅为匹配条件的用户返回信息 。
usersInfo 命令和 mongo shell helpers.db.getUser() 和db.getUsers()方法返回用户的机制字段。
| 平台 | TLS/SSL库 |
|---|---|
| 窗口 | 安全通道(Schannel) |
| Linux/BSD | OpenSSL |
| macOS | 安全运输 |
与此更改相关联,Linux/BSD支持参数opensslCipherConfig,Windows和macOS不再支持该参数。
TLS 1.2支持
适用于macOS的MongoDB 4.0二进制文件支持TLS 1.2。
禁用TLS 1.0
MongoDB二进制文件(mongod、mongos和mongo)在提供TLS 1.1+的系统上禁用对TLS 1.0加密的支持。
如果您需要支持TLS 1.0:
对于
mongod实例,您可以指定nonetonetnet.ssl.disabledProtocols或--sslDisabledProtocols none。对于
mongos实例,您可以指定nonetonetnet.ssl.disabledProtocols或--sslDisabledProtocols none。For the
mongoshell, you can specify--sslDisabledProtocols none.--sslDisabledProtocols选项适用于mongo壳:- MongoDB 4.0+版本
- MongoDB 3.6.5版本+
- MongoDB版本3.4.15+
在 macOS 上,将mongo shell 版本 3.6.4 或更早版本连接到 MongoDB 4.0+ 部署需要显示启用TLS1.0
AES-GC
Windows上的MongoDB Enterprise不再支持AES256-GCM。此密码现在仅在Linux上可用。
另见:
新的特权行动
支持免费云监控,MongoDB为cluster资源添加了以下特权操作:
MongoDB修改了clusterMonitor角色以包含这些特权。
x.509 认证证书限制
从MongoDB 4.2, 开始,如果指定--tlsAllowInvalidateCertificates 或`net.tls.allowInvalidCertificates: true在使用x.509身份验证时,无效证书只够建立tls连接,而不足以进行身份验证。
如果您使用无效证书执行x.509身份验证,请将证书更新为有效证书。例如,您可以使用受信任的CA对现有证书进行签名,或者如果使用自定义CA,请使用net.ssl.CAFile指定该CA。
在Windows和macOS上为TLS/SSL启用系统存储
--sslCertificateSelector 选项 (certificateSelector设置) 允许 mongod、mongo shell 和mongos 使用Windows 和 macOS的系统SSL证书存储。
--sslClusterCertificateSelector选项(clusterCertificateSelector设置)允许mongod和mongos使用Windows和macOS的系统TLS/SSL证书存储进行集群内的内部TLS/SSL通信。
选项--kmipClientCertificateSelector(security.kmip.clientCertificateSelector)允许mongod在使用TLS/SSL连接到KMIP服务器时使用Windows和macOS的系统TLS/SSL证书存储。
不建议使用MMAPv1
从4.0版本开始,MongoDB不建议使用MMAPv1存储引擎,并将在未来的版本中删除MMAPv1。
要将您的MMAPv1存储引擎部署更改为WiredTiger存储引擎,请参阅:
副本集
删除复制集的pv0
MongoDB 4.0删除了已弃用的副本集协议版本0 pv0。
在升级到MongoDB 4.0之前,您必须升级到pv1。
要升级到 pv1, 请将 mongo shell 连接到主副本集,并执行以下操作:
cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);
您可以使用catchUpTimeoutMillis在更快的故障转移和保存w:1写入之间进行优先排序。
有关pv1的更多信息,请参阅Replica Set协议版本。
删除主从复制
MongoDB 4.0取消了对已弃用的主从复制的支持。在升级到MongoDB 4.0之前,如果您的部署使用主从复制,则必须升级到副本集。
要从主从复制转换为副本集,请参阅将主从部署转换为副本集。
日志和复制集
从MongoDB 4.0开始,对于使用WiredTiger存储引擎的复制集成员,您无法指定--nojournal选项orstoragestorage.journal.enabled: false。
rollbackTimeLimitSecs可用参数
从MongoDB 4.0开始,一个新的rollbackTimeLimitSecs参数允许为指示回滚的成员设置公共点和最后一个oplog写入条目之间的时间限制(以秒为单位)。默认回滚时间限制为1天。
等待背景索引构建
从4.0版本开始,MongoDB等待任何正在进行的后台索引构建完成,然后再开始回滚。
回滚文件
MongoDB添加了参数createRollbackDataFiles,该参数确定在回滚期间,MongoDB是否创建包含回滚期间受影响的文档的回滚文件。
replSetGetStatus产出变化
replSetGetStatus返回以下新字段:
不建议使用从replSetGetStatus返回的以下字段:
Oplog 大小
oplog可以超过其配置的大小限制,以避免删除majority commit point。
更改流
数据库和部署变更流
MongoDB增加了以下功能:
- 打开单个数据库(不包括
admin、local和config数据库)的更改流光标,以监视其所有非system集合的更改。 - 为部署打开更改流光标,以监视除
admin、local和config外所有数据库中所有非system集合的更改。
笔记:
Requires
featureCompatibilityVersion(fcv) set to"4.0"or greater.
开始时间选项
MongoDB增加了为更改流指定开始时间(startAtOperationTime选项)的功能。
更改事件文档更改
更改事件文档包括新字段:
恢复令牌数据类型更改
MongoDB 4.0引入了新的十六进制编码字符串更改流恢复令牌:
恢复令牌_data类型取决于MongoDB版本,在某些情况下取决于更改流打开/恢复时的功能兼容性版本(fcv)(即fcv值的更改不会影响已打开的更改流的恢复令牌):
| MongoDB版本 | 功能兼容性版本 | 恢复令牌_data类型 |
|---|---|---|
| MongoDB 4.0.7及更高版本 | "4.0"或"3.6" | 六角编码字符串(v1) |
| MongoDB 4.0.6及更早版本 | "4.0" | 六角编码字符串(v0) |
| MongoDB 4.0.6及更早版本 | "3.6" | BinData |
| MongoDB 3.6 | "3.6" | BinData |
使用十六进制编码的字符串恢复令牌,您可以比较和排序此类令牌。
无论fcv值如何,4.0部署都可以使用BinData恢复令牌或十六进制字符串恢复令牌来恢复更改流。因此,4.0部署可以使用3.6部署集合上打开的更改流中的恢复令牌。
在MongoDB版本中引入的新简历令牌格式不能被早期的MongoDB版本使用。
然而,3.6部署可以使用从对fcv 3.6部署的集合打开的更改流返回的BinData恢复令牌。然而,3.6部署不能使用十六进制编码的字符串恢复令牌。
mongoshell方法
| 方法 | 描述 |
|---|---|
db.watch() |
为单个数据库(不包括admin、local和config数据库)打开更改流光标,以监视其所有非system集合的更改。有关相应的MongoDB驱动程序方法,请参阅您的驱动程序文档。 |
Mongo.watch() |
为部署打开一个更改流光标,以监视除admin、local和config外所有数据库中所有非system集合的更改。有关相应的MongoDB驱动程序方法,请参阅您的驱动程序文档。4.0版本的新功能。 |
免费监控
MongoDB 4.0(社区版)为独立或复制集提供免费云监控。
启用/禁用
默认情况下,您可以使用以下方式在运行时启用/禁用免费监控:
mongo外壳方法 |
指挥权 |
|---|---|
db.enableFreeMonitoring() |
setFreeMonitoring |
db.disableFreeMonitoring() |
您还可以在启动时启用或禁用免费监控,使用以下任一方式:
- 配置文件设置
cloud.monitoring.free.state或 - 命令行选项
--enableFreeMonitoring
查看状态
要查看免费监控的状态,MongoDB提供以下命令和shell助手:
mongoshell方法 |
指挥权 |
|---|---|
db.getFreeMonitoringStatus() |
getFreeMonitoringStatus |
serverStatus和助手db.serverStatus()还包括freeMonitoring字段中的免费监控统计信息。
访问控制
为了支持免费的云监控,MongoDB为cluster资源添加了以下特权操作:
内置的角色clusterMonitor包括新的特权操作。
分片集群
mongos对影响分片集群元数据的以下操作使用"majority"写入关注:
.msiWindows上的安装程序
从MongoDB 4.0开始,您可以在安装期间将MongoDB配置为服务。
平台支持
- MongoDB 4.0(社区和企业)增加了对以下内容的支持:
- MongoDB 4.0(社区)增加了对以下内容的支持:
- s390x RHEL 6.x
- MongoDB 4.0不支持SLES 11。
- MongoDB 3.2.20+、3.4.15+和3.6.4+也取消了对SLES 11的支持。
- MongoDB 4.0不支持Ubuntu 12.04。
- MongoDB 3.2.20+、3.4.15+和3.6.4+也删除了对Ubuntu 12.04的支持。
- MongoDB 3.2.20+、3.4.15+和3.6.4+也删除了对Ubuntu 12.04的支持。
- 在未来版本中,MongoDB将停止对以下平台的支持:
- Windows 7/2008R2
- Windows 8/2012
- Windows 8.1/2012R2
- Ubuntu 14.04
有关完整的平台支持矩阵,请参阅平台支持。
MongoDB工具
mongoreplay 命令支持一个新的MONGOREPLAY_HOST环境变量,该变量在运行 mongoreplay play时指定mongoDB连接字符串。可以使用新的环境变量来代替命令行 --host 选项。
例如,要将录音播放到在mongodb1.example.net:27017上运行身份验证的mongod实例,您可以在以下位置指定连接字符串:
MONGOREPLAY_HOST环境变量:export MONGOREPLAY_HOST="mongodb://myUserName:s0meD1fficultPassw0rd@mongodb1.example.net:27017/?authSource=admin" mongoreplay play -p /some/path/to/my/recording.bson--host命令行选项:mongoreplay play -p /some/path/to/my/recording.bson --host "mongodb://myUserName:s0meD1fficultPassw0rd@mongodb1.example.net:27017/?authSource=admin"
如果指定了--host命令行选项,则--host值将覆盖环境变量。
一般改进
命令
- 命令
listCollections在数据库上进行意向共享锁定。在之前的版本中,该命令对数据库进行共享锁定。 - 命令
listCollections及其mongoshelldb.getCollectionInfos()接受以下选项:nameOnly仅返回集合名称和类型(不需要集合锁)。authorizedCollections允许没有所需权限的用户运行listCollections可以运行命令,withnameOnlynameOnly: true, authorizedCollections: true,以返回用户拥有特权的集合。
- 命令
serverStatus及其mongoshell 助手db.serverStatus()在其输出中包括shardingStatistics。shardingStatistics包括关于分片集群上元数据刷新的数据。 mongoshell 辅助程序db.collection.drop()接受写关注选项。- 对于在会话中创建的光标,您无法在会话之外调用
getMore。同样,对于在会话之外创建的光标,您无法在会话中调用getMore。 dbHash命令在其输出中包含以下字段:capped列出大写集合的字段uuids包含集合及其对应的UUID的字段。
killOp命令现在支持终止在mongos上运行的查询。当在mongos上运行时,killOp可以杀死在多个碎片中运行的查询。
地理空间查询改进
- 地理空间查询运算符
$near和$nearSphere现在支持对分片集合进行查询。 - 从MongoDB 4.0起,
$geoNear聚合运算符和geoNear命令支持使用带有2d索引的minDistance选项。同样,$near和$nearSphere支持2d索引的$minDistance选项。以前,minDistance和$minDistance仅适用于2dsphere索引。 - MongoDB 4.0为
$geoNear聚合运算符和geoNear命令添加了一个key选项,使用户能够在查询具有多个地理空间索引的集合时指定要使用的地理空间索引。以前,要使用$geoNear聚合运算符或geoNear命令,集合只能有一个地理空间索引。
网络层改进
- 对于参数
taskExecutorPoolSize,请将默认值更改为1。 - 添加新参数AsyncRequestsSenderUseBaton当使用单个
Task Executor connection pool时,在Linux上启用对mongos上的散射/收集操作进行性能优化。 - 添加了以下参数来管理连接池:
配置选项
mongos支持:
杂项
- 默认情况下,JavaScript引擎的JIT编译器现在被禁用。
- 将MozJS升级到ESR 45.9.0。
- 将
RECOVERY组件添加到日志消息中。 - MongoDB 4.0 增加了对使用
appName连接字符串的选项支持,用于在从mongo shell 连接时设置自定义应用程序名称。以前,只有MongoDB驱动程序支持使用appName设置自定义值,mongo shell 使用默认MongoDB Shell 值作为应用程序名称。 - 添加
mongoshell 方法convertShardKeyToHashed()以返回文档的哈希值。 - 按照配置解析
localhostIP地址,而不是假设127.0.0.1。 - 当使用 DNS Seed List Connection Format 通过身份验证连接到mongo shell 时,mongo shell 现在会在启动时提示用户提供密码。
影响兼容性的变化
一些更改可能会影响兼容性,可能需要用户采取行动。有关兼容性更改的详细列表,请参阅MongoDB 4.0中的兼容性更改。
升级程序
功能兼容性版本
要升级,3.6实例必须将
featureCompatibilityVersion设置为3.6。要检查版本:db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )有关验证和设置
featureCompatibilityVersion的具体详细信息,以及有关升级的其他先决条件/考虑的信息,请参阅单独的升级说明:
如果您需要升级到4.0的指导,MongoDB提供主要版本升级服务帮助确保顺利过渡到您的MongoDB应用程序而不中断。
下载
要下载MongoDB 4.0,请转到MongoDB下载中心
另见:
4.0.3中的已知问题
- WT-4018:MongoDB 4.0可能会在macOS 10.12.x、10.13.x和10.14.0的不干净关机期间丢失数据。Apple 在 macOS 10.14.1 中修复了这个问题。
- 服务器-35431:回滚后,
collStats和dbStats输出中报告的“dataSize”字段可能不准确。
4.0.2中的已知问题
- WT-4018:MongoDB 4.0可能会在macOS 10.12.x、10.13.x和10.14.0的不干净关机期间丢失数据。Apple 在 macOS 10.14.1 中修复了这个问题。
- 服务器-35431:回滚后,
collStats和dbStats输出中报告的“dataSize”字段可能不准确。 - 服务器-35657:使用具有单成员副本集的多文档事务可能会对性能产生重大影响。单成员复制集仅应用于测试/开发目的,不建议用于生产。
笔记:
单成员副本集上的多文档事务性能并不表示具有多个成员的副本集的性能。
4.0.1中的已知问题
- WT-4018:MongoDB 4.0可能会在macOS 10.12.x、10.13.x和10.14.0的不干净关机期间丢失数据。Apple 在 macOS 10.14.1 中修复了这个问题。
- 服务器-35431:回滚后,
collStats和dbStats输出中报告的“dataSize”字段可能不准确。 - 服务器-35657:使用具有单成员副本集的多文档事务可能会对性能产生重大影响。单成员复制集仅应用于测试/开发目的,不建议用于生产。
笔记:
单成员副本集上的多文档事务性能并不表示具有多个成员的副本集的性能。
4.0.0中的已知问题
- 工具-1952:运行MongoDB 4.0的用户
mongodump与之前的版本相比,性能可能会较慢。跑步mongodump使用--forceTableScan可以解决性能问题。 - 工具-2058:
mongoreplay没有显示MongoDB 4.0的插入/查找命令。# 修复在4.0.1 - WT-4018:MongoDB 4.0可能会在macOS 10.12.x、10.13.x和10.14.0的不干净关机期间丢失数据。Apple 在 macOS 10.14.1 中修复了这个问题。
- 服务器-35431:回滚后,
collStats和dbStats输出中报告的“dataSize”字段可能不准确。 - 服务器-35657:使用具有单成员副本集的多文档事务可能会对性能产生重大影响。单成员复制集仅应用于测试/开发目的,不建议用于生产。
笔记:
单成员副本集上的多文档事务性能并不表示具有多个成员的副本集的性能。
- 服务器-35758:如果您使用与全局对象关联的会话来运行事务,则
mongoshell 中的shell提示符将导致错误
报告问题
要报告问题,请参阅https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports关于如何为MongoDB服务器或相关项目之一提交JIRA票据的指导。
译者:韩鹏帅 参见