Docs Menu
Docs Home
/

Solucionar problemas de atraso de la replicación

El atraso de la replicación hace que los nodos "retrasados" no sean elegibles para convertirse rápidamente en primarios y aumenta la posibilidad de que las operaciones de lectura distribuidas sean inconsistentes.

Esta página contiene varios consejos que pueden reducir el atraso de la replicación; sin embargo, muchos casos pueden requerir una escalada. Si no puedes determinar la causa de tu atraso de la replicación o necesitas soporte adicional, contáctate con Soporte Técnico.

Para comprobar la duración actual del atraso de la replicación en la implementación:

  • En un mongosh sesión que está conectada al primario, llamar al método rs.printSecondaryReplicationInfo() para mostrar el retraso actual en cada secundario en relación con el host primario.

    Devuelve el valor syncedTo para cada nodo, que muestra la hora en que se escribió la última entrada de oplog en el secundario, como se muestra en el siguiente ejemplo:

    source: m1.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    7230 secs (2 hrs) behind the primary
    source: m2.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary

    El número de segundos de retraso con respecto al principal indica cuán lejos va el secundario respecto al principal.

    Un miembro atrasado puede mostrarse como 0 segundos detrás del primario cuando el período de inactividad en el primario es mayor que el valor members[n].secondaryDelaySecs.

  • En las implementaciones de Atlas, supervise la tasa de replicación revisando la existencia de valores de tiempo de oplog distintos de cero o en aumento en la Replication Lag grafo disponible en Cloud Manager y en Ops Manager.

    Además, puedes supervisar el retraso de replicación en Atlas revisando el Replication Lag, Oplog GB/Hour y Replication Oplog Window en la pestaña de métricas de tu clúster. Para obtener más información, consulta Revisión métricas disponibles.

No existe un código de error para el atraso de la replicación, y no hay una manera inmediata de determinar la causa. Sin embargo, antes de que escales a soporte, verifica si los siguientes problemas pueden estar causando tu retraso:

El atraso de la replicación puede aumentar cuando los nodos del clúster no pueden comunicarse de manera confiable entre sí.

Verifica las rutas de red entre los nodos de tu conjunto de réplicas para asegurarte de que no haya pérdida de paquetes o problemas de enrutamiento de red.

Utilice herramientas como ping para probar la latencia entre los nodos del conjunto y traceroute para exponer el enrutamiento de paquetes entre los puntos finales de la red.

Alternativamente, ejecuta replSetGetStatus y examina el campo pingMs. Esto devuelve la latencia de red actual en milisegundos entre los nodos primarios y secundarios.

Los nodos secundarios pueden experimentar una contención de recursos cuando no pueden gestionar eficientemente las operaciones de lectura entrantes desde el nodo primario. Esto puede ocasionar problemas de memoria, como disputa de caché. Cuando el caché alcanza umbrales críticos, el servidor utiliza hilos de la aplicación para expulsar páginas, lo que reduce el número de hilos disponibles para gestionar la replicación.

Para ver si el servidor redirige los subprocesos de la aplicación a tareas de expulsión, ejecuta el siguiente comando en tu mongosh shell:

db.serverStatus().wiredTiger.cache['pages evicted by application threads']
  • Si Resultado = 0: No se han pausado subprocesos de aplicación para desalojo.

  • Si Resultado > 0 (y aumentando): la base de datos está sometida a presión de caché. Las consultas entrantes deben eliminar los datos almacenados en caché antes de que se ejecuten, lo que puede aumentar el atraso de la replicación.

Los usuarios de Atlas también pueden supervisar las métricas WiredTiger Cache Activity y Page Faults para investigar los problemas relacionados con la caché.

Para conocer estrategias potenciales para solucionar este inconveniente, consulte Amplía tus recursos .

Si un nodo secundario no puede vaciar los datos pendientes en el disco lo suficientemente rápido, se retrasa respecto al primario. Este fenómeno ocurre cuando el volumen de escrituras que provienen del primario supera la velocidad de escritura del disco del secundario.

Los problemas relacionados con el disco son frecuentes en sistemas multiinquilino, incluidas las instancias virtualizadas, y pueden ser transitorios si el sistema accede a dispositivos de disco a través de una red IP.

Para evaluar el estado del disco, utiliza herramientas a nivel de sistema, como iostat o vmstat.

Los usuarios de Atlas pueden acceder a métricas de Atlas como Disk IOPS y Disk Space Used para investigar problemas de discos.

Algunas causas comunes de problemas de disco incluyen:

  • Subaprovisionamiento: el secundario tiene discos más lentos o menor cantidad de IOPS que el primario.

  • Sobrecarga de virtualización: en entornos compartidos, otras máquinas virtuales pueden saturar el controlador de disco físico.

Algunas posibles soluciones a los problemas de disco incluyen:

