在阅读MongoDB分片架构的官方文档后,我还没有找到为什么需要一个或三个配置服务器,而不是另一个号码。
MongoDB documentation on Config Servers说:
“如果一个或两个配置服务器不可用,集群的元数据将变为只读。您仍然可以从分片中读取和写入数据,但在所有三个服务器都可用之前,不会发生任何块迁移或拆分。”
因此反思:一台服务器相当于单点故障,但是有两台服务器,我们的行为与三台相同,对吗?
那么,为什么绝对有三台服务器,而不仅仅是两台或更多服务器呢?
因为该文件也说:
配置服务器不作为副本集运行。
答案 0 :(得分:26)
MongoDB 3.0及更早版本仅支持单一类型的配置服务器部署协议,从MongoDB 3.2开始称为旧版SCCC(同步群集连接配置)。 SCCC部署具有1个配置服务器(仅限开发)或3个配置服务器(生产)。
MongoDB 3.2弃用SCCC协议并支持新的部署类型:将服务器配置为副本集(CSRS)。 CSRS部署与标准副本集具有相同的限制,与MongoDB 3.2一样,它可以具有1个配置服务器(仅限开发)或最多50个服务器(生产)。建议在生产部署中至少使用3台CSRS服务器以实现高可用性,但其他服务器可能对地理位置分散的部署非常有用。
使用SCCC,配置服务器使用two-phase commit协议进行更新,该协议需要来自多个服务器的一致性才能进行交易。您可以使用单个配置服务器进行测试/开发,但在生产使用中,您应始终拥有3.对于MongoDB中不能仅使用2个(或超过3个)服务器的实际答案是MongoDB代码库仅支持1或3个配置服务器用于SCCC配置。
三台服务器比两台服务器提供更强的一致性保证,并允许在一台配置服务器上进行维护活动(例如备份),同时仍有两台服务器供您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个可用成员来维护主节点。可以添加其他成员以改进fault tolerance,但与正常副本集的election rules相同。 readConcern
使用majority
mongos
来确保只有在提交给大多数副本集成员和readPreference
{{}}时才能读取分片群集元数据{1}}用于将请求路由到最近的配置服务器。