【问题标题】:MongoDB - cross data center primary election DRP / Geographically Distributed Replica SetsMongoDB - 跨数据中心初选 DRP / Geographically Distributed Replica Sets
【发布时间】:2015-05-17 18:42:28
【问题描述】:

使用分布在 3 个数据中心的 mongo

对于本示例,数据中心名称为 A、B、C

当一切顺利时,所有用户流量都指向A

所以 mongo 主要在 A 上,mongo 设置是:

  • A 中的 3 台服务器(具有高优先级)
  • B 中有 1 台服务器(低优先级)
  • C 中的 1 个服务器(优先级 0)

当两种情况发生时,问题是支持 mongo-writes:

  1. A-B-C 之间没有网络(网络隧道已关闭)
  2. 数据中心 A 着火了 :),假设数据中心无法正常工作,此时所有用户流量都指向 B,预计 B 将进行一次初选。

场景 1 不是问题,当没有数据中心网络隧道时,A 仍然有大部分副本和高优先级,所以一切都还在工作。

场景 2 无法工作,因为当 A 停止工作时,(A 上的)所有 3 个副本都无法访问,这样在 B 或 C 中将不会重新生成新的主副本,因为大多数副本都已关闭。

如何设置我的副本集以支持这两种情况?

【问题讨论】:

    标签: mongodb database-replication high-availability eventual-consistency database


    【解决方案1】:

    这是不可能的:在总网络分区的情况下,如果使用 MongoDB 使用的多数选举方法的 DC 失败,则不能有一个“可用”系统:要么大多数都在一个 DC 中,那么它将在分区中幸存,但在 DC 宕机时不会幸存,或者大多数需要 2 个 DC 启动,这可以在一个 DC 宕机但不能在整个网络故障时幸免。

    您的选择:

    • 接受分区问题并将设置更改为 2-2-1。 不可靠的隧道应该是可以解决的,如果 DC 的整个网络出现故障,您就处于场景 2。
    • 接受 DC 问题并坚持您的配置。最可能的问题可能是大规模网络问题和大规模停电,而不是火灾。
    • 使用支持其他类型容错的数据库。然而,这并不是万能的,因为这需要其他一些必须很好理解的权衡。

    为了在 DC A 出现故障时保持系统正常运行,还需要在 DC B 或 C 中的应用程序服务器,这在其自身方面是一个棘手的问题。例如,如果您使用分区容忍度更高的数据库,您可能很容易遇到“脑裂”问题,即不同 DC 中的应用程序服务器接受不同但相互冲突的写入。此类问题只能在应用层面解决。

    【讨论】:

    • 有什么方法可以快速将更多副本添加到 B 中?隐藏副本并在 A 关闭时更改配置?
    • 脑裂对我来说不是问题,因为当 A 不工作时,所有用户流量都流向 B
    • 抱歉,错过了评论。脑裂始终是一个问题,因为您不可能知道 DC A 是否真的停机或根本无法从您所在的位置访问。假设一个主要的上行链路/互连有一个奇怪的路由问题,来自西海岸的所有流量都在 DC A 中结束,来自东海岸的所有流量都在 DC B 中。两者都正常,但他们看不到彼此,而且无论是西海岸还是东海岸,都没有人能确定另一个已经启动……这样一来,网络分区可能比实际发生故障的情况更糟。
    • +1 在 2-2-1 解决方案上。如果您可以摆动那么多节点,那么这是防止在 DC 蒸发时丢失多数节点的最优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多