0

我想知道关于 mongodb 中配置服务器的声明(来自文档):

如果任何配置服务器关闭,集群的元数据将变为只读状态。但是,即使在这种故障状态下,MongoDB 集群仍然可以被读取和写入。

我们可以使用 1 或 3 个配置服务器。为什么如果我们使用 3 台配置服务器并且一台服务器关闭,集群会进入只读模式?从上面的链接可以看出,Each config server has a complete copy of all chunk information.
如果每个服务器都有所有块信息的完整副本,为什么只有在一个配置服务器关闭后才会读取?

4

1 回答 1

2

所以,这是因为配置服务器进行 2 阶段提交的方式。如果你有一个配置服务器并且它失败了,那么你的整个系统就会失败。如果您有 3 个并且一个失败,则所有元数据仍然可用,但是您失去了 2 个阶段提交的弹性系数。如果没有 3 个成员,您将无法进行 2 个阶段提交。

因此,您可能仍会使用其他两个进行读取,但平衡器本质上已关闭,因此不会发生块迁移或拆分(因此元数据变为只读)。这是因为您无法使用 3 节点配置设置使用的提交过程来提交拆分或迁移,因此它们不会发生。

不建议使用 1 个配置服务器运行。基本上,如果它出现故障,您将不知道您的任何数据在哪里。

2 阶段提交仅适用于 3 台机器,因为它可以确保您的数据保持一致状态。这意味着如果一台机器在更新过程中死机,则该更新将失败或持续存在,具体取决于它是否已提交到至少另一个将更新第三个节点(因此是 2 阶段提交)。因此使用剩下的 2 个配置服务器读取分片集群是安全的。

你不能用 2 个节点来做到这一点。它可能已经通过,也可能没有,您无法判断,因为您无法将最后一个剩余节点与任何其他节点进行比较,因为另一个节点已关闭。因此,安全的做法是在备份第三个节点之前不要进行任何更新,否则您可能会读取过时的数据。

如果您想要无缝抗故障,那么使用 2 是没有意义的,因为您使用 2 阶段提交。如果您宁愿什么都没有,那么它确实没有比 1 个节点更多的持久性,然后可能是不正确的数据。在分片集群中,没有任何东西和不正确的数据齐头并进,因为无论哪种方式,您都不知道在哪里可以找到您的块。

它基本上是为了保护您免受潜在的配置数据损坏和不一致的影响。

于 2012-10-03T21:09:09.427 回答