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.
Comprobaciones previas
Para comprobar la duración actual del atraso de la replicación en la implementación:
En un
mongoshsesión que está conectada al primario, llamar al métodors.printSecondaryReplicationInfo()para mostrar el retraso actual en cada secundario en relación con el host primario.Devuelve el valor
syncedTopara 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
0segundos detrás del primario cuando el período de inactividad en el primario es mayor que el valormembers[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.
Problemas comunes y soluciones
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:
Latencia de la red
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.
Agotamiento de recursos 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 .
Problemas relacionados con el disco
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:
Aumentar las IOPSaprovisionadas
Actualizando a almacenamiento NVMe
Actualizar a un nivel de clúster Atlas superior. Para obtener más información, consulte Tamaño de clúster Atlas y selección de nivel.
Operaciones de larga duración
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.
Carga Excesiva de Escritura
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:
Utilice lotes más pequeños
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")}});
Configure los ajustes y parámetros del lado del servidor
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.
Eliminar documentos en orden indexado
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" });
oplog Window Size
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. |
Verificar resolución
Para confirmar que el problema está resuelto, llama al método rs.printSecondaryReplicationInfo() y verifica que ya no haya nodos atrasados.
Diagnósticos a recopilar para más apoyo
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.