2016-11-23 2 views
0

При подключении к набору реплик MongoDB я могу читать данные из вторичных источников, но потом при записи с использованием того же соединения появляется следующая ошибка:Pymongo Read Preferences - ServerSelectionTimeoutError: нет первичного доступа для записи

pymongo.errors.ServerSelectionTimeoutError: No primary available for writes 

Python 3.4.3 PyMongo 3.2.2

Мое соединение:

var_host = 'XXX.XXX.XXX.XXX' # Public IP 
var_port = 27017 
var_username = 'username' 
var_password = 'password' 
mongo_uri = 'mongodb://%s:%[email protected]%s:%s' % (username, password, host, port) 
client_db = MongoClient(mongo_uri, 
       replicaSet='rs0', 
       readPreference='secondaryPreferred') 

I MPORTANT: При удалении полей «replicaSet» и «ReadPrefence» соединение работает.

В сервере:

rs0:PRIMARY> rs.status() 
{"set" : "rs0", 
"date" : ISODate("2016-11-23T13:09:55.699Z"), 
"myState" : 1, 
"term" : NumberLong(4), 
"heartbeatIntervalMillis" : NumberLong(2000), 
"members" : [ 
    { 
     "_id" : 0, 
     "name" : "mongodb0:27017", 
     "health" : 1, 
     "state" : 1, 
     "stateStr" : "PRIMARY", 
     "uptime" : 64491, 
     "optime" : { 
      "ts" : Timestamp(1479906595, 21), 
      "t" : NumberLong(4) 
     }, 
     "optimeDate" : ISODate("2016-11-23T13:09:55Z"), 
     "electionTime" : Timestamp(1479844637, 1), 
     "electionDate" : ISODate("2016-11-22T19:57:17Z"), 
     "configVersion" : 424888, 
     "self" : true 
    }, 
    { 
     "_id" : 1, 
     "name" : "mongodb2:27017", 
     "health" : 1, 
     "state" : 2, 
     "stateStr" : "SECONDARY", 
     "uptime" : 61631, 
     "optime" : { 
      "ts" : Timestamp(1479906593, 31), 
      "t" : NumberLong(4) 
     }, 
     "optimeDate" : ISODate("2016-11-23T13:09:53Z"), 
     "lastHeartbeat" : ISODate("2016-11-23T13:09:53.776Z"), 
     "lastHeartbeatRecv" : ISODate("2016-11-23T13:09:53.758Z"), 
     "pingMs" : NumberLong(0), 
     "syncingTo" : "XXXXXXXX:27017", 
     "configVersion" : 424888 
    }, 
    { 
     "_id" : 2, 
     "name" : "mongodb3:27017", 
     "health" : 1, 
     "state" : 2, 
     "stateStr" : "SECONDARY", 
     "uptime" : 61264, 
     "optime" : { 
      "ts" : Timestamp(1479906593, 31), 
      "t" : NumberLong(4) 
     }, 
     "optimeDate" : ISODate("2016-11-23T13:09:53Z"), 
     "lastHeartbeat" : ISODate("2016-11-23T13:09:53.776Z"), 
     "lastHeartbeatRecv" : ISODate("2016-11-23T13:09:55.493Z"), 
     "pingMs" : NumberLong(0), 
     "syncingTo" : "XXX:27017", 
     "configVersion" : 424888 
    } 
    ], 
    "ok" : 1} 

db.isMaster()

mongodb0

rs0:PRIMARY> db.isMaster() 
{ 
"hosts" : [ 
    "mongodb0:27017" 
], 
"passives" : [ 
    "10.150.151.141:27017", 
    "10.150.151.155:27017" 
], 
"setName" : "rs0", 
"setVersion" : 424888, 
"ismaster" : true, 
"secondary" : false, 
"primary" : "mongodb0:27017", 
"me" : "mongodb0:27017", 
"electionId" : ObjectId("7fffffff0000000000000004"), 
"maxBsonObjectSize" : 16777216, 
"maxMessageSizeBytes" : 48000000, 
"maxWriteBatchSize" : 1000, 
"localTime" : ISODate("2016-11-23T15:12:37.988Z"), 
"maxWireVersion" : 4, 
"minWireVersion" : 0, 
"ok" : 1 
} 

mongodb1

rs0:SECONDARY> db.isMaster() 
{ 
"hosts" : [ 
    "mongodb0:27017" 
], 
"passives" : [ 
    "10.150.151.141:27017", 
    "10.150.151.155:27017" 
], 
"setName" : "rs0", 
"setVersion" : 424888, 
"ismaster" : false, 
"secondary" : true, 
"primary" : "mongodb0:27017", 
"passive" : true, 
"me" : "10.150.151.141:27017", 
"maxBsonObjectSize" : 16777216, 
"maxMessageSizeBytes" : 48000000, 
"maxWriteBatchSize" : 1000, 
"localTime" : ISODate("2016-11-23T15:24:32.134Z"), 
"maxWireVersion" : 4, 
"minWireVersion" : 0, 
"ok" : 1 

mongodb2

rs0:SECONDARY> db.isMaster() 
{ 
"hosts" : [ 
    "mongodb0:27017" 
], 
"passives" : [ 
    "10.150.151.141:27017", 
    "10.150.151.155:27017" 
], 
"setName" : "rs0", 
"setVersion" : 424888, 
"ismaster" : false, 
"secondary" : true, 
"primary" : "mongodb0:27017", 
"passive" : true, 
"me" : "10.150.151.155:27017", 
"maxBsonObjectSize" : 16777216, 
"maxMessageSizeBytes" : 48000000, 
"maxWriteBatchSize" : 1000, 
"localTime" : ISODate("2016-11-23T15:21:54.971Z"), 
"maxWireVersion" : 4, 
"minWireVersion" : 0, 
"ok" : 1 
} 
+0

Можем ли мы увидеть ваш 'mongo_uri', а также вывод' db.isMaster() 'из оболочки, связанной с каждым из ваших элементов набора реплик? –

+0

@ A.JesseJiryuDavis проверьте выше, отредактирован! Tks – Nadav

ответ

1

Я предполагаю, что:

  1. Вашего водитель может подключиться к общественному IP вторичному по адресу либо 10.150.151.141:27017 или 10.150.151.155:27017 или оба.
  2. Ваша строка подключения указывает на один из вышеперечисленных общедоступных IP-адресов для вторичных пользователей, или ваша строка подключения указывает на общедоступный IP-адрес первичного.
  3. Набор реплик использует внутренний IP-адрес в конфигурации, которые не доступные для клиентской машины: она не может подключиться к «mongodb0», «mongodb1», или «mongodb2».

Вам необходимо перенастроить набор реплик с использованием общедоступных IP-адресов. Если вам интересно, почему это так, это объясняется в Server Discovery and Monitoring Spec. Но суть такова: все, что указано для имен хостов участников в rs.conf(), должно быть общедоступным хостам, доступным для вашей клиентской машины.

+0

Удивительный !!!!!!!! – Nadav