在阅读了MongoDB分片架构的官方文档之后,我还没有找到为什么需要一个或三个配置服务器,而不是另一个服务器.

MongoDB documentation on Config Servers人说:

"如果一个或两个配置服务器不可用,群集的元数据将变为只读.您仍然可以从碎片中读取和写入数据,但在所有三个服务器都可用之前,不会发生块迁移或拆分."

因此产生了这样的反思:一台服务器相当于一个单点故障,但对于两台服务器,我们的行为与三台服务器相同,对吗?

那么,举例来说,为什么绝对是三台服务器,而不是两台或更多?

因为doctor 说:

配置服务器不作为副本集运行.

推荐答案

配置服务器协议

MongoDB 3.0及更早版本仅支持单一类型的配置服务器部署协议,自MongoDB 3.2起,该协议被称为旧版SCCC(同步群集连接配置).SCCC部署有1个配置服务器(仅限开发)或3个配置服务器(生产).

MongoDB 3.2不支持SCCC协议,并支持一种新的部署类型:将服务器配置为副本集(CSR).CSRS部署与标准副本集具有相同的限制,在MongoDB 3.2中,标准副本集可以有1台配置服务器(仅限开发)或最多50台服务器(生产).为了在生产部署中实现高可用性,建议至少使用3台CSRS服务器,但对于地理分布的部署,额外的服务器可能会很有用.

SCCC(同步群集连接配置)

使用SCCC,配置服务器将使用two-phase commit协议进行更新,该协议要求多个服务器就一个事务达成一致.可以使用单个配置服务器进行测试/开发,但在生产使用中,应该始终使用3个配置服务器.对于为什么不能在MongoDB中只使用2台(或3台以上)服务器,一个实用的答案是,MongoDB代码库only支持1台或3台配置服务器进行SCCC配置.

与两台服务器相比,三台服务器提供了更强的一致性保证,并允许在一台配置服务器上进行维护活动(例如,备份),同时仍有两台服务器可供您的用户查询.超过三台服务器会增加跨所有服务器提交数据所需的时间.

切分集群的元数据需要在所有配置服务器上都相同,并且由MongoDB切分实现维护.元数据包括当前保存文档范围的碎片的基本细节(又名chunks).在SCCC配置中,配置服务器是一个副本集,因此如果一个或多个配置服务器脱机,那么配置数据将是只读的——否则,当脱机配置服务器重新联机时,数据将无法传播到脱机配置服务器.

显然,1配置服务器不提供冗余或备份.对于2台配置服务器,一个潜在的故障场景是,服务器可用,但服务器上的数据不一致(例如,其中一台服务器出现了一些数据损坏).有了3个配置服务器,您可以在前面的场景中进行改进:2/3服务器可能是一致的,您可以识别出单独的服务器.

CSR(将服务器配置为副本集)

MongoDB 3.2反对在配置服务器上使用三个镜像mongod实例,从3.2开始,配置服务器(默认情况下)部署为副本集.副本集配置服务器必须使用WiredTiger 3.2+存储引擎(或支持新的readConcern读取隔离语义的另一个存储引擎).CSRS还不允许一些不适用于分片集群元数据用例的非默认副本集配置选项(例如arbiterOnlybuildIndexesslaveDelay).

CSRS部署提高了配置服务器的一致性和可用性,因为MongoDB可以利用标准副本集读写协议对配置数据进行分片.此外,这允许分片集群拥有3个以上的配置服务器,因为副本集最多可以有50个成员(如MongoDB 3.2).

在CSRS部署中,写可用性取决于维护可以查看副本集当前主副本的成员的仲裁.例如,一个3 node 副本集需要两个可用成员来维护一个主副本集.可以添加额外的成员以获得改进的fault tolerance,但需遵守与普通副本集相同的election rules.mongos使用majority中的readConcern来确保分片集群元数据只有在提交给大多数副本集成员后才能读取,而nearest中的readPreference用于将请求路由到最近的配置服务器.

Mongodb相关问答推荐

从MongoDB中的嵌套数组中提取找到的值及其索引

Mongo Aggregate管道-另一个集合中的多个查找

在MongoDB集合中按文档内的频率对数组排序

定期自动轮换 MongoDb 集合

使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口

Node.js 数据库的抽象层

mongoose如何在幕后工作

.NET 4 中是否有 mongodb C# 驱动程序支持 System.Dynamic.DynamicObject?

Golang/mgo:如何让 MongoDB 在字段中使用当前时间?

字段类型在 MongoDB 索引中是否重要?

Mongoose:填充填充字段

如何在 Mongoose 中更新数组值

MongoDB $or 查询

MongoDB Java API:put() 与 append()

如何在 MongoDB 聚合查询中使用 $hint?

MongoDB - Permission denied for socket: /tmp/mongodb-27017.sock

RoboMongo:不显示所有文档

如何通过键名从 mongoDB 中检索值?

有没有办法防止 MongoDB 向集合名称添加复数形式?

哪个数据库适合我的应用程序 mysql 或 mongodb ?使用 Node.js 、 Backbone 、 Now.js