MongoDB: creación de índice sin impacto con nodos de ReplicaSet separados

Crear un índice en una colección MongoDB es simple; solo ejecuta el comando Crear índice y eso es todo lo que hay que hacer. Hay varios tipos de índices disponibles, y en una publicación anterior, puede encontrar los tipos de índice más importantes: tipos de índice MongoDB y explicación ().

El comando es bastante simple, pero para MongoDB, construir un índice es probablemente la tarea más complicada. Explicaré cuáles son los problemas potenciales y la mejor manera de crear cualquier tipo de índice en un entorno de conjunto de réplicas.

Un conjunto de réplicas es un grupo de mungodu servidores, al menos 3, donde se replica la base de datos completa. Algunas de las principales ventajas de este tipo de estructura son la conmutación por error automática y la escalabilidad de lectura. Si necesita familiarizarse más con el conjunto de réplicas, puede echar un vistazo a las siguientes publicaciones:

Implementar un conjunto de replicación de MongoDB con cifrado de transporte (parte 1)

Implementar un conjunto de replicación de MongoDB con cifrado de transporte (parte 2)

Implementar un conjunto de replicación de MongoDB con cifrado de transporte (parte 3)

Crear el índice de impacto

Como dije, crear un índice para MongoDB realmente tiene un impacto severo. La creación de un índice simple en un campo como el siguiente bloquea todas las demás operaciones en la base de datos:

Esto podría ser bueno para una colección muy pequeña, digamos que la construcción tardará unos milisegundos. Pero para colecciones más grandes, esto está absolutamente prohibido.

Llamamos a esta forma de construir un índice el modo «en primer plano».

Crear el índice de primer plano es la forma más rápida, pero dado que está bloqueado, usaremos algo diferente en el entorno de producción. Afortunadamente, también podemos crear un índice en modo «fondo». Podemos usar el siguiente comando:

El índice se construirá en la parte inferior por mungodu utilizando un enfoque incremental diferente. La ventaja es que la base de datos puede continuar funcionando normalmente sin bloqueos. Desafortunadamente, la creación del fondo dura mucho más que la construcción del primer piso.

Por lo tanto, la primera sugerencia es crear el índice utilizando la opción de fondo. Esto está bien, pero no del todo. Más sobre eso más adelante.

Otro impacto al crear un índice es el uso de la memoria. MongoDB usa hasta 500 MB de memoria de forma predeterminada para crear el índice, pero puede anularlo si el índice es más grande. Cuanto mayor sea el índice, mayor será el impacto si no tiene la capacidad de asignar más memoria para la tarea.

Para aumentar la cantidad de memoria para las construcciones de índice, establezca lo siguiente en el archivo de configuración:

maxIndexBuildMemoryUsageMegabytes: 1024

Ejemplo: establecer en 1 GB.

Crear índice en un conjunto de réplicas

Cada vez que el comando de creación de índice se replica en todos los nodos del clúster, se replican todos los demás comandos de escritura de la misma manera. la creación del índice se replica en un clúster de conjunto de réplicas. Una creación en primer plano en los nodos PRIMARIO se replica como un primer plano en los nodos SECUNDARIOS. Una creación de fondo se replica como fondos en los nodos SECUNDARIOS.

La misma limitación se aplica al conjunto de réplicas que al servidor independiente. La construcción del primer piso es rápida pero bloqueada y la construcción del fondo no está bloqueada, pero es significativamente más lenta para colecciones muy grandes.

Entonces, ¿qué podemos hacer?

Si necesita crear un índice pequeño, digamos que el tamaño es menor que la memoria disponible, puede confiar en la creación en segundo plano en el nodo PRIMARIO. La operación se replicará correctamente en los nodos SECUNDARIOS y el impacto general no será tan malo.

Pero si necesita crear un índice de memoria más grande, en una gran colección, incluso la construcción del fondo es mala. La creación tendrá un impacto significativo en los recursos del servidor y es posible que experimente problemas de rendimiento general en todos los nodos. En este caso, seguiremos otro proceso. El procedimiento requiere varios pasos manuales, pero es la única forma de generar correctamente un índice tan grande.

La idea es desconectar del conjunto de réplicas un nodo a la vez, crear el índice y volver a unir el nodo al clúster. Pero primero, debes cuidarlo. oplog cortar. La ventana de registro de operaciones debe ser lo suficientemente grande como para dar tiempo a la construcción del índice cuando se desconecta un nodo.

Nota: La ventana de registro de operaciones es la diferencia de marca de tiempo entre la primera entrada en el registro de operaciones y la más reciente. Representa la cantidad máxima de tiempo que puede tener un nodo desconectado del clúster para cada tipo de tarea (actualizaciones de software, compilaciones de índices, copias de seguridad). Si reúne el nodo en la ventana, el nodo podrá fallar con el PRIMARIO solo realizando las operaciones faltantes del registro de operaciones. Si reúne el nodo después de la ventana, deberá copiar completamente todas las colecciones. Esto requerirá mucho tiempo y un uso impresionante del ancho de banda para implementaciones grandes.

Aquí hay una guía paso a paso:

  • seleccione uno de los nodos SECUNDARIOS
  • desconecte el nodo del conjunto de réplicas
    • comentario en el archivo de configuración u replSetName y tú port opciones
    • establece un número de puerto diferente
    • establecer el parámetro disableLogicalSessionCacheRefresh a cierto

    • empieza de nuevo mungodu
    • ahora el servidor funciona de forma independiente; cada solicitud no será replicada
  • conéctese al puerto alternativo y cree el índice en modo de primer plano

  • conectar el nodo al conjunto de réplicas
    • descomentar opciones en el archivo de configuración
    • expulsar a disableLogicalSessionCacheRefresh opción
    • empieza de nuevo mungodu
    • ahora el nodo es miembro del conjunto de réplicas
    • espere un momento para que el nodo se ponga al día con el PRIMARIO
  • repita los pasos anteriores para todos los nodos SECUNDARIOS restantes
  • reduzca el nodo PRIMARIO para forzar una elección
    • correr rs.stepDown () mando. Esto obliga a una elección. Espere un momento para que el PRIMARIO se convierta en un nodo SECUNDARIO.
  • se reinicia como independiente
    • Usa el mismo procedimiento que vimos antes.
  • construir el índice en el modo de primer plano
  • reinicie el nodo y conéctelo al conjunto de réplicas

Eso es todo. Creamos el índice en todos los nodos sin ningún impacto para el clúster y para las aplicaciones de producción.

Nota: Al reiniciar un nodo como independiente, el nodo puede estar expuesto a escritura incorrecta. Por seguridad, una buena práctica podría ser deshabilitar las conexiones TCP, que solo permiten conexiones locales usando el socket. Luego puede poner el archivo de configuración, por ejemplo:
bindIP: /tmp/mongod.sock

Conclusiones

Este procedimiento es definitivamente más complicado que ejecutar un solo comando. Tomará algo de tiempo, pero con suerte no tendrá que crear índices tan grandes todos los días. ⁇

Author: Ing. Luis

A lo largo de conocer Windows y otros sistemas operativos me eh encontrado con diversos tipos de error, ahora brindo soluciones según mi experiencia-

Deja un comentario