Mongodb 两个节点部署

Mongodb two nodes deployment

我知道Mongodb 建议复制集最小为 3

我可以使用两台服务器来安装 Mongodb 和 4 个复制集,以防止一个节点宕机时写入失败吗?

我的想法是在每台服务器上再安装两个实例以fake/get摆脱它:

如果一台服务器宕机,它仍然有两个复制集。

谁能评论我的想法? 请问有什么issue/risk需要考虑的吗? 谢谢!

请阅读https://docs.mongodb.com/manual/replication/

不建议在一个集合中加入偶数个成员。添加仲裁者的唯一原因是解决此问题并将成员数量增加 1 以使其成为奇数。加2个Arbiter根本没有意义。

同样,将 Arbiter 与任何其他成员放在同一服务器上是没有意义的。它非常轻巧,因此您可以将它与应用服务器放在一起。

拥有 2 个数据库服务器的最佳副本集配置为:

  • Mongodb 1

    • 硕士
  • Mongodb 2

    • 中学
  • 任何其他服务器

    • 仲裁者

这是个坏主意。您建议的配置会适得其反,主要原因有两个:

  1. 运行two instances of MongoDB on the same hosts会导致他们俩运行宁慢且笨拙,争夺内存,cpu,磁盘i/o,等等
  2. 如果其中一台主机出现故障,另一台主机上的两个节点将无法继续复制集,因为只有两个节点运行退出四个中,您没有 majority necessary to become primary.

MongoDB 是 intended to be run effectively on multiple hosts,所以它是为此而设计的;即使你能找到一种方法将功能正常的副本集硬塞到两台主机上,你也会违背 MongoDB 的设计并努力使其有效地工作。

真的,你最好的选择是 运行 在你的两个主机上的每个主机上一个单一的 mongod 实例,并在第三个(独立的)主机上 运行 一个仲裁器;这种 normal 3-host configuration 是实现数据复制和高可用性的有效且直接的方法。

简单的回答是,不,你做不到..

原因是"majority"。如果你失去了这两个服务器中的一个,你就没有在线投票的多数。

这就是为什么 3 是最小值的原因。可以是3个数据承载节点,也可以是2个数据承载节点加1个仲裁器。所有这些都有一票,如果你失去其中一个,副本集仍然有 2/3 的票数,这是多数票。像 3/5 或 4/7。

值 1/2(或 2/4)不是多数。