MongoDB 写入策略与读一致性
Posted _雪辉_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB 写入策略与读一致性相关的知识,希望对你有一定的参考价值。
一、MongoDB写入策略WriteConcern
{ w: <value>, j: <boolean>, wtimeout: <number> }
w : 该选项要求确认操作已经传播到指定数量的mongod实例或指定标签的mongod实例
-
w=1:要求确认操作已经传播到指定的单个mongod实例或副本集主实例
-
w=0:不返回任何响应,所以无法知道写入是否成功,但是对于尝试向已关闭的套接字写入或者网络故障会返回异常信息
-
w>1:该值用于设定写入节点的数目,包括主节点
majority:适用于集群架构,要求写入操作已经传递到绝大多数投票节点以及主节点后进行应答 -
tag set:要求写入操作已经传递到指定tag标记副本集中的成员后进行应答
j : 该选项要求确认写操作已经写入journal日志之后应答客户端,在意外重启,宕机等情形下可以通过journal来进行数据恢复,写入journal操作必须等待直到下次提交日志时完成写入,为降低延迟,MongoDB可以通过增加commit journal的频率来加快journal写入
wtimeout(ms):该选项指定一个时间限制,以防止写操作无限制被阻塞导致无法应答给客户端
当w值大于1时生效,当某个节点写入时超出指定wtimeout之后,mongod将返回一个错误,在捕获到超时之前,mongod并不会撤销其他节点已成功完成的写入,wtimeout值为0时等同于没有配置wtimeout选项,容易导致由于某个节点挂起而无法应答
二、MongoDB读一致性ReadConcern
ReadConcern控制从复制集和复制集碎片读取的数据的一致性和隔离级别
level | 描述 |
---|---|
local | 查询从实例返回数据,但不能保证数据已写入大多数复制集成员 |
available | 查询从实例返回数据,但不能保证数据已写入大多数复制集成员。对不是分片的集合,"available"和"local"行为相同。 对于使用因果一致性session,“available” read concern是不可见的。 |
majority | 查询结果返回被副本集的大多数成员确认的数据,读操作返回的文档是持久化的,即使在失败的情况下。 "majority"可以用在因果一致性session和事务。对于不在多文档事务中的读操作,“majority” read concern 保证读的结果返回被副本集的大多数成员确认的数据,但是在多文档事务中的读操作,“majority” read concern 只有在write concern是"majority"提供保障。 |
linearizable | 查询数据返回读操作之前完成的被大多数成员确认的写操作,在返回结果之前,查询可以等待并发执行的将数据复制到大多数成员的写入操作。如果大部分副本集成员在读取操作后崩溃并重新启动,在 writeConcernMajorityJournalDefault设置为true时,返回的文档是持久化的,设置为false时,写操作在大多数节点奔溃时会回滚。 |
snapshot | 只能对primary节点设置linearizable read concern,并且对因果一致性session是不可用的。只在多文档事务中可用 |
三、readPreference
- primary:只选择主节点
- primaryPreferred:优先选择主节点,如果不可用则选择从节点
- secondary:只选择从节点
- secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点
- nearest:选择最近的节点(ping mongod服务器哪个最近就用哪个)
以上是关于MongoDB 写入策略与读一致性的主要内容,如果未能解决你的问题,请参考以下文章