MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Problemas de distinção entre maiúsculas e minúsculas do MongoDB Ruby Driver 2.5.x com nomes de host em conjuntos de réplicas

Está com problemas para se conectar aos conjuntos de réplicas do MongoDB após atualizar o driver do MongoDB Ruby para 2.5.x? Recentemente, recebemos algumas perguntas sobre esse problema com a versão mais recente do driver MongoDB Ruby e escrevemos esta postagem para compartilhar nossas descobertas sobre o problema e a causa.

A mensagem de erro encontrada na tentativa de conexão foi -

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

O problema já havia sido relatado ao MongoDB e está sendo rastreado aqui. Passamos algum tempo para investigar esse problema e a causa raiz introduzida no código do driver em 2.5.x.

Resumo do problema do MongoDB Ruby Driver 2.5.x

O problema existe na(s) versão(ões) 2.5.x do driver MongoDB Ruby e é encontrado quando os nomes de host que compõem o conjunto de réplicas contêm caracteres que diferenciam maiúsculas de minúsculas, por exemplo, ABC-server1.example.com . As possíveis soluções alternativas são:

  1.  Faça downgrade para 2.4.x ou faça upgrade para 2.6.x assim que estiver disponível.
  2. Altere os nomes de host de todos os membros dos conjuntos de réplicas para minúsculas. Por exemplo, altere o nome do host no exemplo acima para abc-server1.example.com.

Detalhes sobre o problema

Ativar o registro detalhado no Ruby forneceu uma pista sobre o que estava acontecendo:

...
#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'
...

Parecia óbvio que o driver não conseguiu detectar a função do primário do conjunto de réplicas corretamente. Ao comparar com os registros da versão 2.4.x, ficou claro que isso costumava acontecer corretamente nessa versão, ou seja, o primário foi identificado corretamente como primário.

] 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'.

A outra pista que tínhamos era que os nomes dos nossos servidores foram levemente alterados nos logs. Em vez do nome real SG -connectiontest1-2.servers.example.com , estava sendo registrado como sg -connectiontest1-2.servers.example.com .

Ao inspecionar o código sobre como os nomes de host são analisados ​​durante a inicialização da conexão e as funções são atribuídas a eles, pudemos determinar que o código do driver estava em letras maiúsculas (ou seja, convertendo ABC. example.com para abc.example.com) ao analisar a cadeia de conexão. Em seguida, o driver se conecta ao primário para descobrir a topologia usando o comando isMaster. É ao analisar o resultado deste comando que o driver determina o papel de cada nó.
Problemas de distinção entre maiúsculas e minúsculas do driver MongoDB Ruby 2.5.x com nomes de host em conjuntos de réplicaClique para tweet

No entanto, ao comparar os nomes de host retornados do comando com os da string de conexão, o driver estava ignorando para realizar uma correspondência que não diferencia maiúsculas de minúsculas. Isso levou a uma incompatibilidade nos nomes do primário conforme relatado pelo MongoDB para o que o driver havia determinado a partir da cadeia de conexão. Isso fez com que a função do primário se tornasse desconhecida e levou à falha de conexão. A verificação de correspondência de endereço no código de detecção de função foi adicionada em 2.5.x.

A correção do problema foi direcionada para a versão 2.6.0 do driver.