我想知道有关mongodb(from documentation)中配置服务器的声明:
如果任何配置服务器关闭,则群集的元数据会消失 只读。但是,即使在这样的故障状态下,MongoDB集群也是如此 仍然可以阅读和写入。
我们可以使用1或3个配置服务器。为什么如果我们使用3个配置服务器而一个服务器关闭,群集会进入只读模式?
正如您从上面的链接中看到的那样,Each config server has a complete copy of all chunk information
。
如果每个sesrver都拥有所有块信息的完整副本,为什么只有在一个配置服务器关闭后才能读取它?
答案 0 :(得分:2)
因此,原因是配置服务器进行两阶段提交的方式。如果你有一个配置服务器并且它失败了,那么你的整个系统都会失败。如果您有3个失败,则所有元数据仍然可用,但您将失去2阶段提交的弹性因子。如果没有3名成员,你不能进行2阶段提交。
因此,您可能仍然会使用其他两个进行读取操作,但平衡器基本上已关闭,因此不会发生块迁移或拆分(因此元数据将变为只读)。这是因为您无法使用3节点配置设置使用的提交过程提交拆分或迁移,因此它们不会发生。
不建议使用1个配置服务器运行。基本上如果它发生故障,你就不知道你的数据在哪里。
2阶段提交仅适用于3台计算机,因为它可以确保您的数据保持一致状态。这意味着如果一台机器在更新过程中死机,那么该更新将失败或持久,具体取决于它是否已提交至至少另一个将更新第三个节点的节点(因此为2阶段提交)。因此,使用左侧的2个配置服务器读取分片群集是安全的。
你不能用2个节点做到这一点。它可能已经通过,它可能没有,你不能告诉,因为你无法将最后剩余的节点与任何东西进行比较,因为另一个节点已关闭。因此,安全的做法是在第三个节点备份之前不进行任何更新,否则您可能正在读取过时的数据。
如果您想要无缝故障阻抗,那么使用2是没有意义的,因为您使用2阶段提交的原因。如果你宁愿什么都没有,那么它真的没有耐久性,然后可能有不正确的数据。在分片群集中,没有任何内容和不正确的数据齐头并进,因为你不知道在哪里找到你的块。
它基本上是为了保护您免受潜在的配置数据损坏和不一致。