mongodb 写入策略 (WriteConcern)

写入策略 (WriteConcern)

mongodb 的写入策略有多种方式,写入策略是指当客户端发起写入请求后,数据库什么时候给应答,mongodb 有三种处理策略:客户端发出去的时候,服务器收到请求的时候,服务器写入磁盘的时候

Unacknowledged

客户端发出请求丢到 socket 的时候就收到相应,这个时候客户端不需要等地服务器的应答,但是的本地的驱动还是尽可能的通知客户端网络的异常,这和客户端操作系统的配置有关。就像现实中邮寄信件一样,丢到信箱就结束了,但是如果信箱坏了,发信人还是能知道的。

Acknowledged

这种方式客户端发送接口会等待服务器给的确认,这种方式一定能确保服务器收到了客户端的请求,并且服务器能够异常时,响应客户端。

Journaled

Journaled 方式相比 Acknowledged 的方式是要保证服务器端已经写入到硬盘文件了。对于 Acknowledged 的方式有可能服务收到请求数据相应客户端后的一瞬间当机了,这个数据就丢失了,但是对于 Journaled 方式,服务器保证写入到磁盘后再相应客户端,即使当机了,也不会导致数据丢失。

Replica Acknowledged

这个方式和 Acknowledged 是一样的意思,适用于 Replica sets 模式。Acknowledged 模式下只有一台机器收到了请求就返回了,对于复制集模式有多台机器的情况,可以要求有多台机器收到写入请求后再相应客户端。这种更安全,但是导致了客户端耗时增加,所以要结合自己的场景设置合适的策略。

可以通过下面的方式设置默认的策略,majority 表示多数节点写入成功后才相应客户端,也可以替换成具体的数子,比如 w:2 表示至少写入 2 个节点才返回。wtimeout 表示超时时间,还有一个参加 j 可以设置 true,false 表示是否是写入日志才返回。

 
  • cfg = rs.conf()

  • cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }

  • rs.reconfig(cfg)

也可以通过客户端来指定具体的策略,如下: 至少要写入两个节点,超时时间是 5s

 
  • db.products.insert(

  • { item: "envelopes", qty : 100, type: "Clasp" },

  • { writeConcern: { w: 2, wtimeout: 5000 } }

  • )

如果复制集是 3 台机器,写入两台机器,流程如下:

参考资料

https://docs.mongodb.com/manual/reference/write-concern/
https://docs.mongodb.com/manual/core/replica-set-write-concern/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值