翻译或纠错本页面

MongoDB 3.4 发布笔记

MongoDB 3.4 发布于2016年11月29日

MongoDB 3.4 已经上线。 关键功能包括:线性读关注、视图以及collation。

OpsManager 3.4 也已经上线。 查阅 Ops Manager documentationOps Manager release notes 了解更多信息。

分片集群

成员意识

从3.4 开始,分片集群组件(分片、配置服务器、 mongos 实例)可以识别分片集群中的隶属关系,包括分片集群的名称以及配置服务器的位置。

为了支持这种认知:

  • shardsvr 需求

    对于一个3.4 分片集群, 分片的 mongod 实例 必须 显式指定它的角色为一个 shardsvr ,可以通过配置文件设置 sharding.clusterRole 或者通过命令行选项 --shardsvr 进行指定。

    注解

    shardsvr 角色的 mongod 实例的默认端口为 27018 。 如果需要使用一个不同的端口, 指定 net.port 设置或者 --port 选项。

  • 3.4 版本 mongos 与之前版本 mongod 的不兼容性

    3.4 版本的 mongos 实例不能连接到之前版本的 mongod 实例。

配置服务器主节点上的均衡器

均衡器进程已经从 mongos 迁移到配置服务器复制集的主节点成员上。 与这个修改相关的有:

更快的均衡

