【发布时间】:2017-04-30 08:23:02
【问题描述】:
我有一个 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 脚本无法正常工作,尽管它实际上可以连接到数据库。
【问题讨论】:
-
鉴于我找不到这个特定问题的“解决方案”,我决定使用 shell 脚本直接执行 mongodb 副本启动。基本上我正在使用一个shell脚本来完成他们的演练步骤。 api.mongodb.com/python/current/examples/high_availability.html
-
您是否对副本集的所有成员运行相同的 python 脚本?如果是这样,那是你的问题。
-
@helmy 不,我只针对 RS 主节点运行脚本。为了清楚起见,编辑了问题。
-
如何让脚本在服务器上创建用户?如果您使用 replSet 选项启动节点,则无法写入它们,因为您将收到 not master 错误。您还说您尝试“针对副本集主” - 但是在您成功初始化副本集之前没有主。您应该使用密钥文件启动副本节点,初始化副本集,然后在将复制的主节点中创建用户。
-
@AsyaKamsky 当我说“反对主节点”时,我只是在使用约定——它还不是主节点,它将作为主节点开始。为清晰起见进行了编辑。
标签: python mongodb pymongo replicaset