Docs Menu
Docs Home
/ /

Personalizar selección de servidor

Todos los controladores de MongoDB siguen un algoritmo definido al seleccionar un servidor desde el que leer o escribir. Al usar el ClusterConfigurator propiedad de un objeto MongoClient, puede personalizar este algoritmo para elegir el servidor que funcione mejor para su aplicación.

Importante

Personalizar el algoritmo de selección del servidor podría tener consecuencias no deseadas, como un rendimiento de lectura o escritura degradado.

Cuando el controlador .NET/C# ejecuta una operación de lectura, realiza los siguientes pasos, en orden, para seleccionar una implementación de MongoDB:

  1. Selecciona todos los servidores que coincidan con la preferencia de lectura activa de la lista de servidores conocidos.

  2. Si existe al menos un servidor legible, el controlador llama a la función de selección de servidor definida por el usuario y pasa la lista del paso anterior.

  3. Aplica la configuración de conexión LocalThreshold a la lista de servidores devueltos por la función.

  4. Selecciona un servidor al azar de la lista de servidores disponibles y ejecuta la operación en él.

Cuando el controlador .NET/C# ejecuta una operación de escritura, comienza seleccionando todos los servidores con permisos de escritura, no solo aquellos que coinciden con la preferencia de lectura activa. Los pasos restantes son idénticos.

Para obtener más información sobre el algoritmo de selección de servidor predeterminado, que sigue el controlador cuando no especifica ninguna lógica de selección de servidor personalizada, consulte Algoritmo de selección de servidor en el manual del servidor MongoDB.

Puede especificar una lógica de selección de servidor diferente pasando una instancia de una clase de selector de servidor a la propiedad PreServerSelector o PostServerSelector de ClusterConfigurator. La propiedad PreServerSelector especifica un selector de servidor que se ejecuta antes de la lógica de selección de servidor estándar, mientras que la propiedad PostServerSelector especifica un selector de servidor que se ejecuta después de esta. Después, puede pasar su instancia ClusterConfigurator al objeto MongoClientSettings al crear una instancia MongoClient para aplicar su lógica de selección de servidor personalizada.

La siguiente tabla enumera los diferentes tipos de selectores de servidor que puede pasar a la propiedad ClusterConfigurator:

Selector de servidor
Descripción

CompositeServerSelector

Selecciona servidores en función de múltiples selectores parciales

DelegateServerSelector

Envuelve un selector de servidor delegado

EndPointServerSelector

Selecciona servidores en función de su punto final

LatencyLimitingServerSelector

Selecciona servidores dentro de un rango de latencia aceptable

PriorityServerSelector

Selecciona un servidor en función de una colección de servidores para despriorizar

RandomServerSelector

Selecciona un servidor aleatorio

ReadPreferenceServerSelector

Selecciona servidores según una preferencia de lectura específica

El siguiente ejemplo indica a MongoClient que utilice la clase RandomServerSelector para seleccionar un servidor al azar antes de que se ejecute la lógica de selección de servidor estándar:

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 obtener más información sobre las diferentes clases de selector de servidor, consulte la documentación de la API de ServerSelectors.

Puede implementar su propia lógica de selección de servidores personalizada creando una clase que herede de la interfaz IServerSelector y sobrescriba el método SelectServers(). El siguiente ejemplo muestra una clase de selección de servidores personalizada simple que selecciona servidores con un valor de 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);
}
}

Luego puede pasar una instancia de esta clase a la propiedad PreServerSelector o PostServerSelector de una ClusterConfigurator instancia, como se muestra en la sección Especificación de otros algoritmos de selección de servidor.

Puede especificar las siguientes configuraciones de selección de servidor en su objeto MongoClient o en su URI de conexión:

Configuración
Descripción

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 operación del controlador requiere que se seleccione un servidor que cumpla con los criterios de selección. Si no se selecciona un servidor adecuado dentro del tiempo límite de selección, el controlador genera una excepción similar a la siguiente:

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>"
}]
}.

El mensaje de error consta de varias partes:

  1. El tiempo de espera de selección del servidor (30000 ms).

  2. Los selectores de servidor considerados (CompositeServerSelector que contiene AreSessionsSupportedServerSelector, LatencyLimitingServerSelector y OperationsCountServerSelector).

  3. Vista actual del controlador de la topología del clúster. La lista de servidores que el controlador reconoce es fundamental en esta vista. Cada descripción de servidor contiene una descripción exhaustiva de su estado actual, incluyendo información sobre un punto final, la versión del servidor, el tipo de servidor y su estado actual. Si el servidor presenta problemas al informar su estado, HeartbeatException contiene la excepción del último latido fallido. Analizar el HeartbeatException en cada nodo del clúster puede ayudar a diagnosticar la mayoría de los problemas de selección de servidores. Las siguientes excepciones de latido son comunes:

    • No connection could be made because the target machine actively refused itEl controlador no puede ver este nodo del clúster. Esto podría deberse a que el nodo del clúster ha fallado, a que un firewall impide que el tráfico de red llegue al nodo o puerto del clúster, o a que algún otro error de red impide que el tráfico se enrute correctamente al nodo del clúster.

    • Attempted to read past the end of the streamEste error ocurre cuando el controlador no puede conectarse a los nodos del clúster debido a un error de red, un firewall mal configurado u otro problema de red. Para solucionar esta excepción, asegúrese de que todos los nodos del clúster sean accesibles. Este error suele ocurrir cuando la dirección IP del equipo cliente no está configurada en la lista de acceso de IP de Atlas, que puede encontrar en Network Access Pestaña para su proyecto Atlas.

    • The remote certificate is invalid according to the validation procedureEste error suele indicar un problema relacionado con TLS/SSL, como un certificado caducado o inválido o una CA raíz no confiable. Puede usar herramientas como openssl s_client para depurar problemas de certificados relacionados con TLS/SSL.

Para obtener más información sobre las clases y métodos utilizados en esta guía, consulta la siguiente documentación de la API:

Volver

Comprimir el tráfico de la red

En esta página