Indeksbuilds i MongoDB kan have en negativ indvirkning på tilgængeligheden af din MongoDB-klynge. Hvis du udløser et forgrundsindeksbuild på en stor samling på din produktionsserver, kan du opleve, at din klynge ikke reagerer, indtil indeksopbygningen er fuldført. På en stor samling kan dette tage flere timer eller dage, som beskrevet i farerne ved indeksopbygning i MongoDB.
Den anbefalede bedste praksis er at udløse indeksopbygninger i baggrunden, men på store samlingsindekser har vi set flere problemer med denne tilgang. I tilfælde af en klynge med tre knudepunkter begynder begge sekundærer at opbygge indekset og holder op med at svare på eventuelle anmodninger. Som følge heraf har den primære ikke quorum og flytter til den sekundære tilstand og tager din klynge ned. Standardindeksbygningerne, der udløses fra kommandolinjen, er også forgrundsindeksbygninger - hvilket gør dette til et nu udbredt problem. I fremtidige udgivelser håber vi, at dette bliver baggrund som standard.
Når du har udløst et indeks, løser det ikke vores problem blot at genstarte serveren; MongoDB fortsætter indeksbygningen, hvor den slap. Hvis du tidligere kørte en baggrundsindeksbuild efter genstarten, bliver den nu en forgrundsindeksbuild, så i dette tilfælde kan genstarten gøre problemet værre.
Hvis du allerede har udløst et indeksbyggeri, hvordan stopper du det så? Heldigvis er det relativt nemt at stoppe en indeksopbygning.
Mulighed 1:Afslut indeksopbygningsprocessen
Find indeksopbygningsprocessen ved hjælp af db.currentOp() og dræb derefter operationen ved hjælp af 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%" }
Hvis noden, hvor indekset opbygges, ikke reagerer på nye forbindelser, eller killOp ikke virker, skal du bruge mulighed 2 nedenfor:
Mulighed 2:Konfiguration af "noIndexBuildRetry" og genstart
MongoDB giver muligheden "–noIndexBuildRetry", som instruerer MongoDB om at stoppe med at bygge ufuldstændige indekser ved genstart.
Denne parameter ser ikke ud til at være understøttet fra konfigurationsfilen, kun som en parameter for mongod-processen. Vi foretrækker ikke at køre mongod manuelt med denne mulighed fordi hvis du ved et uheld kører mongod-processen som en forhøjet bruger (f.eks. root), ender det med at ændre tilladelserne for alle filerne. Når vi først har kørt som "root", har vi også haft periodiske problemer med at køre processen som mongod igen.
En enklere mulighed er at redigere filen /etc/init.d/mongod. Leder efter denne linje:
OPTIONS=" -f $CONFIGFILE"
Erstat med denne linje:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Detaljerede trin
Til formålet med denne diskussion giver vi instruktioner til CentOS/RedHat/Amazon Linux.
-
Konfigurer “–noIndexBuildRetry”
Tilføj "–noIndexBuildRetry"-indstillingen til alle dine dataknuder som forklaret ovenfor.
-
Genstart alle de noder, der bygger indekset
Se på mongod-logfilen for hver dataserver og afgør, om den opbygger indekset. Hvis det er, genstart serveren "service mongod restart".
-
Slet det ufuldstændige indeks
Når alle de relevante noder er genstartet, skal du se på listen over indekser og slippe det ufuldstændige indeks, hvis du ser det på listen.
-
Fjern “–noIndexBuildRetry”
Rediger filen /etc/init.d/mongod for at fjerne –noIndexBuildRetry-indstillingen, som du tilføjede i trin 1, så vi kan vende tilbage til standardadfærden for at genoptage indeksopbygningen.
For yderligere spørgsmål, kontakt os på [email protected].
God fornøjelse med indekseringen!