我们说我有一个Primary (A)
&两个secondary (B, C)
。如果我正在使用write majority
进行写作。有人可以解释一下我的疑问: -
majority
完成了写入并更新了数据
A
& B
并且写入尚未传播到C
。这时如果一个
使用secondary
或secondary preferred
读取相同的数据
查询是从具有最新数据的B
提供的
mongo无法保证这一点,并且读取可能会返回过时的数据
C
。A
上完成,然后写入其中一个正在进行中
中学B
。如果此时读取,则读取将被阻止
或者它将提供来自C
的陈旧数据?C
,同样的情况也在
我们在上述案例中提到的进展。请读一下
在B
或读取完成后,将阻止辅助B
不会被阻止,并且B
会提供过时的数据?环境
答案 0 :(得分:1)
Mongodb复制过程与次要异步。如果将读取的关注点设置为“多数”,则可以读取陈旧数据。基本上,这意味着您已将读取首选项设置为最终一致性。
如果读取问题设置为" local",您将从主要数据中获取最新数据。
请注意readConcern等级"多数"只能在WiredTiger存储引擎中使用。 WiredTiger存储引擎仅附加存储引擎,不会使用就地更新。没有锁并提供文档级并发。
阅读关注="多数"
查询返回实例的最新数据副本,确认为 写在副本集中的大多数成员。
要使用"多数"的阅读关注级别,您必须使用WiredTiger 存储引擎并启动mongod实例 --enableMajorityReadConcern命令行选项(如果使用配置,则为replication.enableMajorityReadConcern设置) 文件)。
问题1: Mongo不保证将从写入数据的辅助服务器提供读取服务吗?
答案1: MongoDB并不能保证这一点。次要的选择取决于以下内容: -
当您选择非主要读取首选项时,驱动程序将根据各种因素确定要定位的成员。请参阅此链接。 Read preference mechanics member selection
问题2:即使对同一数据进行了写操作,也绝不会阻止读取?
回答2:不会阻止阅读。但是,您可能会阅读一些陈旧的数据。
读取可能会错过在课程期间更新的匹配文档 读操作。
Concurrency locking what isolation guarantees does MongoDB provide