我正在尝试将相同的Docker容器自动部署到多个服务器。部署由一个python脚本和一个mongodb数据库组成,该数据库应以副本集的形式连接到其他mongodb实例。
我发现副本集的大多数设置都很清楚,并有据可查。但是,在遵循this教程时,我遇到了以下问题:
在副本集上只有一个且只有一个 mongod实例上运行
rs.initiate()
。
假设python脚本可以访问要部署容器(但可能尚未运行)的服务器的详尽列表。(i)如何确保{{1} }整个副本集仅运行一次,而无需人工干预? (ii)多次运行rs.initiate()
有什么后果?
答案 0 :(得分:0)
副本集具有所有节点之间共享的内部状态信息。例如,如果您在每个单个节点上同时运行rs.initiate
,则每个节点将尝试启动自己的 副本集,并且一个节点将拒绝加入其他节点的副本集,因为它们是不同的副本集。
您的配置逻辑需要选择一个节点来运行rs.initiate
。
例如,您可以通过按字母顺序对主机名进行排序,然后使用第一个主机进行初始化来实现。
答案 1 :(得分:0)
您可以提前查看状态:
if (rs.status().codeName == "NotYetInitialized") rs.initiate()
如果您多次运行 rs.initiate()
,则会出现错误:
{
"operationTime" : Timestamp(1612356173, 1),
"ok" : 0,
"errmsg" : "already initialized",
"code" : 23,
"codeName" : "AlreadyInitialized",
}