pymongo 无法连接到主要

Gre*_*ell 8 database mongodb pymongo replicaset

我正在尝试find_one连接到我的副本集的主节点。

MongoClient(hostname, replicaSet="rs0", read_preference=ReadPreference.PRIMARY)
Run Code Online (Sandbox Code Playgroud)

但这会导致错误:

ServerSelectionTimeoutError: 没有副本集成员匹配选择器“Primary()”

我能够成功阅读使用SECONDARY_PREFERRED. 我也尝试连接使用但MongoReplicaSetClient没有成功。我猜这是由于配置不当造成的,但是我应该寻找什么?

rs.状态:

rs0:PRIMARY> rs.conf()
{
       "_id" : "rs0",
       "version" : 111313,
       "protocolVersion" : NumberLong(1),
       "members" : [
               {
                       "_id" : 1,
                       "host" : "ANDROMEDA:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 1,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 1
               },
               {
                       "_id" : 2,
                       "host" : "mongo02.db.com:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 0.5,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 1
               },
               {
                       "_id" : 3,
                       "host" : "mongo03.db.com:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 0.5,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 1
               }
       ],
       "settings" : {
               "chainingAllowed" : true,
               "heartbeatIntervalMillis" : 2000,
               "heartbeatTimeoutSecs" : 10,
               "electionTimeoutMillis" : 10000,
               "getLastErrorModes" : {

               },
               "getLastErrorDefaults" : {
                       "w" : 1,
                       "wtimeout" : 0
               }
       }
}
rs0:SECONDARY> rs.status()
{
       "set" : "rs0",
       "date" : ISODate("2016-08-04T08:58:02.293Z"),
       "myState" : 2,
       "term" : NumberLong(90),
       "syncingTo" : "mongo03.db.com:27017",
       "heartbeatIntervalMillis" : NumberLong(2000),
       "members" : [
               {
                       "_id" : 1,
                       "name" : "ANDROMEDA:27017",
                       "health" : 1,
                       "state" : 1,
                       "stateStr" : "PRIMARY",
                       "uptime" : 2503,
                       "optime" : {
                               "ts" : Timestamp(1470299746, 1),
                               "t" : NumberLong(90)
                       },
                       "optimeDate" : ISODate("2016-08-04T08:35:46Z"),
                       "lastHeartbeat" : ISODate("2016-08-04T08:58:01.109Z"),
                       "lastHeartbeatRecv" : ISODate("2016-08-04T08:58:01.803Z"),
                       "pingMs" : NumberLong(28),
                       "electionTime" : Timestamp(1469600522, 1),
                       "electionDate" : ISODate("2016-07-27T06:22:02Z"),
                       "configVersion" : 111313
               },
               {
                       "_id" : 2,
                       "name" : "mongo02.db.com:27017",
                       "health" : 1,
                       "state" : 2,
                       "stateStr" : "SECONDARY",
                       "uptime" : 7604104,
                       "optime" : {
                               "ts" : Timestamp(1470299746, 1),
                               "t" : NumberLong(90)
                       },
                       "optimeDate" : ISODate("2016-08-04T08:35:46Z"),
                       "syncingTo" : "mongo03.db.com:27017",
                       "configVersion" : 111313,
                       "self" : true
               },
               {
                       "_id" : 3,
                       "name" : "mongo03.db.com:27017",
                       "health" : 1,
                       "state" : 2,
                       "stateStr" : "SECONDARY",
                       "uptime" : 2503,
                       "optime" : {
                               "ts" : Timestamp(1470299746, 1),
                               "t" : NumberLong(90)
                       },
                       "optimeDate" : ISODate("2016-08-04T08:35:46Z"),
                       "lastHeartbeat" : ISODate("2016-08-04T08:58:01.948Z"),
                       "lastHeartbeatRecv" : ISODate("2016-08-04T08:58:01.802Z"),
                       "pingMs" : NumberLong(28),
                       "syncingTo" : "ANDROMEDA:27017",
                       "configVersion" : 111313
               }
       ],
       "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

eoi*_*zil 3

如果出现类似于ServerSelectionTimeoutError: No replica set members match selector "Primary()"副本集状态函数输出rs.status()的错误消息,显示主成员使用非 FQDN(在本例中为ANDROMEDA:27017),则应用程序很可能无法解析网络上的主要主机。

您可以从运行应用程序的主机的命令行中使用以下命令轻松检查这一点:

$ dig ANDROMEDA
$ ping ANDROMEDA
$ mongo --host ANDROMEDA:27017
Run Code Online (Sandbox Code Playgroud)

如果运行应用程序的主机上没有安装 Mongo Shell,则可以使用 Telnet。

$ telnet ANDROMEDA 27017
Run Code Online (Sandbox Code Playgroud)

这些输出将允许您检查应用程序主机和 mongod 主机之间的连接,以确定这是否导致问题。