只初始化一次 mongo 副本集

Posted

技术标签:

【中文标题】只初始化一次 mongo 副本集【英文标题】:Initializing mongo replica set only once 【发布时间】:2019-07-15 14:33:16 【问题描述】:

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

我发现副本集的大部分设置都清晰且有据可查。但是,在关注 this 教程时,我遇到了以下问题:

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

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

【问题讨论】:

【参考方案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",

【讨论】:

以上是关于只初始化一次 mongo 副本集的主要内容,如果未能解决你的问题,请参考以下文章

mongodb数据库安装 & 设置管理员密码(单独mongo,无副本集)

mongodb单机升级为副本集

mongo转换副本集

mongo副本集mongos启动报错

Mongo副本集搭建

springboot 连接mongo副本集报错记录