如何在不调用rs.initiate()的情况下初始化mongodb复制集?

时间:2014-08-30 18:16:47

标签: mongodb

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

但是我一直收到错误,比如“你需要通过调用rs.initiate()初始化复制集”,然后我启动一个mongo shell来发出rs.initiate(),问题就解决了。

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

3 个答案:

答案 0 :(得分:2)

简短回答/ tl;博士

没有

答案稍长

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

答案

设置副本集时,通常会有多个成员。在初始化副本集之前,没有成员保持必要的配置。初始化副本集的节点将成为主节点,存储配置。现在,您可以使用rs.add命令或使用rs.reconfig添加成员。然后发生的事情是主要联系添加的成员,配置被同步和其他一些事情。最佳做法是普通副本集成员应该相等,以便一个节点失败,没有缺点,另一个节点成为主节点,因此新主节点可以保持主要状态,直到它因某种原因或另一个节点发生故障。

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

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

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

答案 1 :(得分:1)

  

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

不,因为rs.initiate()还具有配置选项的能力,以及在命令行选项中无法指定的内容(以及您可能不想指定)。

同样rs.initiate()仅在主服务器上运行,因此它不会在副本集中每个节点的启动时由defacto运行。

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

答案 2 :(得分:1)

如果没有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。