使用pymongo向现有副本集添加新成员?

时间:2019-02-18 15:37:45

标签: python mongodb pymongo

我正在尝试使用pymongo将新成员添加到副本集。 当我连接到mongodb shell时,我将执行以下命令:

rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )

我在pymongo中找不到任何类似的命令。

我可以使用以下方法获取当前状态:

client  = MongoClient(host)
client.admin.command("replSetGetStatus")

但是仍然有添加新成员吗?

1 个答案:

答案 0 :(得分:2)

rs.add()rs.reconfig()mongo shell中的类似内容实际上是shell帮助程序,而不是mongod运行的实际命令。

您可以通过在rs.add shell中运行mongo(不带括号)来进行检查。您将在控制台中看到命令的源代码。

从本质上讲,这些助手最终会呼叫db.runCommand()db.adminCommand()。助手将填充用于调用runCommand()的必要字段。

使用Python,您可以使用Database.command来模拟那些助手。

例如,这将显示副本集的成员定义:

import pymongo

conn = pymongo.MongoClient()
conf = conn.admin.command({'replSetGetConfig': 1})
print(conf['config']['members'])

rs.add()基本上是通过修改members字段的内容对副本集进行的重新配置,因此您需要执行以下操作:

import pymongo

conn = pymongo.MongoClient()
conf = conn.admin.command({'replSetGetConfig': 1})

conf['config']['members'].append({
    '_id': 3,
    'host': 'localhost:27020',
    'hidden': True,
    'priority': 0})
conf['config']['version'] += 1  # Bump the config version

res = conn.admin.command({'replSetReconfig': conf['config']})
print(res)