Имате проблеми при свързването с реплики на 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 . Възможните решения са:
- Понижайте до 2.4.x или надстройте 2.6.x, след като стане достъпен.
- Променете имената на хостове на всички членове на наборите от реплики на по-ниски. Например променете името на хоста в примера по-горе на 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 на драйвера.