新特性
安全
bindIp
默认值改为了localhost .
用默认值启动会报warning如下:
** WARNING: This server is bound to localhost.
** Remote systems will be unable to connect to this server.
** Start the server with --bind_ip
to specify which IP** addresses it should serve responses from, or with --bind_ip_all to
** bind to all interfaces. If this behavior is desired, start the
** server with --bind_ip 127.0.0.1 to disable this warning.
提供线上使用,因此不能在这里限制访问的IP,所以解决办法有如下:
1、在启动的时候加上 --bind_ip_all
2、在配置文件中加入net.bindIp: 0.0.0.0 【线上使用】
3、在配置文件中加入net.bindIpAll: true
MONOGDB-CR认证
建议在3.6版将认证机制MONOGDB-CR更新为SCRAM,后续的版本将不再支持MONOGDB-CR认证机制。
据说在3.4版本的时候使用SCRAM认证机制有问题【高并发短连接负载标高】--有待验证
SCRAM认证机制的优点:
1、更强的哈希函数SHA-1。
2、服务器到客户端以及客户端到服务器的双向身份验证。
身份认证限制(authenticationRestrictions【控制IP白名单】)
在db.createuser()、db.updateuser() 、db.createrole()、db.updaterole()四个命令中增加authenticationRestrictions了参数,用来控制客户端的ip和客户端访问服务端的IP。
clientSource:针对客户端的IP做白名单控制 【指的是可以通过哪些IP进行连接】
serverAddress:针对服务端的IP做白名单控制【指的是客户端在连接过来的时候指定的host,例如:mongo --host=192.168.56.101,那么serverAddress 就必须包含192.168.56.101】
这里的白名单也可以是B或者C网段,和MySQL的写法有出入。MySQL中是:192.168.56.%,MongoDB 中是:192.168.56.0/24
例子:
添加新用户【设置客户端IP白名单】
db.createUser(
{
user: "test",
pwd: "test",
roles: [ {role: 'readWrite', db: 'test'} ],
authenticationRestrictions: [ {
clientSource: ["192.168.222.164"]
} ]
}
)
修改用户
db.updateUser(
"test",
{
pwd: "test",
roles: [ {role: 'readWrite', db: 'test'} ],
authenticationRestrictions: [
{
clientSource: ["10.136.222.164"]
} ],
}
)
此时发现在非给定的IP白名单的机器进行连接对应的MongoDB是失败的。
2018-08-23T11:08:24.235+0800 E QUERY [thread1] Error: Authentication failed. :
DB.prototype._authOrThrow@src/mongo/shell/db.js:1608:20
@(auth):6:1
@(auth):1:2
exception: login failed
其他安全控制
- opensslcipherconfig
在使用TLS/SSL时,添加了opensslcipherconfig参数控制openssl密码。
- 在服务端认证开启的情况下,可以控制用户只能发出一个游标。
- 增加了converttocapped方法,可将普通集合转换成固定集合。
JSON SCHEMA
$jsonschema 是MongoDB3.6新增的操作符, 可在建表的时候用来添加约束条件,譬如可限制字段的类型、长度、范围、是否必须等。
副本集
replSetResizeOplog
添加了命令replSetResizeOplog,WiredTiger存储引擎可以动态调整oplog的大小。
废弃了副本集协议版本protocol version 0(pv0)
pv0和pv1的不同 - 写关注
写关注
pv0
pv1
local
✓
✓
majority
✓
linearizable
✓
✓
- 监督者
对于有监督者的副本集,pv1相对于pv0增加了写关注w:1发生回滚的可能性。
- 投票
pv0基于成员的optime和properity来允许成员一票否决投票。
pv1不使用否决。单个成员可以在特定选举投票赞成或反对选举人,但不能一票否决(终止)选举。
- 二次投票
pv1使用了terms来防止在一次选举中投两次票的情况。
pv0通过30秒缓冲时间减少了两次投票的可能性,但是这不能保证如果选举超过了30秒,成员不会投两次票。
- 总结
pv0
pv1
w:1 写
优先保存
增加了回滚w:1写操作的可能性,可通过catchUpTimeoutMillies设置调整
w: “majority”写
可能丢失w: “majority”写确认
保证不丢失”majority”写确认
没有主节点
更有可能
不太可能
一票否决
支持
不需要
连续选举
不频繁,30秒缓冲
更可能发生,没有缓冲
监督者
不太可能丢失w:1写操作
更可能丢失w:1写操作
catchUpTakeoverDelayMillis
添加了catchUpTakeoverDelayMillis配置选项,指定节点在发起选举之前等待的时间,默认30秒,如超过这个时间该节点的数据仍是最新的,且当前主节点在追赶他,则立刻启动选举。
对于使用协议版本1(pv1)的副本集,如果仲裁人发现与候选人有相同或更高优先级的节点在,他们将在选举中投票反对票。
oplogInitialFindMaxSeconds
添加oplogInitialFindMaxSeconds参数来调整复制集的成员在数据同步期间使用find命令等待的时间。默认60s。
waitForSecondaryBeforeNoopWriteMS
增加了waitForSecondaryBeforeNoopWriteMS参数,以指定如果afterClusterTime大于oplog的最近应用时间,则secondary服务器必须等待多长时间。默认10毫秒。
在复制集有成员初始化的时候,支持renamecollection(),converttocapped,$out,Map-reduce
支持在线添加认证
分片集群
分片集群必须是副本集。
ShardingTaskExecutorPoolMaxConnecting
添加了ShardingTaskExecutorPoolMaxConnecting参数,控制mongos将连接添加到mongod的速率,默认是2。
orphanCleanupDelaySecs
添加了orphanCleanupDelaySecs,以配置主片在删除已迁移快前的最小延迟。
config数据库中的config.system.sessions表可以做分片了。
索引
索引可以覆盖嵌套字段的查询。
如某字段变成多键字段,多键索引可以覆盖非数组键的查询。
索引名中不能包含*符号。
删除项
删除了HTTP接口和REST API
net.http.enabled
net.http.JSONPEnabled
net.http.port
net.http.RESTInterfaceEnabled
更新操作
更新操作添加列按照字典顺序排列。【只对新添加的列】
例子
原集合
{ "_id" : 0, "x" : 0 }
{ "_id" : 1, "c" : 1 }
更新操作
db.coll.update({_id: 0}, {$set: {b: 0, a: 0}})
3.6更新后的集合
{ "_id" : 0, "x" : 0, "a" : 0, "b" : 0 }
{ "_id" : 1, "c" : 1 }
早期版本更新后的集合
{ "_id" : 0, "x" : 0, "b" : 0, "a" : 0 }
{ "_id" : 1, "c" : 1 }
聚合
$lookup
在3.6中配合fron、let、pipeline、as可以更好的做连接查询和子查询,具体的用法可参考官网。
增加新的聚合stages
$currentOp 列出实例上的活动和/或休眠操作的信息
$listSessions 列出config数据库中system.sessions集合中的服务器会话
$listLocalSessions 列出服务器在内存中缓存的服务器会话。
增加新的聚合操作
$arrayToObject 将数组转换成文档
$objectToArray 将文档转换成数组
$mergeobject 合并文档
$datefromstring 根据字符串条件转换date
$datefromparts 根据给定条件组成date
$datetoparts 将date转换成一个个条件
聚合帮助 db.aggregate()
用户执行不依赖于底层集合的聚合,例如以$currentOp或$listLocalSessions开头的集合。
新的聚合变量remove
用以删除聚合中符合指定条件的字段。
aggregate命令和db.collention.aggregate()支持hint和comment两个新选项
- hint
指定要使用的索引。
不适用于$ lookup和$graphLookup
- comment
帮助通过数据库探查器、currentOp和logs跟踪操作。
Time Zones
MongoDB 3.6聚合操作支持Time Zones。