MongoDB 3.4的发布说明
MongoDB 3.4 发布于 2016 年 11 月 29 日
MongoDB 3.4现已推出。主要功能包括线性化的阅读问题、视图和排序。
分片群集
会员意识
从3.4开始,分片集群组件(碎片、配置服务器、mongos实例)识别其在分片集群中的成员资格,包括分片集群的名称、配置服务器的位置。
为了支持这种意识:
shardsvr需求对于3.4
mongod分片群集,分片实例必须shardsvr通过配置文件设置sharding.clusterRole或通过命令行选项 明确将其角色指定为a--shardsvr。
注意:
具有
shardsvr角色的mongod实例的默认端口为27018。要使用其他端口,请指定net.port设置或--port选项。
3.4 mongos与早期版本不兼容mongod
版本3.4 mongos实例无法连接到早期版本的mongod实例。
平衡器上配置服务器主
平衡器进程已从移到mongos配置服务器副本集的主要成员。与此更改相关联:
- CSRS配置服务器的主服务器
"balancer"使用名为的进程ID 持有该锁,该锁"ConfigServer"从未释放。 - MongoDB 3.4添加了:
balancerStart命令并更新3.4mongoshell方法sh.startBalancer()以包装新命令。3.2或更早版本的mongoShell方法sh.startBalancer()与3.4分片群集不兼容。balancerStop命令并更新3.4mongoshell方法sh.stopBalancer()以包装新命令。3.2或更早版本的mongoShell方法sh.stopBalancer()与3.4分片群集不兼容。balancerStatus命令。
- MongoDB 3.4不赞成使用
mongoshell方法sh.getBalancerHost()。3.2或更早版本的mongoShell方法sh.getBalancerHost()与3.4分片群集不兼容。 - MongoDB 3.4从中删除了以下配置选项
sharding.chunkSize配置文件设置和--chunkSize命令行选项sharding.autoSplit配置文件设置和--noAutoSplit命令行选项
更快的平衡
从MongoDB 3.4开始:
- 对于WiredTiger,所有块迁移的默认值
secondaryThrottle为false。平衡器不会等待复制到辅助文件,而是继续下一个文档。 - MongoDB可以执行并行块迁移。与早期版本类似,碎片一次最多可以参与一次迁移。遵守这一限制,对于带有n个碎片的碎片集群,MongoDB最多可以同时执行n/2(四舍五入)块迁移
取消对SCCC配置服务器的支持
3.4 分片集群不再支持使用镜像(SCCC)mongod实例作为配置服务器。3.2版本中不建议使用的SCCC配置服务器不再有效。相反,将您的配置服务器部署为副本集(CSRS)。
要将分片集群升级到3.4版本,配置服务器必须作为副本集运行。
要将现有配置服务器从SCCC转换为CSRS,请参阅将配置服务器升级到复制集。
分层区
MongoDB 3.4引入了区域,它取代了早期版本中可用的标签感知分片。
为了支持区域,mongoDB引入以下命令和mongo shell helper
| 命令 | mongoshell方法 |
|---|---|
addShardToZone |
sh.addShardToZone() |
removeShardFromZone |
sh.removeShardFromZone() |
updateZoneKeyRange |
sh.updateZoneKeyRange()sh.removeRangeFromZone() |
复制集
majority书写问题的默认日志行为
新的复制集配置设置writeConcernMajorityJournalDefault确定,在大多数投票成员在内存中应用写入后返回对majority问题的确认,还是在写入问题中未指定j选项,则返回到磁盘日志。
新当选初选的可调追赶期
一个新的副本集配置settings.catchUpTimeoutMillis定义了新当选的初选成员赶上其他可能具有最新写入的副本集成员的时间限制。
线性阅读关注
MongoDB 3.4引入了"linearizable"读取数据的读取关注级别,该级别反映了所有以"majority"发布并在读取操作开始之前确认的成功写入。线性可读问题保证仅在读取操作指定唯一标识单个文档的查询过滤器时适用。
所有MongoDB支持的存储引擎都可以使用线性读取问题。
结合"majority"写入关注,"linearizable"读取关注使多个线程能够在单个文档上执行读写,就像单个线程实时执行这些操作一样;也就是说,这些读写的相应时间表被认为是线性化的。
具有线性化读取关注的读取可能比具有"majority"或"local"阅读问题的阅读速度要慢得多。始终使用具有线性化读取关注的maxTimeMS,以防大多数数据轴承成员不可用。例如:
db.restaurants.find( { _id: 5 } ).readConcern("linearizable").maxTimeMS(10000)
db.runCommand( {
find: "restaurants",
filter: { _id: 5 },
readConcern: { level: "linearizable" },
maxTimeMS: 10000
} )
有关读取关注的更多信息,包括支持阅读关注的操作,请参阅阅读关注。
改进了初始同步
MongoDB 3.4通过在复制文档时进行初始同步构建索引,从而提高了初始同步的性能。
MongoDB 3.4改进了初始同步重试逻辑,以更好地抵御网络上的间歇性故障。
为了避免潜在的数据损坏,如果集合在初始同步期间重命名在同步源上,MongoDB 3.4将失败并重新启动初始同步。使用MongoDB 3.2.11或更低版本,初始同步没有失败并重新启动,而是继续该过程,这可能导致潜在的数据损坏。
有关详细信息,请参阅初始同步和
renameCollection。修改了
replSetGetStatus命令,以接受命令中的可选initialSync: 1,以报告初始同步状态和进度(如果在辅助运行)上运行:
db.adminCommand( { replSetGetStatus: 1, initialSync: 1 } )
小数式
3.4增加了对十进制128格式新的decimal数据类型。十进制128格式支持最多有34位小数(即有效数字)的数字,指数范围为-6143至+6144。
To support the format, the mongo shell adds the 数字十进制包装纸。
db.inventory.insert( {_id: 1, item: "The Scream", price: NumberDecimal("9.99"), quantity: 4 } )
在对不同数值类型进行比较时,MongoDB对精确存储的数字值进行比较,而无需首先将值转换为公共类型。
与仅存储十进制值近似值的double数据类型不同,decimal数据类型存储精确值。例如,decimal``NumberDecimal("9.99")的精确值为9.99,而作为双9.99,近似值为9.9900000000000002131628...
要测试decimal类型,请使用字面意思为"decimal"或19的$type运算符。
db.inventory.find( { price: { $type: "decimal" } } )
要将新的decimal数据类型与MongoDB驱动程序一起使用,需要升级到支持该功能的驱动程序版本。
集合
递归搜索的新聚合阶段
3.4为聚合管道引入了一个阶段,允许递归搜索。
| 角色 | 描述 |
|---|---|
$graphLookup |
对集合执行递归搜索。在每个输出文档中添加一个新的数组字段,其中包含该文档递归搜索的遍历结果。 |
另见:
面向多面搜索的新聚合阶段
刻面搜索允许将文档分类为分类。例如,给定库存文件的集合,您可能需要按单个类别(例如价格范围)或多个类别(如价格范围)以及部门单独分类项目。
3.4 引入聚合管道的阶段,允许多面搜索。
| 角色 | 描述 |
|---|---|
$bucket |
将传入的文档分类或分组到表示指定表达式的一系列值的存储桶中。 |
$bucketAuto |
将传入的文档分类或分组为指定数量的存储桶,这些存储桶表示指定表达式的值范围。MongoDB会自动确定桶边界。 |
$facet |
在输入文档上处理多个管道,并输出一个包含这些管道结果的文档。通过在这些管道中指定与facet相关的阶段($bucket、$bucketAuto和$sortByCount),$facet允许多方面的搜索。 |
$sortByCount |
通过指定的表达式对传入的文档进行分类或分组,以计算每个组的计数。输出文档按计数降序排序。 |
新的聚合阶段,以促进文档的重塑
3.4引入聚合管道的阶段,以便于替换文档以及添加新字段。
| 角色 | 描述 |
|---|---|
$addFields |
向文档添加新字段。该阶段输出包含输入文档中所有现有字段以及新添加字段的文档。 |
$replaceRoot |
将文档替换为指定的文档。您可以指定嵌入在输入文档中的文档,以将嵌入式文档提升到顶层。 |
新的汇总阶段要计数
3.4为聚合管道引入了一个新阶段,以便于计数文档。
| 角色 | 描述 |
|---|---|
$count |
返回一个文档,其中包含输入到阶段的文档数量。 |
新的聚合数组运算符
| 运算符号 | 描述 |
|---|---|
$in |
返回一个布尔值,指示指定值是否在数组中。 |
$indexOfArray |
在数组中搜索指定值的出现,并返回第一次出现的数组索引(基于零)。 |
$range |
返回一个数组,其元素是生成的数字序列。 |
$reverseArray |
返回一个输出数组,其元素是输入数组的元素,但顺序相反。 |
$reduce |
以数组为输入,并将表达式应用于数组中的每个元素,以返回表达式的最终结果。 |
$zip |
返回一个输出数组,其中每个元素本身都是一个数组,由输入数组中相应数组索引位置的元素组成。 |
新的聚合字符串运算符
| 运算符号 | 描述 |
|---|---|
$indexOfBytes |
搜索字符串中子字符串的出现,并返回第一次出现的UTF-8字节索引(基于零)。 |
$indexOfCP |
搜索字符串中出现子字符串,然后返回UTF-8代码点首次出现的索引(基于零)。 |
$split |
通过指定的分隔符将字符串拆分为字符串组件,并返回字符串组件的数组。 |
$strLenBytes |
返回字符串的UTF-8字节数。 |
$strLenCP |
返回UTF-8的编号代码点用于一根绳子。 |
$substrBytes |
返回字符串的子字符串。子字符串以指定长度的字符串中指定的UTF-8字节索引(基于零)的字符开头。 |
$substrCP |
返回字符串的子字符串。子字符串以指定UTF-8的字符开头代码点字符串中指定长度的索引(基于零)。 |
新的聚合控制流表达式
| 运算符号 | 描述 |
|---|---|
$switch |
按顺序计算指定分支的大小case表达式,以进入case表达式计算为true的第一个分支。 |
新日期聚合运算符
| 运算符号 | 描述 |
|---|---|
$isoDayOfWeek |
返回ISO 8601工作日编号,从1(周一)到7(周日)。 |
$isoWeek |
返回ISO 8601周号,从1到53不等。周数从包含今年第一个星期四的一周(周一至周日)开始。 |
$isoWeekYear |
返回ISO 8601年编号,该年从第1周的星期一(ISO 8601)开始,到上周的星期日结束(ISO 8601)。 |
新的监控聚合源
| 运算符号 | 描述 |
|---|---|
$collStats |
返回有关集合或视图的统计数据。 |
新型运营商
| 运算符号 | 描述 |
|---|---|
$type |
返回一个字符串,该字符串指定参数的BSON类型。 |
其他更改
$project阶段在输出文档中添加了对字段排除的支持。以前,您只能在阶段排除_id字段。如果您指定排除一个或多个字段,
- 所有其他字段都在输出文档中返回。
- 您无法指定新字段或包含其他字段。
整理和不区分大小写的索引
为了允许特定语言的字符串比较规则,MongoDB 3.4对其查询语言和索引进行了排序。
以下操作支持整理:
有关详细信息,请参阅整理。
| [1] | (1,2)一些索引类型不支持排序。有关详细信息,请参阅排序和不受支持的索引类型。 |
|---|---|
观点
MongoDB 3.4增加了对从现有集合或其他视图创建只读视图的支持。要指定或定义视图,MongoDB 3.4引入了:
现有
create命令的viewOn和pipeline选项:db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline> } )或者如果指定默认值校对供查看:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )and a corresponding
mongoshell helperdb.createView():db.createView(<view>, <source>, <pipeline>, <collation>)
有关创建视图的更多信息,请参阅视图。
安全增强
过渡到授权
MongoDB 3.4增加了对复制集和分片集群滚动过渡到内部身份验证的支持。有关详细信息,请参阅mongod和mongos的security.transitionToAuth设置和--transitionToAuth行选项。
另见:
用户角色变更
以下内置角色的特权不再适用于local和config数据库:
| 角色 | 更改 |
|---|---|
readAnyDatabase |
从3.4开始,要在local数据库上提供read权限,请在admin数据库中创建一个在local数据库中具有read角色的用户。另请参阅clusterManager和clusterMonitor角色,以访问config和local数据库。 |
readWriteAnyDatabase |
从3.4开始,要在local数据库上提供readWrite特权,请在local数据库中创建一个具有readWrite角色admin数据库中的用户。另请参阅clusterManager和clusterMonitor角色,以访问config和local数据库。 |
userAdminAnyDatabase |
|
dbAdminAnyDatabase |
从3.4开始,要在local数据库上提供dbAdmin特权,请在local数据库中创建一个具有dbAdmin角色的admin数据库中的用户。另请参阅clusterManager和clusterMonitor角色,以访问config和local数据库。 |
相应地,以下内置角色包括local和config数据库上的额外读写特权:
MongoDB工具
mongoreplay
MongoDB引入了mongoreplay,这是一个取代mongosniff的工作负载捕获和分析工具。您可以使用mongoreplay检查和记录发送到MongoDB实例的命令,然后稍后将命令重播到另一台主机上。
mongoreplay适用于Linux和macOS。
一般增强功能
MongoDB 3.4包括以下增强功能:
- 在分发中添加
systemd支持。 - 将
diagnosticDataCollectionDirectorySizeMB默认大小从100兆字节增加到200兆字节。 - 减少了
WiredTiger internal cache的下限和默认设置。WiredTiger Storage Engine internal cache和inMemory Storage Engine maximum memory size都可以接受浮点值。 find(),aggregate(),listIndexes, 和listCollections操作每批 最多返回16兆字节.
db.currentOp()数据库分析器报告所有 CRUD 操作的相同基本诊断信息,包括以下内容:
getMore(OP_GET_MORE和command)
这些操作也包含在慢查询的日志记录中(有关慢查询日志记录的更多信息,请参阅
slowOpThresholdMs)。mongoshell在JavaScript函数中添加了对编组类型为javascript和javascriptWithScope字段的支持。请参阅--disableJavaScriptProtection。增加了对系统证书的支持。如果
mongod实例提供了一个由操作系统信任的CA签名的证书,mongo shell将连接而没有任何错误。以前,mongo shell退出时出现无法验证证书的错误为副本集或分片集群成员之间的内部通信以及mongo shell和
mongod或mongos之间的通信增加连消息压缩支持。请参阅配置
net.compression.compressors设置以及mongod、mongos和mongoshell的--networkMessageCompressors选项
平台支持
- MongoDB 3.4引入了对ARM64、PPC64LE和s390xarchitectures的支持。请参阅平台支持以查看完整的平台支持矩阵。
- 从3.4版本开始,MongoDB取消了对Red Hat Enterprise Linux 5的支持。
对于支持Ubuntu 16.04POWER/PPC64LE的早期MongoDB Enterprise版本:
由于Ubuntu 16.04 for POWER上旧版本的glibc软件包中存在锁省略错误,在运行MongoDB之前,您必须将glibc软件包升级到至少glibc 2.23-0ubuntu5。具有旧版本的glibc软件包的系统将因随机内存损坏而遇到数据库服务器崩溃和不当行为,并且不适合MongoDB的生产部署
以下总结了最新版本MongoDB产品的支持架构:
| 产品 | x86_64/amd64 | s390x | POWER8(小端) | ARMv8-A |
|---|---|---|---|---|
| MongoDB 3.4 | ✓ | 仅限MongoDB企业 | 仅限MongoDB企业 | ✓ |
| BI连接器 | ✓ | ✓ | ✓ | |
| 指南针 | ✓ | |||
| Spark连接器 | ✓ | |||
| 运营经理 | ✓ | |||
| 自动化代理 | ✓ | ✓ | ||
| 监控代理 | ✓ | ✓ | ||
| 备份代理 | ✓ | ✓ |
有关详细信息,请参阅产品的个人文档。
MongoDB企业功能
日志编辑
MongoDB Enterprise增加了对日志编辑的支持,以便与MongoDB的加密存储引擎一起使用。日志编辑可以防止将潜在的敏感信息写入诊断日志;但是,由于缺乏与日志事件相关的数据,对编辑日志进行诊断可能更加困难。
要启用日志编辑,请参阅mongod的security.redactClientLogData设置和--redactClientLogData选项。
LDAP增强功能
LDAP授权
MongoDB Enterprise支持使用轻量级目录访问协议(LDAP)服务来授权(即确定访问权限)通过以下身份验证机制之一进行身份验证的用户:
- LDAP代理身份验证。有关使用LDAP身份验证和授权的教程,请参阅通过原生LDAP使用Active Directory对用户进行身份验证和授权。
- Kerberos身份验证。有关使用Kerberos身份验证和Active Directory的教程,请参阅使用Kerberos身份验证和Active Directory授权配置MongoDB。
- x.509。
有关更多信息,请参阅LDAP授权。
mongoldap
MongoDB Enterprise提供了一个新工具mongoldap,用于针对正在运行的LDAP服务器或一组服务器测试您的MongoDB LDAP配置选项。在配置与LDAP身份验证相关的选项时,您可以使用mongoldap来确保身份验证操作按预期运行。
通过操作系统库绑定
MongoDB 3.4支持通过操作系统库绑定到LDAP服务器。这允许Linux和Windows MongoDB 3.4服务器使用LDAP服务器进行身份验证。
Linux MongoDB部署继续支持通过萨斯劳特德。
影响兼容性的变化
一些更改可能会影响兼容性,可能需要用户采取行动。有关兼容性更改的详细列表,请参阅MongoDB 3.4中的兼容性更改。
升级程序
如果您需要升级到3.4的指导,MongoDB提供主要版本升级服务帮助确保顺利过渡到您的MongoDB应用程序而不中断。
下载
要下载MongoDB 3.4,请转到MongoDB下载中心
另见:
3.4.0中的已知问题
3.4.0版本中已知问题的列表:
- SERVER-27124:
protocolVersion: 0无法正确支持"majority"读取关注。 - SERVER-27195:使用包含不建议使用不建议使用的BSON类型
Symbol字段的文档进行整理,并可能导致未定义的行为。 - SERVER-27207:通过排序的视图查找可能会错误地返回空结果集。
- WT-3327:如果时间向后运行(例如,在时钟不可靠的系统上),检查站可能会挂起。(已修复在MongoDB 3.4.6.)
译者:韩鹏帅
参见