Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver C#/ .NET
/ /

Personalizar seleção de servidor MongoDB

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.

Quando o driver .NET/C# executa uma operação de leitura, ele executa as seguintes etapas, para selecionar uma implantação MongoDB :

  1. Seleciona todos os servidores que correspondem à preferência de leitura ativa da lista de servidores conhecidos.

  2. 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.

  3. Aplica a configuração de conexão LocalThreshold à lista de servidores retornados da função.

  4. 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.

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

CompositeServerSelector

Seleciona servidores com base em vários seletores parciais

DelegateServerSelector

Envolve um seletor de servidor delegado

EndPointServerSelector

Seleciona servidores com base em seus endpoints

LatencyLimitingServerSelector

Seleciona servidores dentro de uma faixa de latência aceitável

PriorityServerSelector

Seleciona um servidor com base em uma coleção de servidores para despriorizar

RandomServerSelector

Seleciona um servidor aleatório

ReadPreferenceServerSelector

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.

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.

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

LocalThreshold

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

ReadPreference

The client's default read-preference settings. MaxStaleness represents the
longest 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:
readPreference=primaryPreferred
&maxStalenessSeconds=90
&readPreferenceTags=dc:ny,rack:1

ServerSelectionTimeout

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

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:

  1. O tempo limite de seleção do servidor (30000 ms).

  2. Os seletores de servidor considerados (CompositeServerSelector contendo AreSessionsSupportedServerSelector, LatencyLimitingServerSelector e OperationsCountServerSelector).

  3. 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 o HeartbeatException 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 o openssl s_client para depurar problemas de certificado relacionados ao TLS/SSL.

Para saber mais sobre as aulas e os métodos usados neste guia, consulte a seguinte documentação da API:

Voltar

Comprimir tráfego de rede

Nesta página