【发布时间】: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