sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo detener una compilación de índice fuera de control en MongoDB

Las compilaciones de índices en MongoDB pueden tener un impacto adverso en la disponibilidad de su clúster de MongoDB. Si activa una compilación de índice en primer plano en una colección grande en su servidor de producción, es posible que su clúster no responda hasta que se complete la compilación del índice. En una colección grande, esto podría llevar varias horas o días, como se describe en los peligros de la creación de índices en MongoDB.

La mejor práctica recomendada es activar compilaciones de índices en segundo plano; sin embargo, en índices de colecciones grandes, hemos visto varios problemas con este enfoque. En el caso de un clúster de tres nodos, ambos secundarios comienzan a generar el índice y dejan de responder a las solicitudes. En consecuencia, el principal no tiene quórum y pasa al estado secundario, lo que elimina el clúster. Además, las compilaciones de índice predeterminadas activadas desde la línea de comando son compilaciones de índice en primer plano, lo que hace que este sea un problema generalizado. En versiones futuras, esperamos que esto se convierta en segundo plano de forma predeterminada.

Una vez que haya activado un índice, simplemente reiniciar el servidor no resuelve nuestro problema; MongoDB retomará la creación del índice desde donde la dejó. Si anteriormente estaba ejecutando una compilación de índice en segundo plano después del reinicio, ahora se convierte en una compilación de índice en primer plano, por lo que, en este caso, el reinicio podría empeorar el problema.

Si ya activó una compilación de índice, ¿cómo la detiene? Afortunadamente, es relativamente fácil detener la compilación de un índice.

Opción 1:eliminar el proceso de creación del índice

Ubique el proceso de creación del índice usando db.currentOp() y luego elimine la operación usando db.killOp(). La operación de índice se verá así:

{
"opid" : 820659355,
"active" : true,
"lockType" : "write",
....
"op" : "insert",
"ns" : "xxxx",
"query" : {
},
"client" : "xxxx",
"desc" : "conn",
"msg" : "index: (2/3) btree bottom up 292168587/398486401 64%"
}

Si el nodo donde se está construyendo el índice no responde a las nuevas conexiones, o killOp no funciona, use la opción 2 a continuación:

Opción 2:configurar "noIndexBuildRetry" y reiniciar

MongoDB proporciona una opción “–noIndexBuildRetry” que indica a MongoDB que deje de crear índices incompletos al reiniciar.

Este parámetro no parece ser compatible con el archivo de configuración, solo como un parámetro para el proceso mongod. No preferimos ejecutar mongod manualmente con esta opción porque si ejecuta accidentalmente el proceso de mongod como un usuario elevado (por ejemplo, raíz), termina cambiando los permisos de todos los archivos. Además, una vez ejecutado como "root", tuvimos problemas intermitentes al ejecutar el proceso como mongod nuevamente.

Una opción más sencilla es editar el archivo /etc/init.d/mongod. Busca esta línea:

OPTIONS=" -f $CONFIGFILE"

Reemplace con esta línea:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Pasos detallados

A los efectos de esta discusión, proporcionamos instrucciones para CentOS/RedHat/Amazon Linux.

  1. Configurar “–noIndexBuildRetry”

    Agregue la opción “–noIndexBuildRetry” a todos sus nodos de datos como se explicó anteriormente.

  2. Reiniciar todos los nodos construyendo el índice

    Mire el archivo de registro de mongod para cada servidor de datos y determine si está construyendo el índice. Si es así, reinicie el servidor "service mongod restart".

  3. Eliminar el índice incompleto

    Una vez que se reinician todos los nodos relevantes, mire la lista de índices y elimine el índice incompleto si lo ve en la lista.

  4. Eliminar “–noIndexBuildRetry”

    Edite el archivo /etc/init.d/mongod para eliminar la opción –noIndexBuildRetry que agregó en el paso 1 para que podamos volver al comportamiento predeterminado de reanudar la creación del índice.

Si tiene más preguntas, comuníquese con nosotros a [email protected].

¡Feliz indexación!