MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Проблеми с чувствителността на малки и големи букви с имена на хостове в набори реплики

Имате проблеми при свързването с реплики на MongoDB след надстройване на драйвера MongoDB Ruby до 2.5.x? Наскоро получихме няколко запитвания относно този проблем с най-новата версия на драйвера MongoDB Ruby и написахме тази публикация за да споделим нашите констатации относно проблема и причината.

Съобщението за грешка, което беше открито при опит за свързване, беше -

No server is available matching preference: #<Mongo::ServerSelector::Primary:...>

Проблемът вече беше съобщен на MongoDB и се проследява тук. Прекарахме известно време, за да проучим този проблем и основната причина, въведена в кода на драйвера в 2.5.x.

MongoDB Ruby Driver 2.5.x Резюме на проблема

Проблемът съществува във версия(и) 2.5.x на драйвера MongoDB Ruby и се среща, когато имената на хостове, състоящи се от набора от реплика, съдържат знаци, чувствителни към малки и големи букви, напр. ABC-сървър1.example.com . Възможните решения са:

  1.  Понижайте до 2.4.x или надстройте 2.6.x, след като стане достъпен.
  2. Променете имената на хостове на всички членове на наборите от реплики на по-ниски. Например променете името на хоста в примера по-горе на abc-server1.example.com.

Подробности за проблема

Активирането на подробно регистриране в Ruby даде представа за случващото се:

...
#19140] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'unknown'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
#19140] DEBUG -- : MONGODB | There was a change in the members of the 'replica set' topology.
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/server_selector/selectable.rb:119:in `select_server': No server is available matching preference: # using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/database.rb:157:in `command'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:404:in `list_databases'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:385:in `database_names'
...

Изглеждаше очевидно, че драйверът не е в състояние да открие правилно ролята на първичния набор от реплика. Когато сравняваме с регистрационните файлове от 2.4.x, стана ясно, че това се случва правилно в тази версия, т.е. основният е правилно идентифициран като основен.

] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'primary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.

Другата улика, която имахме, беше, че имената на сървърите ни бяха леко променени в регистрационните файлове. Вместо действителното име SG -connectiontest1-2.servers.example.com , беше регистриран като sg -connectiontest1-2.servers.example.com .

При проверка на кода относно това как имената на хостове се анализират по време на инициализацията на връзката и ролите им се присвояват, успяхме да определим, че кодът на драйвера е с намален регистър (т.е. конвертиране на ABC. example.com към abc.example.com), докато анализирате низа за връзка. След това драйверът се свързва с основния, за да открие топологията с помощта на командата isMaster. Докато анализира резултата от тази команда, драйверът определя ролята на всеки възел.

MongoDB Ruby Driver 2.5.x Проблеми с чувствителността на малки и големи букви с имена на хостове в набори реплики Щракнете за туит

Въпреки това, докато сравняваше имената на хостове, върнати от командата, с тези в низа за връзка, драйверът игнорираше, за да извърши съвпадение без значение на главните букви. Това доведе до несъответствие в имената на първичния, както се съобщава от MongoDB, с това, което драйверът е определил от низа за връзка. Това накара ролята на първичния да стане неизвестна и доведе до неуспех на връзката. Проверката за съвпадение на адреса в кода за откриване на роля беше добавена в 2.5.x.

Поправката на проблема е насочена към версия 2.6.0 на драйвера.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB вмъкване()

  2. $lookup на няколко нива без $unwind?

  3. mongodb :Увеличаване на максималните връзки в mongodb

  4. Касандра срещу MongoDB

  5. Най-добрият начин да извършите пълно текстово търсене в MongoDB и Mongoose