【问题标题】:Problem initiating ReplicaSet node using pymongo使用 pymongo 启动 ReplicaSet 节点的问题
【发布时间】:2022-01-22 09:52:17
【问题描述】:

我正在尝试编写一个 python 脚本,其目标是在我的开发环境中启动一个 MongoDB 副本集节点(注意:我只有一个节点),而不必使用 mongo shell。所以脚本打算手动运行一次。

我使用 docker 运行 MongoDB,这是我的 docker-compose 文件的一部分:

mongodb:
    image: "mongo:5.0-focal"
    ports:
      - "27017:27017"
    volumes:
      - mongodb:/data/db    
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--replSet",
        "rs0" 
      ]

我在属于同一网络的另一个 docker 容器中运行以下 python 代码,以便它可以查看主机名 mongodb。我的pymongo版本是4.0.1

import os
from pymongo import MongoClient

try:
    client = MongoClient('mongodb',27017,serverSelectionTimeoutMS=5000)
    config = { '_id': 'rs0', 'members': [{'_id': 0, 'host': 'mongodb:27017'}]}
    print("REPLICA SET config:")
    print(config)
    out = client.admin.command("replSetInitiate", config)
    print(out)
except Exception as e:
    print("Error!")
    print(e)
    pass

运行脚本时出现此错误:

No servers match selector "Primary()", Timeout: 5.0s, Topology Description: <TopologyDescription id: 61c0dffc7f72958bdd10e65f, topology_type: Unknown, servers: [<ServerDescription ('mongodb', 27017) server_type: RSGhost, rtt: 0.004416499999933876>]>

好的,没有服务器匹配 Primary 选择器,但是如果我不先启动一个 replicaSet,我怎么能有一个 Primary?不是 pymongo 和 MongoDB 方面的专家,但我在这里遗漏了什么吗?

【问题讨论】:

    标签: mongodb docker pymongo


    【解决方案1】:

    我遇到了类似的问题并遇到了https://jira.mongodb.org/browse/PYTHON-3027。将 'directConnection=True' 作为参数传递给 MongoClient 似乎有帮助。虽然,我不确定这是如何工作的。

    【讨论】:

    • 是的!而已。非常感谢@Netra。我在docs 中找到了这个描述:directConnection(可选):如果为真,则强制此客户端作为独立主机直接连接到指定的 MongoDB 主机。如果为 false,则客户端连接到给定 MongoDB 主机所属的整个副本集。如果这是 True 并且提供了 mongodb+srv:// URI 或包含多个种子的 URI,则会引发异常。添加参数解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多