En algunos casos, las operaciones de larga duración en el primario pueden bloquear la replicación en los secundarios. Para obtener los mejores resultados, configura el nivel de confirmación de escritura (write concern) para que solicite la confirmación de la replicación a los secundarios. Esto impide que se devuelvan las operaciones de escritura si la replicación no puede seguir el ritmo de la carga de escritura.

También puede utilizar el perfilador de bases de datos para identificar consultas lentas u operaciones de larga duración que estén relacionadas con las demoras observadas.

Las operaciones de escritura masiva pueden superar la capacidad de los sets de réplicas para replicarse de manera oportuna, lo que provoca un atraso de la replicación.

Las siguientes subsecciones ofrecen posibles soluciones a este inconveniente:

Controla la carga por medio de la agrupación y el filtrado de comandos CRUD.

Ejecute cada agrupar en relación con un rango de fechas u horas, como un mes, una semana o un día. Asegúrese de que los filtros de query utilicen un índice para evitar escaneos de colección. Los escaneos de colección pueden expulsar datos y páginas de índice del conjunto de trabajo y aumentar el atraso de la replicación.

Empieza por borrando rangos de fechas pequeños. Si esas operaciones se completan en segundos, aumenta el tamaño de lote. Supervisa el atraso de la replicación con rs.printSecondaryReplicationInfo(). Aumente el tamaño del lote hasta que alcance un equilibrio entre el rendimiento y el atraso de la replicación. Continúa supervisando la carga del sistema, el impacto en otros usuarios y aplicaciones y el retraso de los secundarios.

Por ejemplo:

db.collName.deleteMany({createdDate: {$gte: new Date("2018-12-01"), $lt: new Date("2019-01-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-11-01"), $lt: new Date("2018-12-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-10-01"), $lt: new Date("2018-11-01")}});

MongoDB proporciona la siguientes configuraciones y parámetros del lado del servidor que pueden controlar el uso de recursos durante operaciones intensivas de escritura:

  • storageEngineConcurrentWriteTransactionsReducir este valor puede disminuir la contención provocada por borrados masivos, cuando hay operaciones de guardado simultáneas.

    Nota

    Ten cuidado al modificar storageEngineConcurrentWriteTransactions, ya que cambiar la configuración puede provocar problemas de rendimiento o errores. Te recomendamos que consultes con el soporte de MongoDB antes de cambiar el parámetro.

  • maxTimeMS: Si la operación de guardar masivo es compleja, se puede limitar su tiempo de ejecución para evitar operaciones de larga duración que afecten el rendimiento del servidor. Algunos ejemplos de operaciones complejas incluyen la comparación de múltiples documentos o la consulta por campos que no están indexados.

Si el campo sobre el cual ejecuta sus operaciones masivas no está indexado, la operación masiva puede causar escaneos de colección o tablas, aumentando el uso de recursos. Asegúrate de que exista un índice en el campo utilizado en el filtro de query para lograr eliminaciones más rápidas, reducir la contención de bloqueos y mejorar el rendimiento.

Crea un índice antes de ejecutar la operación:

db.collection.createIndex({ status: 1 });

Luego borrar en base a el índice:

db.collection.deleteMany({ status: "inactive" });

Si tu oplog window es demasiado pequeña para la cantidad de datos que estás sincronizando, podrías experimentar un atraso de la replicación. Una oplog más grande puede ofrecer a un set de réplicas una mayor tolerancia a la latencia.

Para comprobar el tamaño del oplog y los intervalos de fecha de sus operaciones para un miembro determinado del conjunto de réplicas, conéctate al miembro en mongosh y ejecuta el método rs.printReplicationInfo(). El oplog debe ser lo suficientemente largo como para contener todas las transacciones durante el tiempo de inactividad más prolongado que se espere en un secundario. [1] Como mínimo, un oplog debería poder contener al menos 24 horas de operaciones; sin embargo, muchos usuarios prefieren tener 72 horas o incluso una semana de operaciones.

Nota

Por lo general, conviene que el oplog sea del mismo tamaño para todos los nodos. Si cambias el tamaño del oplog, debes hacerlo en todos los nodos.

Para cambiar el tamaño del oplog, consulta el tutorial Cambia el tamaño del oplog de los nodos del set de réplicas autogestionado.

[1] El oplog puede crecer más allá de su límite de tamaño configurado para evitar borrar el majority commit point.

Para confirmar que el problema está resuelto, llama al método rs.printSecondaryReplicationInfo() y verifica que ya no haya nodos atrasados.

Si ninguna de las soluciones anteriores reduce el retraso, contacta con soporte. El soporte puede solicitar diagnósticos para diagnosticar aún más su problema.

Algunos diagnósticos útiles que los usuarios de Atlas pueden recopilar para obtener soporte incluyen:

  • Su salida rs.printSecondaryReplicationInfo()

  • La línea de tiempo de cuando comenzó el retraso

  • Cualquier cambio reciente en tu implementación, como cambios en tu esquema, índices, aplicación, nivel o hardware.

Volver

Sin primario del set de réplicas

En esta página