- 发布笔记 >
- MongoDB 3.4 发布笔记
MongoDB 3.4 发布笔记¶
本页内容
MongoDB 3.4 发布于2016年11月29日
MongoDB 3.4 已经上线。 关键功能包括:线性读关注、视图以及collation。
OpsManager 3.4 也已经上线。 查阅 Ops Manager documentation 和 Ops Manager release notes 了解更多信息。
分片集群¶
成员意识¶
从3.4 开始,分片集群组件(分片、配置服务器、 mongos 实例)可以识别分片集群中的隶属关系,包括分片集群的名称以及配置服务器的位置。
为了支持这种认知:
- shardsvr 需求
对于一个3.4 分片集群, 分片的 mongod 实例 必须 显式指定它的角色为一个 shardsvr ,可以通过配置文件设置 sharding.clusterRole 或者通过命令行选项 --shardsvr 进行指定。
配置服务器主节点上的均衡器¶
均衡器进程已经从 mongos 迁移到配置服务器复制集的主节点成员上。 与这个修改相关的有:
CSRS 配置服务器的主节点持有 "balancer" 锁,使用的进程ID为 "ConfigServer" ,永不释放。
MongoDB 3.4增加了:
balancerStart 命令,并且更新了3.4 的 mongo shell方法 sh.startBalancer() 来封装新命令。 3.2 或之前版本的 mongo shell方法 sh.startBalancer() 与3.4分片集群不兼容。
balancerStop 命令,并且更新了 3.4 的 mongo shell 方法 sh.stopBalancer() 来封装新命令。 3.2 或之前版本的 mongo shell方法 sh.stopBalancer() 与3.4分片集群不兼容。
balancerStatus 命令。
mongo shell 方法 sh.getBalancerHost() 已经在 MongoDB 3.4 中不适用。 3.2 或之前版本的 mongo shell方法 sh.getBalancerHost() 与3.4分片集群不兼容。
MongoDB 3.4 删除了 mongos 中的以下配置选项:
sharding.chunkSize 配置文件设置以及 --chunkSize 命令行选项
sharding.autoSplit 配置文件设置以及 --noAutoSplit 命令行选项
更快的均衡¶
从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 中引入了一个新的阶段支持遍历搜索。
阶段 |
描述 |
---|---|
$graphLookup | 在集合上执行一次遍历搜索。对于每一个输出的文档,增加一个包含针对该文档遍历搜索遍历结果的新数组字段。 |
分成检索的新聚合阶段¶
分层搜索支持文档类别的分类。例如,给定一个目录文档集合,您也许希望通过一个单一的类别对物品进行分类,例如通过价格范围或者多个类别进行分配,例如通过价格范围以及单独通过部门。
3.4 在 aggregation pipeline 中引入了新的阶段支持 分层搜索。
阶段 |
描述 |
---|---|
$bucket | 将接下来的文档分类或分组到代表某一指定表达式范围值的篮子中。 |
$bucketAuto | 将接下来的文档分类或分组到代表某一指定表达式范围值的篮子中。MongoDB自动确定篮子范围。 |
$facet | 对输入文档进行多 pipelines 处理,输出包含这些管道结果的文档。通过在这些管道中指定分层相关的阶段($bucket , $bucketAuto ,以及 $sortByCount ), $facet 支持多分层检索。 |
$sortByCount | 将结写来的文档通过一个指定的表达式进行分类或分支以计算每组的计数。根据计数的降序排列输出这些文档。 |
改进重塑文档的新聚合阶段¶
3.4 在 aggregation pipeline 中引入了新阶段以帮助替换文档以及增加新的字段。
阶段 |
描述 |
---|---|
$addFields | 向文档中增加新字段。 这个阶段输出包含输入文档中所有已有字段以及新增加字段的文档。 |
使用指定文档替换文档。您可以指定一个嵌入在输入文档中的文档,并将其提升到最高级别。 |
新的聚合数组操作¶
操作符 |
描述 |
---|---|
$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开始计数)对应的字符开始到指定的长度为止。 |
新的日期聚合操作符¶
操作符 |
描述 |
---|---|
$isoDayOfWeek | 返回 ISO 8601 工作日编号,从 1 (表示星期一)到 7 (表示星期日)。 |
$isoWeek | 返回 ISO 8601 星期编号,范围从 1 到 53 。 包含该年第一个周二的那一周(从周一到周日)的星期编号为 1 。 |
$isoWeekYear | 返回 ISO 8601 年编号,其中 年 从第一周(ISO 8601)的周一开始,于最后一周(ISO 8601)的星期日结束。 |
新的监控聚合资源¶
操作符 |
描述 |
---|---|
$collStats | 返回一个集合或试图的统计。 |
校对及大小写敏感的索引¶
为了支持字符串比较中面向语言的特定规则,MongoDB 3.4 向查询语言和索引引入了 collation 。
下面的操作支持校对:
命令 |
mongo Shell 方法 |
---|---|
create | |
createIndexes | db.collection.createIndex() |
aggregate | |
distinct | db.collection.distinct() |
findAndModify | |
find | cursor.collation() 用于指明 db.collection.find() 的校对 |
mapReduce | db.collection.mapReduce() |
delete | |
update | |
单个的更新、替换以及删除 db.collection.bulkWrite() 中的操作。 |
请查阅 Collation 了解更多细节。
视图¶
MongoDB 3.4 增加了对现有集合或其它视图创建只读视图的支持。为了指定或定义一个视图,MongoDB 3.4 引入了:
向现有的 create 命令 增加 viewOn 及 pipeline 选项:
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 配置和 mongod 及 mongos 中命令行选项 --transitionToAuth 的更多细节。
MongoDB工具¶
mongoreplay¶
MongoDB引入了 mongoreplay ,一个替代 mongosniff 的工作负载获取和分析工具。 你可以使用 mongoreplay 来检查和记录发送到MongoDB实例的命令,然后过一段时间之后将命令重放发送到另外一个主机上。
一般改进¶
MongoDB 3.4 包括下列改进:
在分布中增加了 systemd 支持。
将 diagnosticDataCollectionDirectorySizeMB 默认大小从 100 megabytes 提高到了 200 megabytes。
降低了 WiredTiger internal cache 的默认设置及下界。 WiredTiger Storage Engine internal cache 和 inMemory Storage Engine maximum memory size 都可以接受浮点值。
find() , aggregate() , listIndexes , 以及 listCollections 操作返回 maximum of 16 megabytes per batch 。
db.currentOp() 以及 database profiler 记录了所有CRUD操作相同的基本诊断信息,包括以下内容。
- aggregate
- count
- delete
- distinct
- findAndModify
- geoNear
getMore ( OP_GET_MORE 以及 command )
- group
- mapReduce
- update
这些操作也包括在慢查询的日志中(查阅 slowOpThresholdMs 了解关于慢查询日志的更多信息)。
mongo shell 增加了对类型 javascript 和 javascriptWithScope 解组字段到JavaScript函数的支持。 查阅 --disableJavaScriptProtection 。
增加了对系统认证的支持。 如果 一个 mongod 实例有一个操作系统信任的CA认证, mongo shell将会不报错地连接。之前, mongo shell将会因为一个不能验证认证的错误而退出。
平台支持¶
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 Proxy Authentication 。查阅 Authenticate and Authorize Users Using Active Directory via Native LDAP 了解同时使用LDAP认证和授权的指南。
Kerberos Authentication 。查阅 Configure MongoDB with Kerberos Authentication and Active Directory Authorization 了解使用Kerberos 认证和自动目录的指南。
x.509 。
查阅 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 绑定。
影响兼容性的修改¶
一些修改可能会影响兼容性,需要用户操作。查阅 MongoDB 3.4 中的兼容性变化 了解兼容性改变的详细列表。
升级流程¶
If you need guidance on upgrading to 3.4, MongoDB offers major version upgrade services to help ensure a smooth transition without interruption to your MongoDB application.
Known Issues in 3.4.0¶
List of known issues in the 3.4.0 release:
- SERVER-27124: protocolVersion: 0 cannot properly support "majority" read concern.
- SERVER-27195: Using collation with documents containing fields of BSON type Symbol, which is deprecated, is not supported and may lead to undefined behavior.
- SERVER-27207: Find on view with sort through mongos may incorrectly return empty result set.