阅读文档几次,但仍无法理解“多数”和“线性化”read concerns行为的差异:
"majority"
该查询返回实例的最新数据,确认已写入副本集中的大多数成员。
"linearizable"
该查询返回的数据反映了所有成功写入的写入关注度为“多数”且在读取操作开始之前已确认。
文档还提到了一个选项“writeConcernMajorityJournalDefault”,它说该选项设置为false,即使使用“linearizable”,数据也可以回滚。
有人可以解释一下,这两个问题如何起作用以及这个选项如何影响它们?
答案 0 :(得分:11)
"的线性化强>" MongoDb 3.4中引入了阅读关注,以解决" 多数"阅读关注。
让我们尝试用" 多数"来理解问题。阅读关注以了解" 可线性化"给我们带来了。
假设我们有3个节点的复制,看起来像这样:
其中, A 是主要的, B 是中学, C 是次要的
让我们还有两个用户 Alice 和 Bob ,它们将对以下文档执行某些操作,该文档位于&#34; 用户< / EM> 强>&#34;集合。
{
"_id": 100234,
"name": "Katelyn"
}
发生以下情况,
db.users.find({&#34; _id&#34;:100234}); - &GT;阅读关注&#39;多数&#39;
输出:
{&#34; _id&#34; :100234,&#34; name&#34; :&#34; Katelyn&#34; }
发生以下情况,
然而,直到没有传达 A 或 A 本身意识到它需要将自己降级为辅助,它继续作为主要用户(这通常用于虽然很短的时间。)
db.users.update({&#34; _id&#34;:100234},{$ set:{name:&#34; Sansa&#34;}}); - &GT;同 写关注&#39;多数&#39;。
db.users.find({&#34; _id&#34;:100234}); - &GT;阅读关注&#39;多数&#39;
输出:
{&#34; _id&#34; :100234,&#34; name&#34; :&#34; Katelyn&#34; }
即使在发出多数读取问题之后,Alice也会收到过时的数据,即Alice写的内容对Alice不可见。 因此,&#34; 线性化&#34;在这种情况下得到补偿。
可线性化的定义: 写作应该是即时的。不精确,一旦写了 完成后,所有后来读取(其中“稍后”由挂钟定义 应该返回该写入的值或者a的值 后来写。一旦读取返回特定值,所有稍后读取 应该返回该值或稍后写入的值。
因此,解决方案就是&#34; 可线性化&#34;阅读关注。有了这个属性,mongod会检查它的主要属性,并且可以看到大多数节点 在发出读取操作的结果之前。 然而,使用这种读取关注度超过&#34;多数&#34;有一个性能成本的阴影,因此这不是'#34;多数&#34;的替代品。阅读关注。
关于 writeConcernMajorityJournalDefault 属性,它只是一个副本集配置选项。它接受布尔值。
True 表示MongoDB在大多数投票成员写入磁盘日志后确认写操作。
False 表示在大多数投票成员将操作应用于内存后,MongoDB会确认写入操作。
上述属性仅适用于写作关注&#34;多数&#34;使用并且未指定日记标记。
答案 1 :(得分:2)
据我所知,节点中的“读取关注点” DockingManager
将立即返回,其中包含该节点中写入的最新数据的读取查询。另一方面,读关注点majority
将等到同时执行的写入操作完成后再传播到大多数副本集成员,然后返回结果。
他们两者都保证大多数副本集成员已经确认读取的数据,即读取的文档是持久的,并且保证不会回滚。
由于“读取关注点” linearizable
等待并发执行的写操作完成,因此它的性能明显慢于“读取关注点linearizable
”。
类似地,由于读关注点majority
不等待并发执行的写操作,它将快速返回,但它可能返回陈旧的数据(仍然持久且多数:已确认)。有关详细信息,请参见以下示例:https://docs.mongodb.com/manual/reference/read-concern-majority/#example
在该示例中,在t3〜t5之间(在t3之后和t5之前),主要和次要对象将返回具有读取关注事项majority
的不同数据。