Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MongoDB:Can';t启动复制集';已经有数据,无法启动集合';_Python_Mongodb_Pymongo_Replicaset - Fatal编程技术网

Python MongoDB:Can';t启动复制集';已经有数据,无法启动集合';

Python MongoDB:Can';t启动复制集';已经有数据,无法启动集合';,python,mongodb,pymongo,replicaset,Python,Mongodb,Pymongo,Replicaset,我有一个MongoDB实例 我想去。当我尝试启动replcia集时,通过对服务器执行python脚本,该服务器将成为副本集主服务器,如下所示: from pymongo import MongoClient uri = "mongodb://correctWorkingUsername:password@localhost:27017" c = MongoClient(uri) config = {'_id': 'RelicaSetName', 'members': [ {'_id': 0,

我有一个MongoDB实例

我想去。当我尝试启动replcia集时,通过对服务器执行python脚本,该服务器将成为副本集主服务器,如下所示:

from pymongo import MongoClient

uri = "mongodb://correctWorkingUsername:password@localhost:27017"
c = MongoClient(uri)

config = {'_id': 'RelicaSetName', 'members': [
{'_id': 0, 'host': 'FirstServer:27017'},
{'_id': 1, 'host': 'SecondServer:27017'},
{'_id': 2, 'host': 'ThirdServer:27017'}]}

c.admin.command("replSetInitiate", config)
我收到一条错误消息,如下所示:

'SecondSErver:27017' has data already, cannot initiate set
但是,如果我使用

mongo admin -u correctWorkingUsername -p password
我可以启动复制,并成功添加成员:

rs.initiate()
rs.add('SecondServer:27017')
我不确定这是否与密钥文件身份验证有关,或者用户已经通过脚本在其他服务器上创建。每台服务器还使用一个配置文件mongod.conf启动,该文件包含一个副本集名称


为什么会失败?rs.initiate()和rs.add()可以完美地工作,但是python脚本无法工作,尽管它实际上可以连接到数据库

一次初始化完整副本集时,每个节点都不应该有数据

当您将现有单个节点转换为副本集时,其数据将成为副本集数据,然后添加其他节点将向其复制数据,从而清除其现有数据

您应该做的是启动节点,初始化副本集,然后创建用户(仅在主节点上)

用户已经通过脚本在其他服务器上创建


这是核心问题-在副本集的未初始化成员上执行此操作的唯一方法是,首先将其作为非副本集节点启动,添加用户,然后使用
replSet
选项重新启动。这不是正确的顺序。查看正确的步骤列表。

鉴于我无法找到此特定问题的“解决方案”,我决定使用shell脚本直接执行mongodb副本启动。基本上,我使用一个shell脚本来完成他们的演练步骤。您是否对复制集的所有成员运行相同的python脚本?如果是这样的话,那就是你的问题。@helmy不,我只对RS主服务器运行脚本。为清晰起见,编辑了问题。如何让脚本在服务器上创建用户?如果使用replSet选项启动节点,则无法对其进行写入,因为将出现非主节点错误。您还说您“针对副本集主副本”尝试此操作,但在成功初始化副本集之前,没有主副本。您应该使用keyfile启动副本节点,初始化副本集,然后在主节点中创建将进行复制的用户。@AsyaKamsky当我说“反对主节点”时,我只是使用了一种约定——它还不是主节点,而是将作为主节点启动的节点。为了清晰起见进行了编辑。有趣的是,在AmazonLinux上的官方repo上安装了Mongo3.4之后,我也得到了同样的行为。我猜他们可能会添加一个默认用户或其他东西。我通过删除
/var/lib/mongo/
中的所有内容解决了这个问题,但这似乎不是必需的。我只是用python尝试了一下,一切都如我所料,但我从clean实例开始。我猜您正在使用一些安装/部署脚本,试图提供帮助。如果您仍想使用Python执行此操作,您可以启动第一个节点,然后通过Python命令添加其他节点,就像通过mongo shell一样。@AsyaKamsky您有没有想过为什么每次使用mongo shell时,这种操作顺序(在启动副本集之前在主节点上创建用户)都适用于我们,但是这个脚本失败了吗?只有在使用python脚本时,从shell启动RS完全没有问题。在shell中执行的操作与在python脚本中执行的操作不同。所有三台服务器的rs.initiate顺序与其他服务器的rs.initiate顺序不同。如果您比较shell和python脚本中的相同命令,它们绝对会给出相同的结果。