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

时间:2015-02-25 18:56:15

标签: mongodb sharding

我是一名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()时,我得到“10.148.28.51”作为repl.set名称:https://gist.github.com/daniilyar/630bc6fe7723ed06f243

但是当我尝试在mongos实例中添加分片时,它会给出2个相反的错误(取决于我使用的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”,如何添加分片?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

从你的描述听起来你需要调整你使用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/

答案 1 :(得分:0)

谢谢你的解释,现在我明白了。如果在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")