第十六天
今天开始事务的学习,要学习的章节为《19 | 事务开发:写操作事务》,其实主要就是讲一个参数writeConcern。
什么是 writeConcern ?
之前第一章我们学过,生产环境中MongoDB最少也是需要一个3结点的集群的。那么writeConert就是用于控制在数据写入时,数据写入多少个结点才算成功。
> db.test.insert({count: 1}, {writeConcern: {w: 3})
w参数
- 如果是数字,比如1、2、3等等就是表示需要写入多少个结点
- 当然如果超过结点的数量,写入的时候系统也会报错
- 如果是所有结点就写成 all
- 系统默认是 majority,即一半以上的结点数据写入成,才表示写入成功
- 如果0,即表示只要主结点写入成功,即表示数据保存成功。
- 这里的写入成功,不一定是写入了硬盘,写入了内存也算成功。
j参数
- j参数就是来控制,到底是写入内存算写入成功,还是硬盘算写入成功,这里指定写入了日志文件里,说算成功
- j的取值就2个,true:代表写入 journal,false:代表写入内存
wtimeout
- 如果写入时间超过了设置时间,系统就提示写入超时了,但不代表说数据没写入成功,因为主结点已经写完了,就差同步到从结点了。
注意事项
• 虽然多于半数的 writeConcern 都是安全的,但通常只会设置 majority,因为这是等待写入延迟时间最短的选择;
• 不要设置 writeConcern 等于总节点数,因为一旦有一个节点故障,所有写操作都将失败;
• writeConcern 虽然会增加写操作延迟时间,但并不会显著增加集群压力,因此无论是否等待,写操作最终都会复制到所有节点上。设置 writeConcern 只是让写操作等待复制后再返回而已;
• 应对重要数据应用 {w: “majority”},普通数据可以应用 {w: 1} 以确保最佳性能。
实验
需要搭建一个3节点的测试环境
在复制集测试writeConcern参数
db.test.insert( {count: 1}, {writeConcern: {w: "majority"}})
db.test.insert( {count: 1}, {writeConcern: {w: 3 }})
db.test.insert( {count: 1}, {writeConcern: {w: 4 }})
配置延迟节点,模拟网络延迟(复制延迟)
conf=rs.conf()
conf.members[2].slaveDelay = 5
conf.members[2].priority = 0
rs.reconfig(conf)
观察复制延迟下的写入,以及timeout参数
db.test.insert( {count: 1}, {writeConcern: {w: 3}})
db.test.insert( {count: 1}, {writeConcern: {w: 3, wtimeout:3000 }})
总结
今天主要学习了写操作中,writeConcern参数的使用方法,建设设置为 majority,这也是系统的默认值,保证大多数结点写入数据的成功。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。