write concern保证了mongodb写操作的级别,不同的write concern设置相应了不同级别的写操作。设置的级别越高。那么写操作的性能的持久化做得越好,可是写性能也就越差。
mongodb默认採用?Acknowledged的write concern级别,这也是安全性最高的级别。
在?Acknowledged级别的副本集模式下。mongodb可在client设置一个wtimeout值。假设在规定的时间内无法完毕这个写操作就返回一个错误,即使它终于可能能够完毕。
Write Concern Levels
Unacknowledged
在Unacknowledged模式下,mongodbserver不会去确认写操作是否真正收到了,相似于忽略了所以操作。然而,驱动器还是会尝试接收和处理来自网络的错误,这就取决于系统的网络配置了。下图是Unacknowledged级别的原理图。
Acknowledged
Acknowledged模式下,mongod会去确认它接收到了这个写操作而且将这个写操作应用到内存数据中。Acknowledged?模式执行client捕捉全部网络错误。主键冲突等错误。可是Acknowledged?并不能保证写操作应用到磁盘数据总。下面是原理图
Journaled
Journaled模式下。mongodbserver会确认写操作提交到journal log中。所以这个级别能够保证mongodb能够在意外宕机以后恢复出全部数据。当然这个级别必须保证你在server端开启了journaling
。而且每次都必须等待直到下一次journal log的提交,这时你能够尝试增大journal log的commit频率。
Replica Acknowledged
假设你们的mongodb用到了副本集,写操作也许就须要额外的考虑,默认的设置仅仅要求了主节点的Acknowledged。而在Replica Acknowledged模式下。它会保证全部的写操作都应用到副本集中的全部节点中,只是这里的journal log仅仅须要保证主节点的journal log commit就能够了。Available Write Concern
每次写操作后driver都会自己主动调用getLastError()命令来推断是否发生了写错误以及是否依照设置的writeconcern以后执行,比如db.runCommand( { getLastError: 1, w: 2,j:true, wtimeout:5000 } )就是确认上一次的操作w为2,j为true,wtimeout为5000时,有没有报错。w?Option
j?Option
wtimeout
该值设置为0就是不做限制。