【问题标题】:MongoDB : replicaSet : zero downtimeMongoDB:replicaSet:零停机时间
【发布时间】:2014-05-13 19:39:24
【问题描述】:

我有一个包含 3 个节点的副本集。代码通过 pymongo 连接到当前的 master。如果当前的 master 宕机,大约需要两秒钟才能获得一个新的 master。 我该怎么做才能将停机时间减少到零?

提前致谢

【问题讨论】:

  • 这在物理上是不可能的,因为检测到一个主节点不可用(为了选择一个新的主节点)将花费超过 0 时间。
  • 至少将影响降到最低 ;-) Bob Kuhar 的两个建议是好的恕我直言

标签: mongodb pymongo


【解决方案1】:

你需要做两件事。

  1. 允许从属读取。在我们的 Java 应用程序中,我们通过 PRIMARY_PREFERRED 作为 ReadPreference 来获取它。这使您的应用程序可以在选举期间继续阅读。

  2. 您的持久层需要某种事务队列,以便在 replset 选择新的 PRIMARY 的过渡期间回写。我已经看到围绕 Akka 框架的提议,其中实际持久化内容的 Actor 在内存请求队列中维护自己的。在过渡期间,队列随着 Actor 等待 replset 返回读/写而建立。

“内存中的请求队列”足以让我担心,我还没有扣动扳机并实际实现了这一点。

【讨论】:

    【解决方案2】:

    只要没有人击败 CAP,你就不能完全可用,因为分区容错是分布式系统的先决条件,而 MongoDB 是一致的。通过允许从辅助节点进行读取,您会稍微削弱一致性并将其换取(读取)可用性。

    如果您的主要目标是可用性,那么 MongoDB 是错误的选择。

    【讨论】:

    • 是的,但您在选举期间将无法使用(至少可以写入)。它可能不会经常发生,它只是一个短暂的不可用窗口(几秒钟),但您仍然违反了 CAP 意义上的可用性约束。但是,有 AP 数据库。
    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多