1

第十六天

今天开始事务的学习,要学习的章节为《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,这也是系统的默认值,保证大多数结点写入数据的成功。


xiaopohair
68 声望26 粉丝

把这辈子活的热气腾腾!