仅初始化一次mongo副本集

时间:2019-02-21 15:52:50

标签: python mongodb pymongo

我正在尝试将相同的Docker容器自动部署到多个服务器。部署由一个python脚本和一个mongodb数据库组成,该数据库应以副本集的形式连接到其他mongodb实例。

我发现副本集的大多数设置都很清楚,并有据可查。但是,在遵循this教程时,我遇到了以下问题:

  

副本集上只有一个且只有一个 mongod实例上运行rs.initiate()

假设python脚本可以访问要部署容器(但可能尚未运行)的服务器的详尽列表。(i)如何确保{{1} }整个副本集仅运行一次,而无需人工干预? (ii)多次运行rs.initiate()有什么后果?

2 个答案:

答案 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",
}