exception:hosts无法在localhost和hostname之间切换

时间:2013-11-27 22:50:50

标签: mongodb

我创建了一个复制集。 我在开头的集合中添加了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 但是,没有解决上述问题。已经花了好几个小时,我真的很沮丧。

3 个答案:

答案 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

做了
  1. 在另一个端口(例如37107)上重启MongDB以防止用户连接到它。

  2. 然后在它上面开了一个shell:

  3. $ mongo --port 37017
    
    1. 然后更新了配置:
    2. 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 )
      
      1. 然后在原始端口重新启动MongoDB。