《MongoDB高手课》学习记录(第十六天)

第十六天

今天开始事务的学习,要学习的章节为《19 | 事务开发:写操做事务》,其实主要就是讲一个参数writeConcern。安全

什么是 writeConcern ?

以前第一章咱们学过,生产环境中MongoDB最少也是须要一个3结点的集群的。那么writeConert就是用于控制在数据写入时,数据写入多少个结点才算成功。网络

> db.test.insert({count: 1}, {writeConcern: {w: 3})

w参数

  • 若是是数字,好比一、二、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,这也是系统的默认值,保证大多数结点写入数据的成功。测试

相关文章
相关标签/搜索