El retraso en la replicación hace que los miembros "retrasados" no puedan convertirse rápidamente en primarios y aumenta la posibilidad de que las operaciones de lectura distribuidas sean inconsistentes.
Esta página contiene varios consejos para reducir el retraso en la replicación; sin embargo, en muchos casos puede ser necesario recurrir a un especialista. Si no puede determinar la causa del retraso en la replicación o necesita asistencia adicional, póngase en contacto con el soporte técnico.
Comprobaciones de requisitos previos
Para comprobar la duración actual del retraso de replicación en su implementación:
En un
mongoshsesión que está conectada al principal, llame al métodors.printSecondaryReplicationInfo()para mostrar el retraso actual en cada secundario en relación con el host principal.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 primario indica cuánto retraso presenta el secundario con respecto al primario.
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 en las implementaciones de Atlas comprobando si hay valores de tiempo de oplog distintos de cero o crecientes en el Replication Lag grafo disponible en Cloud Manager y en Ops Manager.
Además, puede supervisar el retraso de replicación en Atlas consultando los Replication Lag Oplog GB/Hourvalores, y Replication Oplog Window en la pestaña de métricas de su clúster. Para obtener más información, consulte la sección «Revisión de métricas disponibles».
Problemas comunes y sus soluciones
No existe un código de error para el retraso en la replicación, ni una forma inmediata de determinar la causa. Sin embargo, antes de contactar con el soporte técnico, compruebe si los siguientes problemas podrían estar causando el retraso:
Latencia de la red
El retraso en la replicación puede acumularse cuando los nodos del clúster no pueden comunicarse entre sí de forma fiable.
Verifique las rutas de red entre los miembros de su conjunto de réplicas para asegurarse de que no haya pérdida de paquetes ni problemas de enrutamiento de red.
Utilice herramientas como para probar la latencia entre los miembros del conjunto ping y traceroute para exponer el enrutamiento de paquetes entre los puntos finales de la red.
Como alternativa, ejecute y examine replSetGetStatus el pingMs campo. Esto devuelve la latencia actual de la red en milisegundos entre los nodos primario y secundario.
Agotamiento de recursos secundarios
Los nodos secundarios pueden experimentar contención de recursos cuando no pueden gestionar eficientemente las operaciones de lectura entrantes del nodo primario. Esto puede provocar problemas de memoria, como la contención de caché. Cuando la caché alcanza umbrales críticos, el servidor utiliza subprocesos de la aplicación para eliminar páginas, lo que reduce el número de subprocesos disponibles para gestionar la replicación.
Para comprobar si el servidor redirige los subprocesos de la aplicación a tareas de desalojo, ejecute el siguiente comando en su shell mongosh:
db.serverStatus().wiredTiger.cache['pages evicted by application threads']
Si Resultado 0 =: No se pausan subprocesos de la aplicación para su desalojo.
Si Result > 0 (y sigue aumentando): La base de datos está bajo presión de caché. Las consultas entrantes deben eliminar los datos almacenados en caché antes de ejecutarse, lo que puede aumentar el retraso de replicación.
Los usuarios de Atlas también pueden monitorear las métricas WiredTiger Cache Activity y Page Faults para investigar problemas relacionados con la caché.
Para conocer posibles estrategias para solucionar este problema,consulte la sección "Amplíe sus recursos".
Problemas relacionados con el disco
Si un nodo secundario no puede escribir los datos modificados en el disco con la suficiente rapidez, se queda rezagado con respecto al nodo principal. Este fenómeno ocurre cuando el volumen de escrituras provenientes del nodo principal supera la velocidad de escritura del disco del nodo secundario.
Los problemas relacionados con el disco son frecuentes en los sistemas multiusuario, incluidas las instancias virtualizadas, y pueden ser transitorios si el sistema accede a los dispositivos de disco a través de una red IP.
Para evaluar el estado del disco, utilice herramientas a nivel del 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 disco.
Algunas causas comunes de problemas de disco incluyen:
Aprovisionamiento insuficiente: El servidor secundario tiene discos más lentos o un menor rendimiento de IOPS que el servidor principal.
Sobrecarga de virtualización: En entornos compartidos, otras máquinas virtuales pueden saturar el controlador del disco físico.
Algunas posibles soluciones a los problemas de disco incluyen:
Incremento de las IOPS aprovisionadas
Actualización a almacenamiento NVMe
Actualización a un nivel superior del clúster Atlas. Para obtener más información, consulte Dimensionamiento del 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 analizador de rendimiento de la base de datos para identificar consultas lentas u operaciones de larga duración que se correlacionen con el retraso observado.
Carga de escritura excesiva
Las operaciones de escritura masiva pueden exceder la capacidad de los conjuntos de réplicas para replicarse de manera oportuna, lo que provoca retrasos en la replicación.
Las siguientes subsecciones ofrecen posibles soluciones a este problema:
Utilice lotes más pequeños.
Controla la carga mediante el procesamiento por lotes y el filtrado de los comandos CRUD.
Ejecute cada lote con un rango de fechas u horas, como un mes, una semana o un día. Asegúrese de que los filtros de consulta utilicen un índice para evitar escaneos de colecciones. Los escaneos de colecciones pueden eliminar páginas de datos e índices del conjunto de trabajo y aumentar el retraso de replicación.
Comience eliminando rangos de fechas pequeños. Si estas operaciones se completan en segundos, aumente el tamaño del lote.rs.printSecondaryReplicationInfo() Supervise el retraso de replicación con. Aumente el tamaño del lote hasta alcanzar un equilibrio entre el rendimiento y el retraso de replicación. Continúe supervisando la carga del sistema, el impacto en otros usuarios y aplicaciones, y el retraso de las réplicas secundarias.
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")}});
Configurar los ajustes y parámetros del servidor
MongoDB proporciona las 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 causada por las eliminaciones masivas cuando se producen otras operaciones de escritura simultáneamente.Nota
Tenga cuidado al modificar, ya que cambiar la configuración puede provocar problemas de rendimiento o errores. Le recomendamos que consulte con el soporte de MongoDB antes de modificar el
storageEngineConcurrentWriteTransactionsparámetro.maxTimeMSSi la operación de escritura masiva es compleja, puede limitar su tiempo de ejecución para evitar operaciones prolongadas que afecten el rendimiento del servidor. Algunos ejemplos de operaciones complejas incluyen la comparación de muchos documentos o la consulta de campos no indexados.
Eliminar documentos en orden indexado
Si el campo sobre el que se realizan las operaciones masivas no está indexado, dichas operaciones pueden provocar escaneos de tablas o recopilaciones, lo que aumenta el consumo de recursos. Asegúrese de que exista un índice en el campo utilizado en el filtro de consulta para agilizar las eliminaciones, reducir la contención de bloqueos y mejorar el rendimiento.
Cree un índice antes de ejecutar la operación:
db.collection.createIndex({ status: 1 });
Luego, elimine en función del campo indexado:
db.collection.deleteMany({ status: "inactive" });
Tamaño de la ventana de oplog
Si la ventana del oplog es demasiado pequeña para la cantidad de datos que se sincronizan, es posible que se produzca un retraso en la replicación. Un oplog más grande puede proporcionar al conjunto de réplicas una mayor tolerancia al retraso.
Para comprobar el tamaño del oplog y los rangos de fechas de sus operaciones para un miembro del conjunto de réplicas determinado, conéctese al miembro en mongosh y ejecute el rs.printReplicationInfo() método. El oplog debe ser lo suficientemente largo como para almacenar todas las transacciones durante el tiempo de inactividad más largo que espere en unservidor secundario.1 [] Como mínimo, un oplog debe poder almacenar un mínimo 24 de horas de operaciones; sin embargo, muchos usuarios prefieren tener 72 horas o incluso una semana de trabajo 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 se ha resuelto, llame al método y compruebe que ya no hay miembros rs.printSecondaryReplicationInfo() rezagados.
Diagnósticos para recopilar para obtener más apoyo
Si ninguna de las soluciones anteriores reduce la latencia, contacte con el servicio de asistencia técnica. Es posible que le soliciten información de diagnóstico para identificar mejor el problema.
Algunos diagnósticos útiles que los usuarios de Atlas pueden recopilar para obtener asistencia incluyen:
Tu
rs.printSecondaryReplicationInfo()salidaCronología de cuándo comenzó el retraso
Cualquier cambio reciente en su implementación, como cambios en su esquema, índices, aplicación, nivel o hardware.