2016-08-04 7 views
2

Я пытаюсь установить find_one, подключившись к основному узлу моей реплики.pymongo не может подключиться к первичному

MongoClient(hostname, replicaSet="rs0", read_preference=ReadPreference.PRIMARY) 

Но это приводит к ошибке:

ServerSelectionTimeoutError: No replica set members match selector "Primary()"

Я могу успешно считаны с помощью SECONDARY_PREFERRED. Я также попытался подключиться с помощью MongoReplicaSetClient без каких-либо успехов. Я предполагаю это из-за плохой конфигурации, но что я должен искать?

rs.status:

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 
} 
+0

Можете ли вы показать конфигурацию вашей реплики? – styvane

+0

@Styvane Я обновился с 'rs.status'. Надеюсь, это даст вам больше информации. –

+1

Вы пытались проверить, что имя хоста для ANDROMEDA: 27017 разрешено с хоста, с которого вы пытаетесь подключить ваше приложение? Похоже, что это хороший кандидат, чтобы начать расследование, так как у ваших вторичных хостов есть FQDN. – eoinbrazil

ответ

2

В случаях с сообщением об ошибке, аналогичным ServerSelectionTimeoutError: No replica set members match selector "Primary()" и где выход реплики установить функцию состояния, rs.status(), показывает Primary член с использованием не FQDN (ANDROMEDA: 27017, как в этом случае), то весьма вероятно, что приложение не может разрешить первичный хост в сети.

Вы можете легко проверить это, используя следующие команды из командной строки хоста запуска приложения:

$ dig ANDROMEDA 
$ ping ANDROMEDA 
$ mongo --host ANDROMEDA:27017 

Если вы не имеете Монго Shell установлен на хосте запуска приложения вы можете использовать Telnet.

$ telnet ANDROMEDA 27017 

Эти выходы позволят вам проверить соединения между хостом приложений и вашим mongod хостом, чтобы определить, если это вызывает проблемы.

0

Я использую эту строку соединения:

MongoClient('mongodb://mongo01.db.com:27017,mongo02.db.com:27017,mongo03.db.com:27017/mydb',replicaSet="rs0", read_preference=ReadPreference.PRIMARY)