Visão geral
Todos os drivers do MongoDB seguem um algoritmo definido ao selecionar um servidor para ler ou escrever. Ao usar a propriedade ClusterConfigurator
de um objeto MongoClient
, você pode personalizar esse algoritmo para escolher o servidor que funciona melhor para seu aplicação.
Importante
A personalização do algoritmo de seleção do servidor pode ter consequências não intencionais, como desempenho degradado de leitura ou gravação.
Algoritmo padrão
Quando o driver .NET/C# executa uma operação de leitura, ele executa as seguintes etapas, para selecionar uma implantação MongoDB :
Seleciona todos os servidores que correspondem à preferência de leitura ativa da lista de servidores conhecidos.
Se houver pelo menos um servidor legível, o driver chamará a função de seletor de servidor definida pelo usuário e passará a lista da etapa anterior.
Aplica a configuração de conexão
LocalThreshold
à lista de servidores retornados da função.Seleciona um servidor aleatoriamente a partir dos servidores que ainda estão na lista e executa a operação neste servidor.
Quando o driver .NET/C# executa uma operação de gravação, ele começa selecionando todos os servidores graváveis, não apenas aqueles que correspondem à preferência de leitura ativa. As etapas restantes são idênticas.
Para saber mais sobre o algoritmo de seleção de servidor padrão, que o driver segue quando você não especifica nenhuma lógica de seleção de servidor personalizada, consulte Algoritmo de seleção de servidor no manual do MongoDB Server.
Especificando outros algoritmos de seleção de servidor
Você pode especificar uma lógica de seleção de servidor diferente passando uma instância de uma classe de seletor de servidor para a propriedade PreServerSelector
ou PostServerSelector
do ClusterConfigurator
. A propriedade PreServerSelector
especifica um seletor de servidor que é executado antes que a lógica de seleção de servidor padrão seja executada, enquanto a propriedade PostServerSelector
especifica um seletor de servidor que é executado após a execução da lógica de seleção de servidor padrão. Em seguida, você pode passar sua instância ClusterConfigurator
para o objeto MongoClientSettings
ao criar uma instância MongoClient
para aplicar sua lógica de seleção de servidor personalizada.
A tabela a seguir lista os diferentes tipos de seletores de servidor que você pode passar para a propriedade ClusterConfigurator
:
Seletor de servidor | Descrição |
---|---|
| Seleciona servidores com base em vários seletores parciais |
| Envolve um seletor de servidor delegado |
| Seleciona servidores com base em seus endpoints |
| Seleciona servidores dentro de uma faixa de latência aceitável |
| Seleciona um servidor com base em uma coleção de servidores para despriorizar |
| Seleciona um servidor aleatório |
| Seleciona servidores com base em uma preferência de leitura especificada |
O exemplo a seguir instrui um MongoClient
a usar a classe RandomServerSelector
para selecionar um servidor aleatoriamente antes que a lógica de seleção de servidor padrão seja executada:
var settings = MongoClientSettings.FromConnectionString("<connection string>"); var clusterConfigurator = builder => { builder.ConfigureCluster(c => c.With(PreServerSelector: new RandomServerSelector())); }; settings.ClusterConfigurator = clusterConfigurator; var client = new MongoClient(settings);
Para saber mais sobre as diferentes classes de seletores de servidor , consulte a documentação da API ServerSelectors.
Implementando lógica de seleção de servidor personalizada
Você pode implementar sua própria lógica de seleção de servidor personalizada criando uma classe que herda da interface IServerSelector
e substitui o método SelectServers()
. O exemplo a seguir mostra uma classe de seleção de servidor personalizada simples que seleciona servidores com um ServerType
de ServerType.ReplicaSetSecondary
:
public class CustomServerSelector : IServerSelector { public IEnumerable<ServerDescription> SelectServers(ClusterDescription cluster, IEnumerable<ServerDescription> servers) { return servers.Where(server => server.Type == ServerType.ReplicaSetSecondary); } }
Você pode então passar uma instância dessa classe para a propriedade PreServerSelector
ou PostServerSelector
de uma instância ClusterConfigurator
, conforme mostrado na seção Especificando outros algoritmos de seleção de servidor.
Como usar as configurações para configurar a seleção do servidor
Você pode especificar as seguintes configurações de seleção de servidor em seu objeto MongoClient
ou em seu URI de conexão:
Contexto | Descrição | |||
---|---|---|---|---|
| The latency window for server eligibility. If a server's round trip takes longer than the fastest server's round-trip time plus this value, the server isn't eligible for selection. Data Type: TimeSpan Default: 15 milliseconds Connection URI Example: localThresholdMS=0 | |||
| The client's default read-preference settings. MaxStaleness represents thelongest replication lag (in real time) that a secondary can experience and still be eligible for server selection. Specifying -1 means no maximum.See read preference for more information. Data Type: ReadPreference Default: ReadPreference.Primary Connection URI Example:
| |||
| The length of time the driver tries to select a server before timing out. Data Type: TimeSpan Default: 30 seconds Connection URI Example: serverSelectionTimeoutMS=15000 |
Solução de problemas
O driver lança um tempo limite durante a seleção do servidor
Cada operação de driver exige que você escolha um servidor que atenda aos critérios de seleção de servidor . Se você não selecionar um servidor apropriado dentro do tempo limite de seleção de servidor , o driver lançará uma exceção de tempo limite de seleção de servidor . A exceção parece semelhante ao seguinte:
A timeout occurred after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }, OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost:27017" }", EndPoint: "Unspecified/localhost:27017", ReasonChanged: "Heartbeat", State: "Disconnected", ServerVersion: , TopologyVersion: , Type: "Unknown", HeartbeatException: "<exception details>" }] }.
A mensagem de erro consiste em várias partes:
O tempo limite de seleção do servidor (30000 ms).
Os seletores de servidor considerados (
CompositeServerSelector
contendoAreSessionsSupportedServerSelector
,LatencyLimitingServerSelector
eOperationsCountServerSelector
).A visão atual do driver da topologia do cluster. A lista de servidores que o driver conhece é uma parte fundamental dessa visualização. Cada descrição de servidor contém uma descrição exaustiva de seu estado atual, incluindo informações sobre um endpoint, uma versão de servidor, um tipo de servidor e seu estado de integridade atual. Se o servidor encontrar problemas ao relatar sua integridade,
HeartbeatException
conterá a exceção da última pulsação com falha. Analisar oHeartbeatException
em cada nó de cluster pode auxiliar no diagnóstico da maioria dos problemas de seleção do servidor. As seguintes exceções de batimentos cardíacos são comuns:No connection could be made because the target machine actively refused it
: o driver não pode ver este nó do cluster. Isso pode ocorrer porque o nó do cluster falhou, um firewall está impedindo que o tráfego de rede atinja o nó ou a porta do cluster ou algum outro erro de rede está impedindo que o tráfego seja roteado com êxito para o nó do cluster.Attempted to read past the end of the stream
: Este erro acontece quando o driver não pode se conectar aos nós de cluster devido a um erro de rede, firewall configurado incorretamente ou outro problema de rede. Para resolver essa exceção, certifique-se de que todos os nós de cluster estejam acessíveis. Esse erro normalmente ocorre quando o endereço IP da máquina do cliente não está configurado na Lista de acesso IP do Atlas , que você pode encontrar na aba Network Access do seu Projeto Atlas .The remote certificate is invalid according to the validation procedure
: esse erro normalmente indica um problema relacionado ao TLS/SSL, como um certificado expirado/inválido ou uma CA raiz não confiável. Você pode usar ferramentas como oopenssl s_client
para depurar problemas de certificado relacionados ao TLS/SSL.
Documentação da API
Para saber mais sobre as aulas e os métodos usados neste guia, consulte a seguinte documentação da API: