Docs Menu
Docs Home
/

Solucionar problemas de sets de réplicas sin primario

Los sets de réplicas pueden entrar ocasionalmente en un estado donde no existe un primario, típicamente durante las elecciones. Sin embargo, cuando no existe un primario durante un período prolongado, el set de réplicas no puede aceptar escrituras.

Esta página contiene problemas comunes y resoluciones para la solución de problemas de sets de réplicas que no tienen primario durante un período prolongado. Si necesitas soporte adicional después de revisar las siguientes secciones, ponte en contacto con Soporte técnico.

Verifica que tu implementación no tenga un primario ejecutando el replSetGetStatus o el método rs.status(). El siguiente ejemplo muestra la salida del método rs.status() para un set de réplicas sin primario:

rs.status().members
[
{
_id: 0,
name: 'localhost:27018',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
configVersion: 2,
configTerm: 6,
self: true,
lastHeartbeatMessage: ''
},
{
_id: 1,
name: 'localhost:27019',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
configVersion: 2,
configTerm: 6
},
{
_id: 2,
name: 'localhost:27020',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
configVersion: 2,
configTerm: 6
}
]

Nota

En algunos casos, puede ver que la salida de rs.status() muestra el valor de stateStr de algunos nodos como UNKNOWN o DOWN.

Revisa los mensajes de registro de la implementación para las entradas donde el valor del componente ("c") sea ELECTION. Aquí, podrías encontrar intentos repetidos de iniciar elecciones que fallan con los siguientes mensajes en el campo "msg":

Mensaje
Descripción

"Iniciando una elección, ya que no hemos visto NINGÚN PRIMARIO en el periodo de tiempo de espera de la elección"

Registrado por otros nodos cuando el principal se retira.

“recibimos votos insuficientes”

Indica que la mayoría de los nodos no respondieron a la solicitud de elección. Es posible que los nodos estén inactivos o que se haya producido una partición de red.

"no puede ver la mayoría del conjunto, cediendo el control primario"

Puede que algunos nodos estén caídos o que haya ocurrido una partición de red.

La sección siguiente describe los problemas comunes que pueden causar dificultades a un set de réplicas para elegir un nuevo primario y cómo resolverlos. Antes de contactar con soporte, compruebe si los siguientes problemas impiden que su implementación elija un primario.

Si tu implementación experimenta una partición de red, los nodos no pueden comunicarse entre sí, lo que les impide elegir un primario.

Para verificar si su implementación se ve afectada por una partición de red, ejecute el método replSetGetStatus o rs.status() desde diferentes nodos. En función de la salida de cada nodo, identifica qué nodos se encuentran a cada lado de la partición.

Para ayudar a restaurar la conectividad después de una partición:

  • Verifique las configuraciones del cortafuegos para detectar cualquier regla que bloquee la comunicación entre nodos.

  • Verificar los nombres de host DNS.

  • Asegúrate de agregar tu dirección IP a tu lista de acceso IP.

Tip

Una vez que la mayoría de los nodos pueden conectarse entre sí, MongoDB elige automáticamente un nodo primario y reanuda las escrituras de manera normal.

Asegúrate de que tu centro de datos principal contenga tanto un quórum de nodos con derecho a voto como nodos que sean elegibles para ser primarios. Si el primario de tu set de réplicas se cae y ninguno de los secundarios es elegido para convertirse en primario, verifica que los nodos restantes no sean todos nodos de prioridad 0.

Para comprobar los valores de prioridad de cada nodo, ejecutar el comando replSetGetConfig o el método rs.conf():

// Returns an array of documents corresponding with each member in your replica set
rs.conf().members
[
...
{
_id: 1,
host: localhost:27019,
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 0,
tags: {},
secondaryDelaySecs: Long('0'),
votes: 1
},
...
]

Si ninguno de los secundarios es elegible para convertirse en primario debido a su prioridad, actualiza el valor members[n].priority de uno o varios secundarios. Para obtener instrucciones detalladas, consulta Ajustar la prioridad para un miembro de set de réplicas autogestionado.

