MongoDB:无法启动副本集; '已有数据,无法启动设置'

Mr.*_*ris 13 python mongodb pymongo replicaset

我有一个MongoDB实例,使用配置文件和密钥文件进行设置.

我想用pymongo启动一个副本集.当我尝试启动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)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,如下:

'SecondSErver:27017' has data already, cannot initiate set
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用数据库进行身份验证

mongo admin -u correctWorkingUsername -p password
Run Code Online (Sandbox Code Playgroud)

我可以启动复制,并成功添加成员:

rs.initiate()
rs.add('SecondServer:27017')
Run Code Online (Sandbox Code Playgroud)

我不确定这是否与密钥文件身份验证有关,或者是否由用户脚本在其他服务器上创建了ALREADY.每个服务器也都使用配置文件mongod.conf启动,该文件包含副本集名称.

为什么这会失败?rs.initiate()和rs.add()完美地工作,但python脚本虽然可以实际连接到数据库但不起作用.

Asy*_*sky 4

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

当您将现有的单个节点变成副本集时,其数据将成为副本集数据,然后添加其他节点会将数据复制到它们,从而清除其现有数据。

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

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

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