MongoDB——跨数据中心初选DRP/地理分布式副本集

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

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

在此示例中,数据中心名称为 A、B、C

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

所以 mongo 主数据库位于 A 上,mongo 设置为:

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

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

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

场景 1 不是问题,当没有数据中心网络隧道时,A 仍然拥有大多数副本和高优先级,因此一切仍然正常。

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

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

最佳答案

这是不可能的:在整个网络分区的情况下,如果使用 MongoDB 使用的多数选举方法的 DC 发生故障,您将无法拥有“可用”系统:要么大多数在一个 DC 中,那么它可以在分区中幸存,但不能在 DC 发生故障时幸存,或者多数需要 2 个 DC 启动,这样可以在 1 个 DC 发生故障时幸存,但不能在整个网络故障时幸存。

您的选择:

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

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

关于MongoDB——跨数据中心初选DRP/地理分布式副本集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30290711/

相关文章:

node.js - 使用nodejs和mongoDB作为后端数据进行延迟加载

mongodb - 是否可以使用 $inc 通过 Mongoose 更新子文档?

mysql - 同步/流式传输 MySQL 表/表(连接表)与 PostgreSQL 表/表

mysql - 是否可以使用 MySQL 进行 N-master => 1-slave 复制?

caching - 当先前死掉的redis-master再次在线时如何禁用sentinel auto-slaveof

mongodb - 如何将数据从 Mongodb 流式传输到 Hadoop

Mongodb的 "mongodump"命令,javascript执行错误

ios - SymmetricDS 可以用于 iOS 吗

load-balancing - 分片和负载均衡器 : how does it works?

jetty - 为 jetty 中的 "war"文件配置 ha-proxy