【问题标题】:MongoClient doesn't want to discover replicaset nodesMongoClient 不想发现副本集节点
【发布时间】:2020-10-13 22:25:50
【问题描述】:

希望你们一切都好。

我有两个节点的副本集:

messagesdbvirtual:SECONDARY> rs.status()
{
        "set" : "messagesdbvirtual",
        "date" : ISODate("2020-06-23T18:42:24.820Z"),
        "myState" : 2,
        "term" : NumberLong(1),
        "syncingTo" : "messagesdb1:27017",
        "syncSourceHost" : "messagesdb1:27017",
        "syncSourceId" : 0,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "majorityVoteCount" : 2,
        "writeMajorityCount" : 2,
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1592937734, 1),
                        "t" : NumberLong(1)
                },
                "lastCommittedWallTime" : ISODate("2020-06-23T18:42:14.862Z"),
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1592937734, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityWallTime" : ISODate("2020-06-23T18:42:14.862Z"),
                "appliedOpTime" : {
                        "ts" : Timestamp(1592937734, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1592937734, 1),
                        "t" : NumberLong(1)
                },
                "lastAppliedWallTime" : ISODate("2020-06-23T18:42:14.862Z"),
                "lastDurableWallTime" : ISODate("2020-06-23T18:42:14.862Z")
        },
        "lastStableRecoveryTimestamp" : Timestamp(1592937704, 1),
        "lastStableCheckpointTimestamp" : Timestamp(1592937704, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "messagesdb1:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 176458,
                        "optime" : {
                                "ts" : Timestamp(1592937734, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1592937734, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2020-06-23T18:42:14Z"),
                        "optimeDurableDate" : ISODate("2020-06-23T18:42:14Z"),
                        "lastHeartbeat" : ISODate("2020-06-23T18:42:23.544Z"),
                        "lastHeartbeatRecv" : ISODate("2020-06-23T18:42:23.865Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1592761269, 2),
                        "electionDate" : ISODate("2020-06-21T17:41:09Z"),
                        "configVersion" : 2
                },
                {
                        "_id" : 1,
                        "name" : "messagesdb2:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 184894,
                        "optime" : {
                                "ts" : Timestamp(1592937734, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2020-06-23T18:42:14Z"),
                        "syncingTo" : "messagesdb1:27017",
                        "syncSourceHost" : "messagesdb1:27017",
                        "syncSourceId" : 0,
                        "infoMessage" : "",
                        "configVersion" : 2,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                }
        ],
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1592937734, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1592937734, 1)
}

但是,当我尝试使用 MongoClient 列出种子时,我没有看到:

In [81]: import newpymongo

In [82]: newpymongo.version
Out[82]: '3.10.1'

In [83]: client = newpymongo.MongoClient("messagesdb1.virtual.ninternal.com:27017", replicaSet="messagesdbvirtual")

In [84]: client
Out[84]: MongoClient(host=[u'messagesdb1.virtual.ninternal.com:27017'], document_class=dict, tz_aware=False, connect=True, replicaset=u'messagesdbvirtual')

In [85]: client.nodes
Out[85]: frozenset()

In [86]: client.nodes
Out[86]: frozenset()

在没有replicaSet 参数的情况下创建的客户端会看到一个节点:

In [87]: client = newpymongo.MongoClient("messagesdb1.virtual.ninternal.com:27017")

In [88]: client.nodes()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-88-93c215ff96d9> in <module>()
----> 1 client.nodes()

TypeError: 'frozenset' object is not callable

In [89]: client.nodes
Out[89]: frozenset({(u'messagesdb1.virtual.ninternal.com', 27017)})

我应该在哪里进一步寻找任何建议?谢谢。

更新:问题是主机名发现。见@D。 SM的评论了解详情。

【问题讨论】:

标签: mongodb pymongo pymongo-3.x


【解决方案1】:

很可能客户端在没有机会首先发现所有节点的情况下打印节点。

来自API documentation

MongoClient 构造函数是非阻塞的:当客户端使用后台线程连接到副本集时,构造函数立即返回。请注意,如果您创建一个客户端并立即打印其节点属性的字符串表示,则该列表最初可能为空。如果您稍等片刻,MongoClient 会发现整个副本集:

>>> from time import sleep
>>> c = MongoClient(replicaset='foo'); print(c.nodes); sleep(0.1); print(c.nodes)
frozenset([])
frozenset([(u'localhost', 27019), (u'localhost', 27017), (u'localhost', 27018)])

所以只需添加一会儿sleep

【讨论】:

  • 不,问题出在主机名发现上。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2017-05-21
  • 2022-08-03
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多