Le build di indici in MongoDB possono avere un impatto negativo sulla disponibilità del tuo cluster MongoDB. Se attivi una build dell'indice in primo piano su una raccolta di grandi dimensioni sul server di produzione, potresti scoprire che il tuo cluster non risponde fino al completamento della build dell'indice. Su una raccolta di grandi dimensioni, l'operazione potrebbe richiedere diverse ore o giorni, come descritto nei pericoli della creazione di indici in MongoDB.
La procedura consigliata è quella di attivare le build degli indici in background, tuttavia, su indici di raccolte di grandi dimensioni, abbiamo riscontrato diversi problemi con questo approccio. Nel caso di un cluster a tre nodi, entrambi i secondari iniziano a creare l'indice e smettono di rispondere a qualsiasi richiesta. Di conseguenza, il principale non ha il quorum e passa allo stato secondario interrompendo il cluster. Inoltre, le build di indice predefinite attivate dalla riga di comando sono build di indice in primo piano, rendendo questo un problema ormai diffuso. Nelle versioni future, speriamo che questo diventi in background per impostazione predefinita.
Una volta attivato un indice, il semplice riavvio del server non risolve il nostro problema; MongoDB riprenderà la build dell'indice da dove era stata interrotta. Se in precedenza stavi eseguendo una build dell'indice in background dopo il riavvio, ora diventa una build dell'indice in primo piano, quindi in questo caso il riavvio potrebbe aggravare il problema.
Se hai già attivato una build dell'indice, come la interrompi? Fortunatamente, è relativamente facile interrompere la compilazione di un indice.
Opzione 1:termina il processo di creazione dell'indice
Individua il processo di compilazione dell'indice utilizzando db.currentOp() e quindi termina l'operazione utilizzando 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%" }
Se il nodo in cui viene creato l'indice non risponde alle nuove connessioni o killOp non funziona, utilizza l'opzione 2 di seguito:
Opzione 2:configurazione di "noIndexBuildRetry" e riavvio
MongoDB fornisce un'opzione "–noIndexBuildRetry" che indica a MongoDB di interrompere la creazione di indici incompleti al riavvio.
Questo parametro non sembra essere supportato dal file di configurazione, solo come parametro per il processo mongod. Non preferiamo eseguire mongod manualmente con questa opzione perché se esegui accidentalmente il processo mongod come utente elevato (ad es. root), finisce per modificare le autorizzazioni di tutti i file. Inoltre, una volta eseguito come "root", si sono verificati problemi intermittenti nell'esecuzione di nuovo del processo come mongod.
Un'opzione più semplice consiste nel modificare il file /etc/init.d/mongod. Cerca questa linea:
OPTIONS=" -f $CONFIGFILE"
Sostituisci con questa riga:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Passaggi dettagliati
Ai fini di questa discussione, forniamo istruzioni per CentOS/RedHat/Amazon Linux.
-
Configura “–noIndexBuildRetry”
Aggiungi l'opzione "–noIndexBuildRetry" a tutti i tuoi nodi di dati come spiegato sopra.
-
Riavvia tutti i nodi costruendo l'indice
Guarda il file di registro mongod per ogni server di dati e determina se sta costruendo l'indice. In tal caso, riavvia il server "service mongod restart".
-
Elimina l'indice incompleto
Una volta riavviati tutti i nodi rilevanti, guarda l'elenco degli indici e rilascia l'indice incompleto se lo vedi nell'elenco.
-
Rimuovi “–noIndexBuildRetry”
Modifica il file /etc/init.d/mongod per rimuovere l'opzione –noIndexBuildRetry aggiunta nel passaggio 1 in modo da poter ripristinare il comportamento predefinito di riprendere la compilazione dell'indice.
Per ulteriori domande, contattaci all'indirizzo [email protected].
Buona indicizzazione!