【问题标题】:mongodb replica set changes take two attempts to workmongodb 副本集更改需要两次尝试才能生效
【发布时间】:2014-08-10 03:26:44
【问题描述】:

我正在使用 Mongodb 2.6.1 我有一个跨两个数据中心的 4 节点解决方案(2 个 dbs,2 个仲裁器,但一个仲裁器始终不在复制集中)

{
  "_id": "prelRS",
  "members": [
    {
      "_id": 1,
      "host": "serverInDataCenter1:27011",
      "priority": 6
    },
    {
      "_id": 3,
      "host": "serverInDataCenter2:27013",
      "priority": 0
    },
    {
      "_id": 5,
      "host": "serverInDataCenter1:27015",
      "arbiterOnly": true
    }
  ]
}

当我们遇到 DR 情况并且只需要使用 DataCenter2 时,我们将 当我尝试从 relica 集中取出主节点并使次节点成为主节点时,需要两次尝试强制应用配置,这似乎是瞬态问题。下面被应用到 27013 节点,并且在几秒钟内完成。

prelRS:SECONDARY> cfg={
...   "_id": "prelRS",
...   "members": [
...     {
...       "_id": 3,
...       "host": "serverInDataCenter2:27013",
...       "priority": 4
...     },
...     {
...       "_id": 6,
...       "host": "serverInDataCenter2:27016",
...       "arbiterOnly": true
...     }
...   ]
... }
{
        "_id" : "prelRS",
        "members" : [
                {
                        "_id" : 3,
                        "host" : "serverInDataCenter2:27013",
                        "priority" : 4
                },
                {
                        "_id" : 6,
                        "host" : "serverInDataCenter2:27016",
                        "arbiterOnly" : true
                }
        ]
}
prelRS:SECONDARY> rs.reconfig(cfg, {force : true})
{
        "errmsg" : "exception: need most members up to reconfigure, not ok : serverInDataCenter2:27016",
        "code" : 13144,
        "ok" : 0
}
prelRS:SECONDARY> rs.reconfig(cfg, {force : true})
{ "ok" : 1 }
prelRS:SECONDARY>

当我从 27013 节点重新添加 27011 节点(作为较低优先级的副本)时,似乎也是这种情况

cfg={
  "_id": "prelRS",
  "members": [
    {
      "_id": 1,
      "host": "serverInDataCenter1:27011",
      "priority": 2
    },
    {
      "_id": 3,
      "host": "serverInDataCenter2:27013",
      "priority": 4
    },
    {
      "_id": 5,
      "host": "serverInDataCenter1:27015",
      "arbiterOnly": true
    }
  ]
}
prelRS:PRIMARY> rs.reconfig(cfg)
{
        "errmsg" : "exception: need most members up to reconfigure, not ok : serverInDataCenter1:27015",
        "code" : 13144,
        "ok" : 0
}
prelRS:PRIMARY> rs.reconfig(cfg)
2014-08-08T20:53:03.192+0100 DBClientCursor::init call() failed
2014-08-08T20:53:03.193+0100 trying reconnect to 127.0.0.1:27013 (127.0.0.1) failed
2014-08-08T20:53:03.193+0100 reconnect 127.0.0.1:27013 (127.0.0.1) ok
reconnected to server after rs command (which is normal)

但是当我使用我提到的第一个配置(应用于 27011 节点)再次将该节点设为主节点时,它似乎没有发生 但是这个动作并没有在集合中添加仲裁者,所以也许这就是发生了什么的线索?

我现在意识到,我可能需要在 DR 期间将 27011 作为优先级 0 留在副本集中,即使它不可用,但如果所有 dataCenter1 都不可用,我仍然必须将 27016 添加到集合中并且取出27105,调用DR时会遇到上面的错误

任何建议为什么这需要两次尝试才能起作用?

谢谢

【问题讨论】:

  • 您使用的是什么操作系统?还值得注意的是,您可以将仲裁器放置在第三个 DC 中,以允许自动故障转移到主 DC 或辅助 DC,而无需手动强制 reconfig()
  • Linux 2.6.18。关于第三个数据中心的好主意;不过现在没有能力。
  • 仲裁器是轻量级的——它不存储或复制任何数据,因此只要网络可靠,您就可以在第三个位置使用小型实例。不过,您仍然需要正确地secure the network,以便所有 DC 中的副本集节点可以相互连接。

标签: mongodb replication


【解决方案1】:

问题在于您的仲裁者不是“真正的”副本集成员,因此对于某些操作,您将无法达到集上的法定人数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多