我正在尝试使用 replSet=1 启动 mongod,如下所示: $mongod --dbpath /x/y --replSet 1
但是我不断收到诸如“您需要通过调用 rs.initiate() 来初始化复制集”之类的错误,然后我启动了一个 mongo shell 来发出 rs.initiate() 并且问题得到解决。
但我的问题是为什么需要一个单独的 mongo shell?有没有办法使用 mongod 选项来做到这一点?
不。
不,因为使用 shell 是有意义的。
当您设置副本集时,您通常有多个成员。在副本集初始化之前,没有任何成员拥有必要的配置。您在其上初始化副本集的节点将成为主节点,用于存储配置。现在,您可以使用rs.add命令或使用添加成员rs.reconfig。然后发生的事情是主要联系添加的成员,配置同步以及其他一些事情。最佳实践是,普通副本集成员应该是相等的,这样一个节点发生故障时,另一个节点成为主节点就没有缺点了,因此新的主节点可以保持主节点状态,直到它由于某种原因或另一个节点本身宕机为止。
因此,如果您要启动一个副本集成员,它应该从哪里获取其配置?自己决定它必须做什么?这在集群中效果不佳。它应该如何发现其他成员及其配置?请记住,副本集成员可以位于不同的数据中心。如果有一个--IamPrimaryDoAsISay选项,如果集群中当前有另一个主节点,会发生什么情况?如果有多个成员开始使用该选项,应该如何处理?另一个服务器的降级?可能只是因为你更换了散热器?或者当已经有主实例时,刚刚启动的实例应该不执行任何操作?那么这个选择首先有什么意义呢?
所有这些复杂的情况只是为了阻止来自 shell 的单个命令?
注意:如果您想要一台服务器,只需启动一个独立实例(不带选项的 mongod --replSet)。如果您想探索副本集的可能性,则需要多个成员。