【问题标题】:MongoDB URL without replicaSet optional parameter没有replicaSet可选参数的MongoDB URL
【发布时间】:2018-04-19 13:47:26
【问题描述】:

我有一个 mongoDB 集群

   server1:27017
   server2:27017
   server3:27017

由于历史原因,IT 团队无法提供此集群的副本集名称。

我的问题是:在不知道replicaSet名称的情况下,以下mongoDB url是否合法,并且缺少可选的replicaSet可选参数会导致将来出现任何可能的问题?

mongodb://username:password@server1:27017,server2:27017,server3:27017

我正在使用 Java 通过以下方式设置 MongoDB 连接

String MONGO_REPLICA_SET = "mongodb://username:password@server1:27017,server2:27017,server3:27017";
MongoClientURI mongoClientURI = new MongoClientURI(MONGODB_REPLICA_SET);
mongoClient = new MongoClient(mongoClientURI);

【问题讨论】:

  • 是的,这是合法的。在连接 URI 中包含“种子列表”的任何内容都暗示“正在寻找配置”,因此与“连接到单个实例”不同。真正的未来更关注DNS Seedlist。并且您始终可以在MongoClient 的“选项”中包含replicaSet 名称,而不是URI,就像我一直做的那样。现在,以及在不久的将来,它不会因为不在那里而破坏任何东西。

标签: mongodb mongodb-java


【解决方案1】:

为了澄清,虽然连接到副本集可能有用,但最好指定replicaSet 选项。

根据您使用的MongoDB Drivers,它的行为可能会略有不同。例如引用Server Discovery and Monitoring Spec for Initial Topology Type:

在 Java 驱动程序中,单个种子意味着单一,但包含一个种子的列表意味着未知,因此如果发现种子是副本集成员,它可以转换到副本集监控。相比之下,PyMongo 需要一个非空的 setName 才能开始副本集监控,而不管种子的数量是多少。

存在变化,最好检查连接是否仍然可以处理拓扑发现和故障转移。

由于历史原因,IT 团队无法提供此集群的副本集名称。

如果您有权访问admin 数据库,则可以在 mongo shell 上执行rs.status() 以找出副本集的名称。另请参阅replSetGetStatus 了解更多信息。

【讨论】:

  • 对于从谷歌到达这里的任何人,我认为这对 PyMongo 现在无效 (pymongo==3.10.1),但 GitHub 规范仍然包含引用的段落。我在那个 repo 中打开了一个问题,以确定它是否真的正确:github.com/mongodb/specifications/issues/801
【解决方案2】:

应该可以找出副本集的名称,以避免这种担心。打开与任何一个节点的连接(例如,直接连接到 server1:27017),然后运行rs.status();这将告诉您副本集的名称以及许多其他有用的数据,例如完整的配置节点集及其各自的状态。

在这个输出示例中,“rsInternalTest”是副本集名称:

{
    "set" : "rsInternalTest",
    "date" : ISODate("2018-05-01T11:38:32.608Z"),
    "myState" : 1,
    "term" : NumberLong(123),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        ...
    },
    "members" : [ 
        {
            "_id" : 1,
            "name" : "server1:27017",
            "health" : 1.0,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1652592,
            "optime" : {
                "ts" : Timestamp(1525174711, 1),
                "t" : NumberLong(123)
            },
            "optimeDate" : ISODate("2018-05-01T11:38:31.000Z"),
            "electionTime" : Timestamp(1524371004, 1),
            "electionDate" : ISODate("2018-04-22T04:23:24.000Z"),
            "configVersion" : 26140,
            "self" : true
        }
        ...
    ],
    "ok" : 1.0
}

请注意,您需要登录高级用户帐户,否则您将无权运行rs.status()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2019-03-11
    • 2018-02-03
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多