sql >> Database >  >> NoSQL >> MongoDB

Hoe een Runaway Index te stoppen Build in MongoDB

Index-builds in MongoDB kunnen een negatieve invloed hebben op de beschikbaarheid van uw MongoDB-cluster. Als u een opbouw van een voorgrondindex activeert op een grote verzameling op uw productieserver, kan het zijn dat uw cluster niet reageert totdat de opbouw van de index is voltooid. Bij een grote verzameling kan dit enkele uren of dagen duren, zoals beschreven in de gevaren van indexopbouw in MongoDB.

De aanbevolen best practice is om indexopbouwen op de achtergrond te activeren, maar bij grote collectie-indexen hebben we meerdere problemen gezien met deze aanpak. In het geval van een cluster met drie knooppunten beginnen beide secondaries met het bouwen van de index en reageren ze niet meer op verzoeken. De primaire heeft daarom geen quorum en wordt verplaatst naar de secundaire status, waardoor uw cluster wordt uitgeschakeld. Ook zijn de standaard index-builds die vanaf de opdrachtregel worden geactiveerd, voorgrond-index-builds - waardoor dit een nu wijdverbreid probleem is. In toekomstige releases hopen we dat dit standaard de achtergrond wordt.

Als je eenmaal een index hebt geactiveerd, lost het simpelweg herstarten van de server ons probleem niet op; MongoDB gaat verder met de opbouw van de index waar het was gebleven. Als u eerder een achtergrondindexopbouw had uitgevoerd na de herstart, wordt deze nu een voorgrondindexopbouw, dus in dit geval kan de herstart het probleem verergeren.

Als u al een indexopbouw hebt geactiveerd, hoe stopt u deze dan? Gelukkig is het relatief eenvoudig om een ​​indexopbouw te stoppen.

Optie 1:Stop het indexopbouwproces

Zoek het indexopbouwproces met db.currentOp() en stop de bewerking vervolgens met db.killOp(). De indexbewerking ziet er ongeveer zo uit:

{
"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%"
}

Als het knooppunt waar de index aan het bouwen is niet reageert op nieuwe verbindingen, of de killOp niet werkt, gebruik dan optie 2 hieronder:

Optie 2:"noIndexBuildRetry" configureren en opnieuw opstarten

MongoDB biedt een “–noIndexBuildRetry” optie die MongoDB instrueert om te stoppen met het bouwen van onvolledige indexen bij het opnieuw opstarten.

Deze parameter lijkt niet te worden ondersteund vanuit het configuratiebestand, alleen als een parameter voor het mongod-proces. We geven er niet de voorkeur aan om mongod handmatig uit te voeren met deze optie, want als je per ongeluk het mongod-proces uitvoert als een verhoogde gebruiker (bijv. root), verandert dit uiteindelijk de rechten van alle bestanden. Ook, eenmaal uitgevoerd als "root", hebben we af en toe problemen gehad om het proces weer als mongod uit te voeren.

Een eenvoudigere optie is om het bestand /etc/init.d/mongod te bewerken. Zoekt naar deze regel:

OPTIONS=" -f $CONFIGFILE"

Vervang door deze regel:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Gedetailleerde stappen

Voor deze discussie geven we instructies voor CentOS/RedHat/Amazon Linux.

  1. Configureer “–noIndexBuildRetry”

    Voeg de optie “–noIndexBuildRetry” toe aan al uw gegevensknooppunten zoals hierboven uitgelegd.

  2. Herstart alle knooppunten die de index bouwen

    Bekijk het mongod-logbestand voor elke dataserver en bepaal of deze de index aan het bouwen is. Als dit het geval is, herstart dan de server "service mongod restart".

  3. Laat de onvolledige index vallen

    Zodra alle relevante knooppunten opnieuw zijn opgestart, bekijkt u de lijst met indexen en verwijdert u de onvolledige index als u deze in de lijst ziet staan.

  4. Verwijderen “–noIndexBuildRetry”

    Bewerk het bestand /etc/init.d/mongod om de optie –noIndexBuildRetry te verwijderen die u in stap 1 hebt toegevoegd, zodat we terug kunnen keren naar het standaardgedrag van het hervatten van de indexopbouw.

Neem voor verdere vragen contact met ons op via [email protected].

Veel plezier met indexeren!


  1. MongoDB-prestaties vergelijken op openbare clouds:AWS, Azure en DigitalOcean

  2. Basisoverwegingen voor het nemen van een MongoDB-back-up

  3. Unit testen met MongoDB

  4. Hoe een reeks hashes op te slaan in redis