【问题标题】:MongoDB: Can't initiate replica set; 'has data already, cannot initiate set'MongoDB:无法启动副本集; '已有数据,无法启动设置'
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 有趣的是,在 Amazon Linux 上的官方存储库中未改动地安装 mongo 3.4 后,我得到了相同的行为。我猜他们可能会添加一个默认用户或其他东西。我通过删除/var/lib/mongo/ 中的所有内容解决了这个问题,但似乎没有必要这样做。
  • 我刚刚用 python 尝试了这个,一切正常,但我从干净的实例开始。我猜你正在使用一些试图提供帮助的安装/部署脚本。如果您仍想使用 Python 执行此操作,您可以启动第一个节点,然后通过 Python 命令添加其他节点,与通过 mongo shell 相同。
  • @AsyaKamsky 关于为什么这种操作顺序(在启动副本集之前在主节点上创建用户)每次使用 mongo shell 时都对我们有效,但使用此脚本失败的任何想法?仅在使用 python 脚本时,我们从 shell 启动 RS 时完全没有遇到任何问题。
  • 您在 shell 中执行的操作与您在 python 脚本中执行的操作不同。 rs.initiate 与所有三台服务器的顺序与 rs.initiate 的顺序不同,其中一台服务器后跟 rs.add 用于其他服务器。如果你比较 shell 和 python 脚本中的相同命令,它们绝对会给你相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
相关资源
最近更新 更多