几次阅读文档,但仍然无法理解“多数”和“线性化” read concerns的行为差异:

"majority"
该查询返回实例的最新数据,该数据已被确认已写入副本集中的大多数成员。
"linearizable"
该查询返回的数据反映了所有以“多数”作为写关注点发出并在读取操作开始之前被确认的成功写操作。

该文档还提到了一个选项“ writeConcernMajorityJournalDefault”,该选项设置为false,即使使用“ linearizable”也可以回滚数据。
有人可以解释一下,这两个问题如何起作用,以及此选项如何影响它们?

最佳答案

MongoDb 3.4中引入了“线性可读取”关注,以解决“多数”读取关注的可能问题。

让我们尝试理解“多数”问题,并关注“线性化”给我们带来的影响。

假设我们有一个3个节点的副本集,看起来像这样:

mongodb - “多数”与“线性化”之间的区别-LMLPHP

哪里,
A是主要的
B是中学
C是次要的

让我们还有两个用户Alice和Bob,这两个用户将对驻留在“用户”集合中的以下文档执行一些操作。

{
 "_id": 100234,
 "name": "Katelyn"
}


在时间点T0:

以下发生,


爱丽丝连接到A(主要),并发出以下命令。



db.users.find({“ _ id”:100234}); ->带有关注的“多数”


输出:


{“ _id”:100234,“ name”:“ Katelyn”}



B和C意识到A已停止响应并开始选举程序。(可能是由于网络分区所致)。


在时间点T1:

以下发生,


由于选举过程,B作为新的主要候选人。


但是,直到时间A没有被传达或者A本身意识到自己需要降级为次要角色之后,A才继续充当主要角色(尽管这通常只持续非常短的时间)。

mongodb - “多数”与“线性化”之间的区别-LMLPHP

在时间点T2:


鲍勃(Bob)连接到B(新的主服务器)并发出以下命令。



db.users.update({“ _id”:100234},{$ set:{name:“ Sansa”}})); ->与
写“多数”。



鲍勃被确认写。


在时间点T3:


爱丽丝连接到A(旧的主要服务器)并发出以下命令。



db.users.find({“ _ id”:100234}); ->读关注“多数”


输出:


{“ _id”:100234,“ name”:“ Katelyn”}


即使在发出多数读取问题之后,爱丽丝仍会获得过时的数据,即,鲍勃所做的写操作对爱丽丝不可见。
因此,在这种情况下补偿了“线性可线性化”的特性。


线性化的定义:
写入应该看起来是瞬时的。不精确,一次写
完成后,所有后续读取(其中“较晚”由壁钟定义
开始时间)应返回该写入的值或a的值
以后写。读取返回特定值后,所有后续读取
应该返回该值或以后写入的值。


因此,出现了解决方案,即“可线性化”的阅读问题。使用此属性,mongod会检查其主要节点并可以查看大多数节点
在发出读取操作的结果之前。
但是,对“多数”使用此“读取关注点”会有性能成本的损失,因此这不能替代“多数”读取关注点。



关于writeConcernMajorityJournalDefault属性,它只是一个副本集配置选项。它接受布尔值。

真正的意思是,MongoDB在大多数有投票权的成员已将其写入磁盘日志后才确认写入操作。

False表示MongoDB在大多数投票成员将内存中的写入操作应用后确认该写入操作。

仅当使用写关注“多数”并且未指定日记标记时,以上属性才适用。

关于mongodb - “多数”与“线性化”之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42615319/

10-12 23:34