让我们想象一下:
在启动所有实例(rs0_0,rs0_1,rs0_0,cfg0,cfg1,cfg2,mos0)后,我们配置副本集:
mongo rs0_0_host:rs0_0_port
rs.initiate()
cfg = rs.conf()
cfg.members[0].priority = 100 (rs0_0 will be the primary if alive)
rs.reconfig(cfg)
rs.add("rs0_1_host:rs0_1_port")
rs.addArb("rs0_2_host:rs0_2_port") (arbiter)
然后我们将副本集(作为分片)添加到群集中:
mongo mos0_host:mos0_port
use admin
db.runCommand({ addShard: "rs0/rs0_0_host:rs0_0_port", maxSize: 400000, name: "shard_rs0" })
现在让我们假设整个集群(所有实例)都关闭,然后除了rs0_0之外所有实例都会启动。副本集(碎片)是如何联系的?
我的意思是:我的应用程序(或mongo shell)连接到mos0,mos0要求配置服务器(cfg0,cfg1和/或cfg2),配置服务器返回“rs0 / rs0_0_host:rs0_0_port”(由于“addShard”命令我们确实从他们的配置运行),然后mos0尝试连接到“rs0_0_host:rs0_0_port”,但它不能,因为rs0_0已关闭。那么,mos0如何知道rs0_1和rs0_2(存活的副本集实例)的存在?
当然,我们可以用这种方式配置分片:
db.runCommand({ addShard: "rs0/rs0_0_host:rs0_0_port,rs0_1_host:rs0_1_port,rs0_2_host:rs0_2_port", maxSize: 400000, name: "shard_rs0" })
以这种方式,mos0将从配置服务器接收完整的副本集实例列表。但是,从MongoDB 2.0.3开始,只需要在“addShard”命令中指定一个(副本集)实例。那么诀窍在哪里?
答案 0 :(得分:0)
在这种情况下,mongos
将保存内存中的relpica集的内部映射,每隔一段时间就会刷新一次(就像驱动程序一样),此时成员开始上线它会做一些检查以及不检测应该联系哪个成员的内容。在有主要内容之前,它无法写入成员。
如果重新启动mongos并且配置的成员处于脱机状态,则种子列表很好,此时mongos可以将另一个成员作为种子。