我创建了一个复制集。
我在开头的集合中添加了localhost
,但是当我尝试使用实际主机名编辑成员时。我收到错误“异常:主机无法在localhost和hostname之间切换”
我需要摆脱localhost:27017因为,否则,它不允许我输入任何其他成员作为主机名(即非本地主机地址)
my-rs0:PRIMARY> cfg=rs.conf();
{
"_id" : "my-rs0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "localhost:27017"
}
]
}
my-rs0:PRIMARY> cfg.members[0].host="my-server04:27017"
my-rs0:PRIMARY> cfg
{
"_id" : "my-rs0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "my-server04:27017"
}
]
}
使用rs.reconfig(cfg);
my-rs0:PRIMARY> rs.reconfig(cfg);
{
"errmsg" : "exception: hosts cannot switch between localhost and hostname",
"code" : 13645,
"ok" : 0
}
没有运气rs.add(“my-server04:27017”)或rs.remove(“localhost:27017”)。
my-rs0:PRIMARY> rs.add("my-server04:27017");
{
"errmsg" : "exception: can't use localhost in repl set member names except when using it for all members",
"code" : 13393,
"ok" : 0
}
我已经尝试了这里提到的所有重新配置方法Replica Set Reconfig steps 但是,没有解决上述问题。已经花了好几个小时,我真的很沮丧。
答案 0 :(得分:3)
我有同样的问题,我修复它而不删除任何数据库。刚编辑了local.system.replset集合中成员的host字段以匹配本地ip,然后重新启动mongod。一切都很完美。
答案 1 :(得分:1)
看起来您需要废弃复制品并重新开始。
我相信当你启动副本集时,你明确地传递了一个使用localhost引用你的MongoDB实例的配置文件。
在我调查这个时,我提出了一套复制品。当我使用rs.initiate()
启动副本集(不传递配置文档)时,它默认使用主机名。
rs.initiate()
rs.conf()
{
"_id" : "stack1",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "MY-HOSTNAME:28001"
}
]
}
This post描述了完成清除数据库文件以创建新副本集的需求。
完成此操作后,我通过传递配置文档启动了一个新的副本集:
cfg = {
"_id" : "stack1",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "localhost:28001"
}
]
}
rs.initiate(cfg)
rs.conf()
{
"_id" : "stack1",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "localhost:28001"
}
]
}
简而言之,您需要删除--dbpath
目录中的所有文件并重新创建副本集,而不明确指定“localhost”作为主机名。
答案 2 :(得分:0)
我根据docs:
做了在另一个端口(例如37107)上重启MongDB以防止用户连接到它。
然后在它上面开了一个shell:
$ mongo --port 37017
use local
cfg = db.system.replset.findOne( { "_id": "my-rs0" } )
cfg.members[0].host = "my-server04:27017"
db.system.replset.update( { "_id": "my-rs0" } , cfg )