MongoDB 如何检测 PSA 架构中的多数?

How MongoDB detects majority in PSA architecture?

假设我有一个包含 3 个节点(2 个数据节点和一个仲裁器 (PSA))的副本集。当由于某种原因我的一个数据节点出现故障并且我将其恢复时,在与主节点同步期间,它处于状态 STARTUP2。在他的时候我会失去我的 change stream 因为我的副本集有 2 个数据节点但我没有大多数节点要读取。

我该如何处理这个问题?

我也看了this MongoDB doc。是否可以将主节点 priority 值设置为高于辅助节点(即与主节点同步)?即使我的辅助节点处于 STARTUP2 状态,我也可以通过这样做获得多数吗?

技术上有两种类型的多数。正如我所说,它们是 "election majority" 和 "data majority".

Arbiters 应该帮助 "election majority",如果 S 出现故障,它有助于在 PSA 架构中维持主要可用性。但是,它们不是 "data majority".

的一部分

"Data majority",相比之下,既是投票又是认可majority-read and majority-write

Changestreams 按照设计将 return 提交给 "data majority" 投票节点的文档。这是因为传播给它们的写入不会是 rolled back。如果 changestream 声明文档已写入,然后回滚,然后将不得不发出 "no wait, scratch that, the write didn't happen".

,这将令人困惑

因此,就其本质而言,仲裁器与多数读取和多数写入场景不兼容,例如变更流或事务。 但是 仲裁者在副本集中仍然占有一席之地,前提是您知道对他们的期望。

请参阅 以更完整地解释写入问题和仲裁器的影响。

STARTUP2 中的一个辅助还不是辅助。它可能会在选举中投票,但它不会承认多数写入,因为它仍在启动中。

在 changestream 方面,因为在 PSA 架构中 "data majority" 实际上只是 PSA 的 PS 部分,none数据承载节点可以脱机以保持大多数读写。

最好的解决方案是用实际的数据承载节点替换仲裁器。这样,你可以拥有多数写入,多数读取,并且可以在一个节点宕机的情况下仍然保持多数。