mongodb官网文档阅读笔记:write concern

write concern保证了mongodb写操作的级别,不同的write concern设置对应了不同级别的写操作,设置的级别越高,那么写操作的性能的持久化做得越好,但是写性能也就越差。mongodb默认采用 Acknowledged的write concern级别,这也是安全性最高的级别。

 Acknowledged级别的副本集模式下,mongodb可在客户端设置一个wtimeout值,如果在规定的时间内无法完成这个写操作就返回一个错误,即使它最终可能能够完成。

Write Concern Levels

Unacknowledged

Unacknowledged模式下,mongodb服务器不会去确认写操作是否真正收到了,类似于忽略了所以操作。然而,驱动器还是会尝试接收和处理来自网络的错误,这就取决于系统的网络配置了,下图是Unacknowledged级别的原理图。

mongodb官网文档阅读笔记:write concern_第1张图片

Acknowledged

Acknowledged模式下,mongod会去确认它接收到了这个写操作并且将这个写操作应用到内存数据中,Acknowledged 模式运行客户端捕捉所有网络错误,主键冲突等错误。但是Acknowledged 并不能保证写操作应用到磁盘数据总。以下是原理图

mongodb官网文档阅读笔记:write concern_第2张图片

Journaled

Journaled模式下,mongodb服务器会确认写操作提交到journal log中,所以这个级别可以保证mongodb可以在意外宕机以后恢复出所有数据。当然这个级别必须保证你在服务器端开启了journaling ,并且每次都必须等待直到下一次journal log的提交,这时你可以尝试增大journal log的commit频率。


mongodb官网文档阅读笔记:write concern_第3张图片

Replica Acknowledged

如果你们的mongodb用到了副本集,写操作或许就需要额外的考虑,默认的设置只要求了主节点的Acknowledged。而在Replica Acknowledged模式下,它会保证所有的写操作都应用到副本集中的所有节点中,不过这里的journal log只需要保证主节点的journal log commit就可以了。
mongodb官网文档阅读笔记:write concern_第4张图片

Available Write Concern

每次写操作后driver都会自动调用 getLastError()命令来判断是否发生了写错误以及是否按照设置的writeconcern以后运行,例如db.runCommand( { getLastError: 1, w: 2,j:true, wtimeout:5000 } )就是确认上一次的操作w为2,j为true,wtimeout为5000时,有没有报错。
而db.things.insert({dd:123},{writeconcern:{w:2}})是设置当前插入的SQL的writeconcern;
 db.setWriteConcern({w:1,wtimeout:3000,j:1})是设置当前的db的writeconcern值;
 db.getWriteConcern()是获取当前db的write concern设置;

w Option

1 默认配置,确保单实例mongod或副本集中的主节点在写操作时acknowled
0 所有的都没有acknowled,但是这时你如果设置了journal commit acknowled的话,那么写操作依旧是acknowled模式
N 首先N>1,N的值表示在副本集中包括主节点在内的需要acknowled的节点数量
majority 保证副本集中大多数节点acknowled
保证这个目标副本集的所有节点acknowled

j Option

j操作确保写操作的数据应用到磁盘上的journal log,值true表示开启,flase表示关闭。副本集中设置为true只能保证主节点上的写操作应用到磁盘的journal log。

wtimeout

这个值只针对w的值设置为大于1的场合有效,即只针对副本集环境有效。当发生超时时就会返回一个错误,即使最终数据write成功了,这时mongodb不会回滚已经修改成功的数据。该值设置为0就是不做限制。



你可能感兴趣的:(NoSQL/MongoDB)