使用分布在3个数据中心上的Mongo
在本例中,数据中心的名称是A、B、C
当一切进展顺利时,所有用户流量都指向
所以mongo primary在a上,mongo设置是:
A中的3个服务器(具有高优先级)
B中1台服务器(低优先级)
C中的1个服务器(优先级0)
问题是当发生以下两种情况时支持Mongo写入:
A-B-C之间没有网络(网络隧道关闭)
数据中心A着火了,假设数据中心不工作,此时所有用户流量都指向B,预计B将进行初选。
场景1不是问题,当没有数据中心网络隧道时,A仍然有大多数副本和高性能,因此每件事都仍然在工作。
场景2无法工作,因为当A停止工作时,所有3个副本(在A上)都无法访问,这样就不会在B或C中重新卷取新的主副本,因为大多数副本都已关闭。
如何设置副本集以使其支持这两种方案?
最佳答案
这是不可能的:在整个网络分区的情况下,以及在MongoDB使用的多数选举方法的DC失败的情况下,您不能有一个“可用”系统:多数在一个DC中,那么它将在分区中生存,而不是DC下降,或者多数需要2d在一个DC故障但不是整个网络故障的情况下,CS将处于上升状态。
您的选择:
接受分区问题并将设置更改为2-2-1。不可靠的隧道应该是可以解决的,如果一个DC的整个网络瘫痪,你在场景2。
接受DC问题并坚持您的配置。最可能的问题可能是大规模的网络问题和大规模停电,而不是火灾。
使用支持其他类型容错的数据库。然而,这并不是万灵药,因为这需要其他的权衡,必须得到充分的理解。
当dc a关闭时,要使系统保持运行,还需要dc b或c中的应用服务器,这本身就是一个棘手的问题。例如,如果您使用一个更能容忍分区的数据库,您可能很容易遇到“大脑分裂”问题,即不同DC中的应用程序服务器接受不同但有冲突的写入。这样的问题只能在应用层解决。
关于mongodb - MongoDB - 跨数据中心主要选举DRP/地理分布副本集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30290711/