从MongoDB 3.4 开始:

  • 对于 WiredTiger <storage-wiredtiger> , 所有块迁移的 ``secondaryThrottle` 默认值是 false 。均衡器不会等待复制到从节点,相反,她会继续处理下一个文档。

  • MongoDB 可以执行并行的块迁移。 和之前的版本类似,一个分片一次最多可以参与一次迁移。 基于这个限制,对于一个 n 块分片的集群,MongoDB最多可以执行 n/2 (向下舍入)个同步块迁移。

删除对SCCC配置服务器的支持

3.4 分片集群不再支持 镜像 (SCCC) mongod 实例作为配置服务器的使用。 SCCC配置服务器的使用在3.2版本中已经过期,不再有效。相反地,将您的配置服务器部署为一个复制集(CSRS)。

如果想将您的分片集群升级到3.4版本,配置服务器必须运行为一个复制集。

为了将您现有的配置服务器从SCCC转为CSRS,请查阅 Upgrade Config Servers to Replica Set

分片区域

MongoDB 3.4 引入了 区域 , 替代了之前版本中提供的基于tag的分片。

为了支持区域,MongoDB 引入了下列命令以及 mongo shell帮助:

命令

mongo Shell 方法

addShardToZone sh.addShardToZone()
removeShardFromZone sh.removeShardFromZone()
updateZoneKeyRange

复制集

Default Journaling Behavior of majority Write Concern

如果 写入关注没有指明 j 选项, 一个新的复制集配置设置 writeConcernMajorityJournalDefault 决定写关注 majority 的确认是否在大多数投票节点将写入运用到内存之后或者磁盘上的日志之后返回。

新选举主节点的可调节catchup时间

一个新的复制集配置设置 settings.catchUpTimeoutMillis 定义了一个新选举的主节点与其它有最近写入的复制集成员保持一致的时间限制。

线性读关注

MongoDB 3.4 引入了一个读关注等级 readconcern:“linearizable” 来在读取操作开始之前读取数据,这些数据反映了 "majority" 以及 确认的所有成功写入。线性读关注保证只会应用于读操作指定一个唯一指定单一文档的查询过滤器的情况下。

线性读操作适用于所有支持 storage engines 的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
} )

了解更多关于读关注的信息,包括支持读关注的操作,请查阅 Read Concern

改进的初始化同步

  • MongoDB 3.4 通过在复制文档的过程中初始化同步构建索引,提高了 initial sync 的性能。

  • MongoDB 3.4 改进了 initial sync retry logic 更弹性地处理网络中断断续续故障的情况。

  • 修改的 rs.status() output 报告 初始同步状态和进程。

十进制烈性

3.4 通过使用新的 decimal 数据类型增加了对 decimal128 format 的支持。decimal128 形式支持最多 34个十进制数(例如,有效位数) 以及指数范围 −6143 到 +6144 的支持。

为了支持这种形成, mongo shell增加了 NumberDecimal 包装器。

db.inventory.insert( {_id: 1, item: "The Scream", price: NumberDecimal("9.99"), quantity: 4 } )

在不同的数值类型之间执行 comparisons 时, MongoDB直接在实际存储的数值上进行比较,不会先将数值转化到同一个类型。

不像 double 数据类型,只存储十进制值的近似值, decimal 数据类型存储精确值。 例如, decimal NumberDecimal("9.99") 存储为精确值 9.99 ,但是 double 9.99 将会存储为近似值 9.9900000000000002131628...

为了测试 decimal 类型,在 $type 中使用 文字 l "decimal" 或者 19

db.inventory.find( { price: { $type: "decimal" } } )

为了在MongoDB驱动程序中使用新的 decimal 数据类型,需要升级到支持这个功能的驱动程序版本。

聚合

改进重塑文档的新聚合阶段

3.4 在 aggregation pipeline 中引入了新阶段以帮助替换文档以及增加新的字段。

阶段

描述

$addFields

向文档中增加新字段。 这个阶段输出包含输入文档中所有已有字段以及新增加字段的文档。

$addFields

使用指定文档替换文档。您可以指定一个嵌入在输入文档中的文档,并将其提升到最高级别。

计数的新聚合阶段

3.4 在 aggregation pipeline 中引入了一个新的阶段来帮助统计文档。

阶段

描述

$count

返回一个文档,包含输入到该阶段的文档数目的计数。

新的聚合数组操作

操作符

描述

$in

返回指示某一个特定值是否存在于数组中的布尔值。

$in

检索数组是否存在某个特定值,并且返回第一次出现该值的数组索引(从0开始计数)。

$range

返回一个数组,数组元素为数字的生成顺序。

$reverseArray

返回一个输出数组,数组元素为输入数组,但是为逆序。

$reduce

将一个数组作为输入,然后对数组中的每一个元素执行一个表达式,然后返回表达式的最后结果。

$zip

返回一个输出数组,每个元素都是都是它本身,由输入数组中对应数组索引位置的元素组成。

新的聚合字符串操作符

操作符

描述

$indexOfBytes

在字符串中检索一个子字符串,并且返回第一次出现该子字符串的UTT-8字节索引(从0开始计数)。

$indexOfCP

在字符串中检索一个子字符串,并且返回第一次出现该子字符串的UTT-8 code point 索引(从0开始计数)。

$split

使用一个指定的分隔符将字符串分割为字符组件,并且返回字符串组件的数组。

$strLenBytes

返回字符串的UTF-8字节数。

$strLenCP

返回字符串的 UTF-8 code points 数。

$substrBytes

返回一个字符串的子字符串。该子字符串从字符串中指定的UTF-8字节索引(从0开始计数)对应的字符开始到指定的长度为止。

$substrCP

返回一个字符串的子字符串。该子字符串从字符串中指定的UTF-8 code point 索引(从0开始计数)对应的字符开始到指定的长度为止。

新的集合控制流表达式

操作符

描述

$switch

依次判断指定分支的 case 表达式,进入第一个 case 表达式计算为 true 的第一个分支。

新的日期聚合操作符

操作符

描述

$isoDayOfWeek

返回 ISO 8601 工作日编号,从 1 (表示星期一)到 7 (表示星期日)。

$isoWeek

返回 ISO 8601 星期编号,范围从 153 。 包含该年第一个周二的那一周(从周一到周日)的星期编号为 1

$isoWeekYear

返回 ISO 8601 年编号,其中 年 从第一周(ISO 8601)的周一开始,于最后一周(ISO 8601)的星期日结束。

新的监控聚合资源

操作符

描述

$collStats

返回一个集合或试图的统计。

新的类型操作符

操作符

描述

$type

返回一个表示参数 BSON 类型 的字符串。

其它变化

$project 阶段增加了排除输出文档中某些字段的支持。 之前,您只可以在该阶段排除 _id 字段。如果你指定排除一个字段或者几个字段,

  • 所有其它字段都会在输出文档中返回。

  • 您不可以指定新字段或者包含其它字段。

视图

MongoDB 3.4 增加了对现有集合或其它视图创建只读视图的支持。为了指定或定义一个视图,MongoDB 3.4 引入了:

  • 向现有的 create 命令 增加 viewOnpipeline 选项:

    db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline> } )
    

    或者指定视图的一个默认的 collation

    db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
    
  • 和一个对应的 mongo shell帮助 db.createView()

    db.createView(<view>, <source>, <pipeline>, <collation>)
    

请查阅 Views 了解关于创建视图的更多信息。

安全性提高

转换到授权

MongoDB 3.4 增加了复制集和分片集群滚动转换到内部认证的支持。 查阅 security.transitionToAuth 配置和 mongodmongos 中命令行选项 --transitionToAuth 的更多细节。

MongoDB工具

mongoreplay

MongoDB引入了 mongoreplay ,一个替代 mongosniff 的工作负载获取和分析工具。 你可以使用 mongoreplay 来检查和记录发送到MongoDB实例的命令,然后过一段时间之后将命令重放发送到另外一个主机上。

一般改进

MongoDB 3.4 包括下列改进:

平台支持

  • MongoDB 3.4 引入了对 ARM64, PPC64LE, 以及 s390x 架构的支持。 查阅 支持平台 查阅完成的平台支持矩阵。

  • 警告

    3.4 与IBM Power系统上的Ubuntu16.04 不兼容

    由于 lock elision bug in glibc , 如果系统运行在IBMPower系统的Ubuntu16.04上,在 glibc 版本修复可用并且安装了对应的版本之前,请不要在生产系统中使用MongoDB3.4.

MongoDB企业版功能

日志编校

MongoDB 企业版增加了 MongoDB的 encrypted storage engine 与日志编校同时使用的支持。 日志编校防止了敏感信息被写入到诊断日志中的潜在可能性。然而,由于日志事件相关数据的缺失,在编校日志上的诊断将会变得更加困难。

为了开启日志编校,请查阅 mongod 中 的 security.redactClientLogData 设置和 --redactClientLogData 选项。

LDAP 增强

LDAP 认证

MongoDB 企业版支持 Lightweight Directory Access Protocol (LDAP) service to authorize (i.e. determine access) 的使用,可以通过以下的认证机制之一对用户进行认证:

查阅 LDAP Authorization 了解更多信息。

mongoldap

MongoDB企业版提供了一个新工具 mongoldap 用于测试您的MongoDB LDAP configuration options 运行在一个运行的LDAP服务器或一系列服务器上。当配置 LDAP authentication <security-ldap> 相关的选项时,你可以使用 mongoldap 保证认证操作正常进行。

通过操作系统库绑定

MongoDB 3.4 支持通过操作系统库 binding to an LDAP server 。这就允许 Linux和Windows的MongoDB 3.4服务器使用LDAP用于认证。

Linux MongoDB部署仍然支持通过 saslauthd 绑定。

Known Issues in 3.4.0

List of known issues in the 3.4.0 release: