sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man stoppar ett runaway-indexbygge i MongoDB

Indexbyggen i MongoDB kan ha en negativ inverkan på tillgängligheten för ditt MongoDB-kluster. Om du startar ett förgrundsindexbygge på en stor samling på din produktionsserver kan du upptäcka att ditt kluster inte svarar tills indexbygget är klart. På en stor samling kan detta ta flera timmar eller dagar, som beskrivs i riskerna med att bygga upp index i MongoDB.

Rekommenderad bästa praxis är att utlösa indexbyggen i bakgrunden, men på stora samlingsindex har vi sett flera problem med detta tillvägagångssätt. I fallet med ett kluster med tre noder börjar båda sekundärerna bygga indexet och slutar svara på eventuella förfrågningar. Följaktligen har den primära inte quorum och flyttar till det sekundära tillståndet och tar ner ditt kluster. Dessutom är standardindexbyggen som utlöses från kommandoraden förgrundsindexbyggnader – vilket gör detta till ett nu utbrett problem. I framtida versioner hoppas vi att detta blir bakgrund som standard.

När du har triggat ett index, löser det inte vårt problem att bara starta om servern; MongoDB kommer att fortsätta indexbygget där det slutade. Om du körde ett bakgrundsindexbygge tidigare efter omstarten, blir det nu ett förgrundsindexbygge, så i det här fallet kan omstarten förvärra problemet.

Om du redan har utlöst ett indexbygge, hur stoppar du det? Lyckligtvis är det relativt enkelt att stoppa ett indexbygge.

Alternativ 1:Avsluta indexbyggeprocessen

Leta upp indexbyggeprocessen med db.currentOp() och döda sedan operationen med db.killOp(). Indexoperationen kommer att se ut ungefär så här:

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

Om noden där indexet byggs inte svarar på nya anslutningar, eller om killOp inte fungerar, använd alternativ 2 nedan:

Alternativ 2:Konfigurera "noIndexBuildRetry" och starta om

MongoDB tillhandahåller ett "–noIndexBuildRetry"-alternativ som instruerar MongoDB att sluta bygga ofullständiga index vid omstart.

Den här parametern verkar inte stödjas från konfigurationsfilen, bara som en parameter för mongod-processen. Vi föredrar inte att köra mongod manuellt med det här alternativet eftersom du av misstag kör mongod-processen som en förhöjd användare (t.ex. root), slutar det med att det ändrar behörigheterna för alla filer. När vi väl kört som "root" har vi också haft periodiska problem med att köra processen som mongod igen.

Ett enklare alternativ är att redigera filen /etc/init.d/mongod. Letar efter den här raden:

OPTIONS=" -f $CONFIGFILE"

Ersätt med denna rad:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Detaljerade steg

För denna diskussion tillhandahåller vi instruktioner för CentOS/RedHat/Amazon Linux.

  1. Konfigurera “–noIndexBuildRetry”

    Lägg till alternativet "–noIndexBuildRetry" till alla dina datanoder enligt beskrivningen ovan.

  2. Starta om alla noder som bygger indexet

    Titta på mongod-loggfilen för varje dataserver och avgör om den bygger indexet. Om så är fallet, starta om servern "service mongod restart".

  3. Släpp det ofullständiga indexet

    När alla relevanta noder har startat om, titta på listan med index och släpp det ofullständiga indexet om du ser det på listan.

  4. Ta bort “–noIndexBuildRetry”

    Redigera filen /etc/init.d/mongod för att ta bort alternativet –noIndexBuildRetry som du lade till i steg 1 så att vi kan återgå till standardbeteendet för att återuppta indexbygget.

För ytterligare frågor, kontakta oss på [email protected].

Lycka till med indexeringen!


  1. I Flask konvertera form POST-objekt till en representation lämplig för mongodb

  2. MongoDB $mod

  3. MongoDB $radiansToDegrees

  4. Varför rekommenderas det att inte stänga en MongoDB-anslutning någonstans i Node.js-koden?