我正在尝试使用replSet = 1启动mongod,如下所示: $ mongod --dbpath / x / y --replSet 1
但是我一直收到错误,比如“你需要通过调用rs.initiate()初始化复制集”,然后我启动一个mongo shell来发出rs.initiate(),问题就解决了。
但我的问题是为什么需要单独的mongo shell?有没有办法使用mongod选项?
答案 0 :(得分:2)
没有
不,因为使用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。