MongoDB 副本集成员状态是 "OTHER"

MongoDB Replica Set Member State is "OTHER"

三个成员,主要和次要 - 第三个是 "OTHER" - 我找不到关于该状态的任何信息,不知道该怎么做,我已经重新启动了实例,但它总是上来一样。找不到关于该状态的文档。

我是副本集的新手 - 如有任何帮助,我们将不胜感激。

为了后代 - 问题是实例无法与主要或次要同步,因为它停机时间太长。它进入了一种尝试主要和次要的状态,一遍又一遍,永远不允许同步。这最终创建了一个 8GB 的​​日志文件,我无法打开它,所以我当时看不出问题所在。解决方案显然是停止错误的 mongo 实例 - 转储其数据 - 然后重新启动它,就好像它是副本集的新成员一样。

我能够复制该场景,这就是我从命令提示符显示 OTHER:

的 mongod rs.status() 中得到的结果
{
    "state" : 10,
    "stateStr" : "REMOVED",
    "uptime" : 41,
    "optime" : {
        "ts" : Timestamp(1518192445, 1),
        "t" : NumberLong(26)
    },
    "optimeDate" : ISODate("2018-02-09T16:07:25Z"),
    "ok" : 0,
    "errmsg" : "Our replica set config is invalid or we are not a member of it",
    "code" : 93,
    "codeName" : "InvalidReplicaSetConfig",
    "operationTime" : Timestamp(1518192445, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1518193246, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

让我们假设有故障的 mongod 是您在 rs.conf() 时得到的 JSON 数组的 members 数组中的第 3 个成员(索引 2)。转到您的主节点并从副本集中删除有故障的 mongod:

rsconf = rs.conf()
rsconf.members = [rsconf.members[0], rsconf.members[1]] //index 0 and 1 are your working members, we're omitting the 3rd member which is faulty.
rs.reconfig(rsconf);

现在重新启动显示为 OTHER 的 mongod。然后再次转到您的主要成员并再次添加该成员。假设 IP 为 10.00.00.00,端口为 27019:

rs.add("10.00.00.00:27019")

这解决了问题,状态从 OTHER 更改为 SECONDARY。

请注意,reconf 将重置所有客户端连接。您可能需要大约一分钟的维护 window 来进行重新配置。

配置设置不正确。

您可以使用以下命令进行初始化:

rs.initiate({
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "localhost:27017" }
      ]
   }
)

如果您已经启动,您可能会收到像我这样的错误消息:

singleNodeRepl:OTHER> rs.initiate({ _id: "rs0", members: [ { _id: 0, host : "localhost:27017" } ] } )
{
    "info" : "try querying local.system.replset to see current configuration",
    "ok" : 0,
    "errmsg" : "already initialized",
    "code" : 23,
    "codeName" : "AlreadyInitialized"
}

解决方法是reconf mongo:

singleNodeRepl:OTHER> rsconf = rs.conf()
singleNodeRepl:OTHER> rsconf.members = [{_id: 0, host: "localhost:27017"}]
[ { "_id" : 0, "host" : "localhost:27017" } ]
singleNodeRepl:OTHER> rs.reconfig(rsconf, {force: true})
{ "ok" : 1 }
singleNodeRepl:OTHER>
singleNodeRepl:SECONDARY>
singleNodeRepl:PRIMARY>

更改优先级

假设您有三个成员

rs0:OTHER> cfg = rs.conf()

rs0:OTHER> cfg.members[0].priority = 1

rs0:OTHER> cfg.members[1].priority = 0.5

rs0:OTHER> cfg.members[2].priority = 0.5

rs0:OTHER> rs.reconfig(cfg, {force: true})

rs0:OTHER> rs.config()

rs0:PRIMARY>

我的解决方案是:断开与 robot3t 和我电脑上使用的所有 mongodb Gui(指南针..)的连接。然后当我重新打开 mongo shell 它连接为主。