【问题标题】:starting mongodb single server as replica set to enable oplog through supervisord启动 mongodb 单服务器作为副本集以通过 supervisord 启用 oplog
【发布时间】:2021-07-20 22:18:53
【问题描述】:

我想用命令启动一个 mongod 实例 mongod --config config/mongod.conf 一旦上述过程开始运行,我也必须调用 mongodb/bin/mongo --eval rs.initiate() 现在的问题是我通过 supervisord 启动 mongod 我想一个接一个地执行上述两个操作。 supervisord 只需 1 个命令即可启动第一个命令的进程。我没有其他地方可以运行 rs.initiate()。 如果我将这两个命令都放在 shell 脚本中,那么控件将被第一个命令本身卡住。

【问题讨论】:

    标签: mongodb replication supervisord


    【解决方案1】:

    也许您可以将这些命令组合成一个命令。即,

    mongod --config config/mongod.conf && sleep 5 && mongodb/bin/mongo --eval rs.initiate()

    sleep 命令假定 5 秒足以让 mongod 启动并可供 rs.initiate() 使用。鉴于您正在启动一个副本集,我假设您没有数据?如果是这样,启动应该相对较快。此外,如果您尝试制作单节点副本集,您可能需要考虑...

    rs.initiate (
        {
            _id: "somereplicasetname",
            version: 1,
            members:
            [
                { _id: 0, host: "somehostname:27017" }
            ]
        }
    )
    

    ... 这样您就不需要进一步配置已启动的副本集。 _id 值(当前显示为somereplicasetname)预计与配置文件mongod.conf 中的副本集名称匹配,somehostname 预计将解析为当前主机。

    顺便说一句,我假设你知道你只需要初始化一个副本集一次,而不是每次你启动 mongod 进程时......

    【讨论】:

    • 1.关于添加 && 不幸的是,supervisord 无法识别 '&&' 参数 2. 对于睡眠,我添加了对 rs.status() 的调用以检查 mongod 是否已启动并运行并添加了更长的超时时间 3. rs.initialize 是如何工作的?如果我拒绝 mongod 进程,它是如何保留状态以便我不需要再次运行 rs.initiate() 的?
    • @ShilpaGupta - MongoDB 是一个数据库。状态可以保存在数据库的磁盘上。除非,也就是说,您只想在内存中运行数据库(您没有指定仅内存,所以我假设它可以持久保存到磁盘)。因此,假设您可以将数据存储在磁盘上,调用 rs.initiate() 将在数据库中创建元数据并保存。如果您重新启动集群,它会调用该状态。我的评论是关于如何配置副本集,一旦您启动集群并请求使其成为副本集而不是独立集 - 这就是 rs.initiate() 所做的。
    • ... 而且,副本集(也称为“rs”)用于高可用性。它还包括复制框架,这是更改流等某些功能的基础。因此,当您调用 rs.initiate() 时,您是在对数据库说,您希望它是一个高可用的副本集,而不是一个独立的数据库系统。
    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2012-09-08
    • 2016-02-19
    • 2018-03-26
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多