MongoDB: 无法启动副本集; 'has data already, cannot initiate set'

MongoDB: Can't initiate replica set; 'has data already, cannot initiate set'

我有一个 MongoDB 实例,set up using a config file and a key file

我愿意initiate a replica set using pymongo。当我尝试启动副本集时,通过对将成为副本集主服务器的服务器执行 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 脚本不工作,尽管它实际上可以连接到数据库。

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

当你将一个现有的单个节点变成一个副本集时,它的数据就变成了副本集的数据,然后添加额外的节点会将数据复制到它们,从而消除它们现有的数据。

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

the users were ALREADY created on the other servers by a script

这是核心问题 - 在副本集的未初始化成员上完成此操作的唯一方法是,如果它首先作为非副本集节点出现,添加用户,然后它是使用 replSet 选项重新启动。这不是要遵循的正确顺序。对于正确的步骤列表 check the docs.