使用分布在 3 个数据中心的 mongo
在此示例中,数据中心名称为 A、B、C
当一切顺利时,所有用户流量都指向 A
所以 mongo 主数据库位于 A 上,mongo 设置为:
- A 中有 3 个服务器(优先级高)
- B 中有 1 个服务器(低优先级)
- 1 个 C 语言服务器(优先级 0)
问题是当两种情况发生时支持 mongo-writes:
- A-B-C 之间没有网络(网络隧道已关闭)
- 数据中心 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/