在阅读了 MongoDB 分片架构的官方文档后,我还没有发现为什么你需要一个或三个配置服务器,而不是另一个数字。
配置服务器上的MongoDB 文档说:
“如果一两台配置服务器不可用,集群的元数据将变为只读。您仍然可以从分片读取和写入数据,但在所有三台服务器都可用之前不会发生块迁移或拆分。”
因此反思:一台服务器相当于一个单点故障,但两台服务器的行为与三台服务器相同,对吧?
那么,为什么绝对是三台服务器而不是两台或更多台呢?
因为文档还说:
配置服务器不作为副本集运行。
在阅读了 MongoDB 分片架构的官方文档后,我还没有发现为什么你需要一个或三个配置服务器,而不是另一个数字。
配置服务器上的MongoDB 文档说:
“如果一两台配置服务器不可用,集群的元数据将变为只读。您仍然可以从分片读取和写入数据,但在所有三台服务器都可用之前不会发生块迁移或拆分。”
因此反思:一台服务器相当于一个单点故障,但两台服务器的行为与三台服务器相同,对吧?
那么,为什么绝对是三台服务器而不是两台或更多台呢?
因为文档还说:
配置服务器不作为副本集运行。
MongoDB 3.0 及更早版本仅支持单一类型的配置服务器部署协议,该协议在 MongoDB 3.2 中称为遗留 SCCC(同步集群连接配置)。SCCC 部署有 1 个配置服务器(仅限开发)或 3 个配置服务器(生产)。
MongoDB 3.2 弃用了 SCCC 协议并支持新的部署类型:将服务器配置为副本集 (CSRS)。CSRS 部署与标准副本集具有相同的限制,在 MongoDB 3.2 中可以有 1 个配置服务器(仅限开发)或多达 50 个服务器(生产)。建议至少使用 3 个 CSRS 服务器以在生产部署中实现高可用性,但额外的服务器可能对地理分布的部署有用。
使用 SCCC,配置服务器使用两阶段提交协议进行更新,该协议需要多个服务器的共识才能进行事务。您可以将单个配置服务器用于测试/开发目的,但在生产使用中您应该始终拥有 3 个。为什么您不能在 MongoDB 中仅使用 2 个(或超过 3 个)服务器的一个实际答案是 MongoDB 代码库仅支持用于 SCCC 配置的 1 或 3 个配置服务器。
三台服务器比两台服务器提供更强的一致性保证,并允许在一台配置服务器上进行维护活动(例如备份),同时仍然有两台服务器可供您mongos
查询。超过三台服务器会增加跨所有服务器提交数据所需的时间。
分片集群的元数据需要在所有配置服务器中相同,并由 MongoDB 分片实现维护。元数据包括哪些分片当前保存一系列文档(又名chunks
)的基本细节。在 SCCC 配置中,配置服务器不是副本集,因此如果一个或多个配置服务器处于脱机状态,则配置数据将是只读的 - 否则数据无法传播到离线配置服务器重新上线。
显然 1 个配置服务器不提供冗余或备份。对于 2 台配置服务器,潜在的故障情况是服务器可用但服务器上的数据不一致(例如,其中一台服务器有一些数据损坏)。使用 3 台配置服务器,您可以改进之前的场景:2/3 台服务器可能是一致的,您可以识别出奇怪的服务器。
MongoDB 3.2 不推荐使用三个镜像mongod
实例作为配置服务器,并且从 3.2 开始,配置服务器(默认情况下)部署为副本集。副本集配置服务器必须使用 WiredTiger 3.2+ 存储引擎(或其他支持新的readConcern
读取隔离语义的存储引擎)。CSRS 还禁止某些不适合分片集群元数据用例的非默认副本集配置选项(例如arbiterOnly
、buildIndexes
和)。slaveDelay
CSRS 部署提高了配置服务器的一致性和可用性,因为 MongoDB 可以利用标准副本集读取和写入协议来分片配置数据。此外,这允许一个分片集群拥有超过 3 个配置服务器,因为一个副本集最多可以有 50 个成员(如 MongoDB 3.2)。
使用 CSRS 部署,写入可用性取决于维护可以查看副本集当前主节点的成员的法定人数。例如,一个 3 节点副本集将需要 2 个可用成员来维护一个主节点。可以添加其他成员以提高容错能力,并遵守与正常副本集相同的选举规则。a readConcern
ofmajority
用于mongos
确保分片集群元数据只有在提交给大多数副本集成员后才能读取,a readPreference
ofnearest
用于将请求路由到最近的配置服务器。