【问题标题】:How to initialize mongodb replication set without calling rs.initiate()?如何在不调用 rs.initiate() 的情况下初始化 mongodb 复制集?
【发布时间】:2014-08-30 18:16:47
【问题描述】:

我正在尝试使用 replSet=1 启动 mongod,如下所示: $mongod --dbpath /x/y --replSet 1

但是我不断收到诸如“您需要通过调用 rs.initiate() 来初始化复制集”之类的错误,然后我启动一个 mongo shell 来发出 rs.initiate() 并且问题得到解决。

但我的问题是为什么需要一个单独的 mongo shell?有没有办法使用 mongod 选项?

【问题讨论】:

标签: mongodb


【解决方案1】:

简答/tl;dr

没有。

答案稍长

不,因为使用 shell 是有意义的。

回答

当您设置副本集时,通常会有多个成员。在副本集初始化之前,没有一个成员拥有必要的配置。初始化副本集的节点成为主节点,存储配置。现在您可以使用rs.add 命令或rs.reconfig 添加成员。然后发生的事情是主要联系添加的成员,同步配置以及其他一些事情。最佳实践是普通副本集成员应该相等,这样一个节点发生故障时,另一个节点成为主节点并没有缺点,因此新的主节点可以保持主节点,直到它由于某种原因或另一个节点本身关闭。

所以如果你要启动一个副本集成员,它应该从哪里获取它的配置?自己决定它必须做什么?这在集群中效果不佳。它应该如何发现其他成员及其配置?请记住,副本集成员可以位于不同的数据中心。如果有 --IamPrimaryDoAsISay 选项,如果集群中当前有另一个主节点会发生什么?应该如何处理多个成员开始使用该选项的情况?降级另一台服务器?可能只是因为你换了一个冷却器?或者当已经有一个主实例时,刚刚启动的实例应该什么都不做?那么这个选项首先有什么意义呢?

所有这些复杂性只是为了防止来自 shell 的单个命令?

注意:如果您想要一个服务器,只需启动一个独立实例(没有--replSet 选项的 mongod)。如果您想探索副本集的可能性,您需要多个成员。

【讨论】:

  • --eval 怎么样?可以在mongo启动后完成,但仍然来自shell吗?我想做的是自动化整个过程,这里stackoverflow.com/q/27449306/429521
  • @FelipeSabino:你重新发明了轮子。深入了解mms.mongodb.com
  • 我明白你的意思,mms 是一个很好的提示,我不知道它可以像那样启动环境......但是 docker 使得复制环境变得非常容易,也让它变得容易当您有多个项目正在进行并且每个环境同时使用多个版本的 mongodb 时进行本地测试
【解决方案2】:

但我的问题是为什么需要单独的 mongo shell?

没有,因为rs.initiate() 还具有配置选项的功能,以及不能在命令行选项中指定(而且您可能不想指定)的功能。

此外,rs.initiate() 仅在主节点上运行,因此它实际上不会在副本集中每个节点的启动时运行。

由于 MongoDB 无法确定它是集合的一部分或它在集合中的位置,rs.initiate() 有点告诉 mongod 进程一些关于它自己的信息。

【讨论】:

  • 您可以在没有任何配置选项的情况下运行rs.initiate() - 如果未提供任何配置选项,则将使用默认配置。但是,由于您仅在将副本集作为服务器命令行选项没有意义时才启动它。通常,您还希望查看命令是否成功的反馈,并可能提供额外的配置选项以在单个命令中创建多节点副本集。
  • @Stennie 哎呀,所以我说需要,不知道为什么。
【解决方案3】:

不,如果没有 rs.initiate(),你将无法做到这一点

var x = rs.initiate(                                                                                    
    { _id:'z',                                                                                              
      members:[                                                                                             
        { _id:1, host:'52.68.124.177:27001' },                                                                   
        { _id:2, host:'52.68.124.132:27001' },                                                                   
        { _id:3, host:'52.68.124.181:27001' }                                                                    
      ]                                                                                             
    }   

以下命令将向副本集添加三个成员。

printjson(x);    

上述命令可用于打印带有副本集成员的 JSON。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 2020-05-21
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多