我知道Mongodb建议复制集最小值为3
我可以使用两台服务器安装具有 4 个复制集的 Mongodb 以防止一个节点关闭时写入失败吗?
我的想法是在每个服务器上再安装两个实例来伪造/摆脱它:
-
蒙戈德布 1
- 重装集 1(主)
- 补习集 2(次要)
-
蒙戈德 2
- 补习集 3(次要)
- 重新集 4(仲裁器)
如果一台服务器关闭,它仍然有两个复制集。
任何人都可以评论我的想法吗? 我想知道是否有任何问题/风险需要考虑? 谢谢!
这是一个坏主意。您建议的配置会适得其反,主要有两个原因:
- 在同一主机上运行两个MongoDB实例将导致它们运行缓慢而笨拙,竞争内存,CPU,磁盘I/O等。
- 如果其中一个主机出现故障,另一个主机上的两个节点将无法继续副本集,因为四个节点中只有两个节点用完,因此您没有成为主节点所需的大多数节点。
MongoDB旨在在多个主机上有效运行,因此它是为此而设计的;即使你能找到一种方法将一个功能正常的副本集硬塞到两个主机上,你也会反对MongoDB的设计,并努力使其有效地工作。
实际上,最好的选择是在两台主机上运行一个 mongod 实例,并在第三台(单独的)主机上运行仲裁器;这种正常的 3 主机配置是实现数据复制和高可用性的有效且直接的方法。
请阅读 https://docs.mongodb.com/manual/replication/
不建议在集合中偶数个成员。添加仲裁服务器的唯一原因是解决此问题并将成员数增加 1 以使其奇数。添加 2 个仲裁者根本没有意义。
同样,将仲裁服务器与任何其他成员放在同一服务器上也是没有意义的。它非常轻量级,因此您可以将其与应用程序服务器放在一起。
拥有 2 个数据库服务器的最佳副本集配置是:
蒙戈德布 1
- 主人
蒙戈德 2
- 二 次
任何其他服务器
- 仲裁人
简单的答案是,不,你不能这样做。
理性是"多数"。如果您丢失了这两个服务器中的一个,那么您就没有在线多数票。
这就是原因,为什么 3 是最小值。它可以是 3 个数据承载节点或 2 个数据承载节点和一个仲裁节点。所有这些都有一票,如果你失去了其中一票,副本集仍然有 2/3 票,这是多数票。比如 3/5 或 4/7。
值 1/2(或 2/4)不是多数。