Les constructions d'index dans MongoDB peuvent avoir un impact négatif sur la disponibilité de votre cluster MongoDB. Si vous déclenchez une génération d'index de premier plan sur une grande collection sur votre serveur de production, vous pouvez constater que votre cluster ne répond pas tant que la génération d'index n'est pas terminée. Sur une grande collection, cela peut prendre plusieurs heures ou plusieurs jours, comme décrit dans les périls de la construction d'index dans MongoDB.
La meilleure pratique recommandée consiste à déclencher les constructions d'index en arrière-plan, cependant, sur les index de grande collection, nous avons constaté plusieurs problèmes avec cette approche. Dans le cas d'un cluster à trois nœuds, les deux secondaires commencent à créer l'index et cessent de répondre aux requêtes. Par conséquent, l'état principal n'a pas de quorum et passe à l'état secondaire en supprimant votre cluster. De plus, les constructions d'index par défaut déclenchées à partir de la ligne de commande sont des constructions d'index de premier plan, ce qui en fait un problème désormais répandu. Dans les prochaines versions, nous espérons que cela deviendra l'arrière-plan par défaut.
Une fois que vous avez déclenché un index, le simple redémarrage du serveur ne résout pas notre problème ; MongoDB reprendra la construction de l'index là où elle s'est arrêtée. Si vous exécutiez une génération d'index en arrière-plan après le redémarrage, elle devient désormais une génération d'index de premier plan. Dans ce cas, le redémarrage pourrait aggraver le problème.
Si vous avez déjà déclenché une génération d'index, comment l'arrêter ? Heureusement, il est relativement facile d'arrêter la création d'un index.
Option 1 :Arrêter le processus de création d'index
Localisez le processus de génération d'index à l'aide de db.currentOp(), puis arrêtez l'opération à l'aide de db.killOp(
{ "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 le nœud où l'index est en cours de construction ne répond pas aux nouvelles connexions, ou si le killOp ne fonctionne pas, utilisez l'option 2 ci-dessous :
Option 2 :Configuration de "noIndexBuildRetry" et redémarrage
MongoDB fournit une option "–noIndexBuildRetry" qui demande à MongoDB d'arrêter de créer des index incomplets au redémarrage.
Ce paramètre ne semble pas être pris en charge à partir du fichier de configuration, uniquement en tant que paramètre pour le processus mongod. Nous ne préférons pas exécuter mongod manuellement avec cette option car si vous exécutez accidentellement le processus mongod en tant qu'utilisateur élevé (par exemple, root), cela finit par modifier les autorisations de tous les fichiers. De plus, une fois exécuté en tant que "root", nous avons eu des problèmes intermittents pour exécuter à nouveau le processus en tant que mongod.
Une option plus simple consiste à modifier le fichier /etc/init.d/mongod. Recherche cette ligne :
OPTIONS=" -f $CONFIGFILE"
Remplacez par cette ligne :
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Étapes détaillées
Aux fins de cette discussion, nous fournissons des instructions pour CentOS/RedHat/Amazon Linux.
-
Configurer "–noIndexBuildRetry"
Ajoutez l'option "–noIndexBuildRetry" à tous vos nœuds de données comme expliqué ci-dessus.
-
Redémarrer tous les nœuds construisant l'index
Regardez le fichier journal mongod pour chaque serveur de données et déterminez s'il construit l'index. Si c'est le cas, redémarrez le serveur "service mongod restart".
-
Supprimer l'index incomplet
Une fois tous les nœuds concernés redémarrés, consultez la liste des index et supprimez l'index incomplet si vous le voyez dans la liste.
-
Supprimer "–noIndexBuildRetry"
Modifiez le fichier /etc/init.d/mongod pour supprimer l'option –noIndexBuildRetry que vous avez ajoutée à l'étape 1 afin que nous puissions revenir au comportement par défaut de reprise de la construction de l'index.
Pour toute autre question, contactez-nous à [email protected].
Bonne indexation !