Si tu implementación tiene cargas de trabajo intensivas en escritura, demasiados índices o procesos de mantenimiento que ocupan un espacio significativo en disco, podrías sobrecargar tus nodos y hacer que fallen.

Para reclamar espacio en disco, considere:

  • Descartando colecciones o bases de datos no utilizadas.

  • Eliminando los índices duplicados o no utilizados.

  • Si tiene programado periodo de mantenimiento, considera habilitar la compactación en segundo plano con el autoCompact.

    Advertencia

    Ejecute autoCompact sólo durante períodos de bajo tráfico, como en un periodo de mantenimiento. En bases de datos de alto tráfico, la compactación en segundo plano puede potencialmente retrasar o impedir tareas operativas como la realización de copias de seguridad. Para obtener más información sobre el impacto en el rendimiento y otras consideraciones antes de habilitar la compactación en segundo plano, consulte Comportamiento de autoCompactación.

Para supervisar el uso del disco:

  • En Atlas, puede ver el Disk Usage gráfica, disponible en supervisión de clúster.

  • En las implementaciones autogestionadas, ejecute el comando dbStats o el método db.stats().

Si varios miembros con derecho a voto se desconectan y el set de réplicas pierde su mayoría, la salida rs.status() puede mostrar que todos los miembros están en los estados SECONDARY o RECOVERING. Los siguientes escenarios pueden causar la pérdida de la mayoría:

Por ejemplo, considera un set de réplicas de tres nodos donde se desconectan dos nodos para realizar tareas de mantenimiento al mismo tiempo. En este escenario, el conjunto de réplicas pierde su mayoría y no puede elegir un nuevo primario hasta que el tercer nodo esté de nuevo en funcionamiento.

Para evitar este escenario, asegúrate de realizar el mantenimiento progresivo de manera secuencial, comenzando con los nodos secundarios y terminando con el nodo primario. Esto garantiza que un primario siempre esté disponible. Para obtener orientación sobre el mantenimiento del set de réplicas, consulta Realizar el mantenimiento de los miembros del set de réplicas autogestionados.

Por ejemplo, considera una implementación con dos miembros que contienen datos y un nodo oculto sin derecho a voto. Si un nodo portador de datos falla, los nodos restantes no pueden formar una mayoría.

En una topología principal-secundaria-árbitro (PSA) que utiliza "majority" nivel de confirmación de escritura (write concern), si el nodo secundario se baja por mantenimiento, las escrituras se detienen. El nodo primario no puede obtener el reconocimiento de la mayoría porque sólo uno de los dos miembros votantes, que almacenan datos, está disponible. Sin wtimeout configurado en operaciones de guardar, las operaciones de guardar se bloquean indefinidamente. Para mitigar esto:

  • Limitar las operaciones de escritura durante el periodo de mantenimiento para restringir el volumen de escrituras bloqueadas.

  • Establece el parámetro wtimeout en las operaciones de escritura que utilizan el nivel de confirmación de escritura (write concern) "majority" para evitar que las escrituras queden bloqueadas indefinidamente.

Para más detalles sobre cómo mitigar problemas de rendimiento en topologías PSA, consulte Mitigar los problemas de rendimiento en conjuntos de réplicas PSA autogestionados.

En una topología primaria-secundaria-secundaria-secundaria-árbitro (PSSSA), ubicar a la mayoría de los miembros votantes en un solo centro de datos o en un sitio de recuperación ante desastres (DR) crea un riesgo de pérdida mayoritaria. Si esa región se cae completamente, los nodos restantes no pueden formar una mayoría y no pueden elegir un primario. Distribuya los miembros con derecho a voto por las regiones para que la mayoría permanezca disponible después de una falla de una sola región. Para obtener orientación, consulta Conciencia del centro de datos.

Una vez que su implementación esté restaurada y se haya elegido un nuevo primario, la salida rs.status() muestra que uno de sus nodos está en el estado PRIMARY.

Si no puedes resolver tu problema, ponte en contacto con Soporte Técnico con la siguiente información de diagnóstico:

  • Mensajes de registro relevantes

  • rs.config() salida

  • rs.status() salida

Volver

Elecciones frecuentes

En esta página