【问题标题】:Initializing mongo replica set only once只初始化一次 mongo 副本集
【发布时间】:2019-07-15 14:33:16
【问题描述】:
我正在尝试将相同的 docker 容器自动部署到多个服务器。部署由一个 python 脚本和一个 mongodb 数据库组成,应该在副本集中连接到其他 mongodb 实例。
我发现副本集的大部分设置都清晰且有据可查。但是,在关注 this 教程时,我遇到了以下问题:
在副本集的只有一个 mongod 实例上运行rs.initiate()。
假设 python 脚本可以访问要部署容器的服务器的详尽列表(但可能尚未运行)(i)我如何确保rs.initiate() 是整个副本集只运行一次而无需人工干预? (ii) 多次运行rs.initiate() 的后果是什么?
【问题讨论】:
标签:
python
mongodb
pymongo
【解决方案1】:
副本集具有在所有节点之间共享的内部状态信息。例如,如果你在每个单个节点上同时运行rs.initiate,每个节点都会尝试发起自己的副本集,一个节点会拒绝加入其他节点的副本集,因为它们是不同的副本套。
您的供应逻辑需要选择一个节点来运行rs.initiate。
例如,您可以通过按字母顺序对主机名进行排序并使用第一个主机进行启动来做到这一点。
【解决方案2】:
您可以事先检查状态:
if (rs.status().codeName == "NotYetInitialized") rs.initiate()
如果您多次运行rs.initiate(),则会出现错误:
{
"operationTime" : Timestamp(1612356173, 1),
"ok" : 0,
"errmsg" : "already initialized",
"code" : 23,
"codeName" : "AlreadyInitialized",
}