MongoDB分片:主机不属于副本集



我是Mongo新手。我正在尝试同时使用分片和复制来构建MongoDB集群。我想要实现的集群架构是:https://github.com/ansible/ansible-examples/raw/master/mongodb/images/site.png我正在使用服务器IP作为复制集名称。也就是说,我正在用以下命令构建复制集:

rs.initiate()
rs.add("10.148.28.51:27118")
rs.add("10.148.28.52:27118")
rs.add("10.148.28.53:27118")

复制配置正确,因此当我在PRIMARY主机10.148.28.51上执行rs.status()时,我得到的repl.set名称为"10.148.28.5 1":https://gist.github.com/daniilyar/630bc6fe7723ed06f243

但当我试图在mongos实例中添加碎片时,它会给我两个相反的错误(取决于我使用的addShard()语法变体):

mongos> sh.addShard("10.148.28.51:27118")
{
"ok" : 0,
"errmsg" : "host is part of set 10.148.28.51, use replica set url format     <setname>/<server1>,<server2>,...."
}
mongos> sh.addShard("10.148.28.51/10.148.28.51:27118") 
{
"ok" : 0,
"errmsg" : "in seed list 10.148.28.51/10.148.28.51:27118, host 10.148.28.51:27118 does not belong to replica set 10.148.28.51"
}

如果Mongo告诉"主机X在副本集Y中",同时"主机X不属于副本集Y",我如何添加shard?

如有任何帮助,将不胜感激

根据您的描述,您似乎需要调整使用rs.add(..)命令的方式。您声明使用IP地址作为副本集的名称,但rs.add(…)不是这样解释参数的。

您传递的参数是要添加到复制集的mongod实例的主机名(或IP)和端口,而不是复制集名称。当通过mongo连接到主设备时,您可以设置此配置。replSet名称是在主系统启动时设置的:

mongod --replSet "rs1"

将设置为rs1的名称。

我会读一遍:http://docs.mongodb.org/manual/tutorial/convert-replica-set-to-replicated-shard-cluster/因为它几乎涵盖了你想要做的事情。

我还想考虑一下你试图实现的目标,因为听起来(从你的描述中)你可能会得到一个复制的碎片(!!),而你很可能想要创建多个碎片,每个碎片都有复制的数据。

参考

rs.add命令-http://docs.mongodb.org/manual/reference/method/rs.add/

rs.addShard命令-http://docs.mongodb.org/manual/reference/method/sh.addShard/碎片群集-http://docs.mongodb.org/manual/core/sharded-cluster-components/

谢谢你的解释,现在我明白了。如果您在rs.add(IP:port)中使用,Mongo会添加名为IP-X-Y-Z-R:的副本集成员。这似乎是Mongo的默认行为。所以在我的案例中,解决方案是使用命令:

sh.addShard("10.148.28.51/**ip-10-148-28-51**:27118") 

而不是:

sh.addShard("10.148.28.51/**10.148.28.51**:27118") 

最新更新