sql >> Databáze >  >> NoSQL >> MongoDB

Jak zastavit sestavení Runaway Index v MongoDB

Sestavení indexu v MongoDB může mít nepříznivý dopad na dostupnost vašeho clusteru MongoDB. Pokud spustíte sestavení indexu v popředí na velké kolekci na produkčním serveru, můžete zjistit, že váš klastr přestane reagovat, dokud nebude sestavení indexu dokončeno. U velké sbírky to může trvat několik hodin nebo dní, jak je popsáno v nebezpečí vytváření indexu v MongoDB.

Doporučeným osvědčeným postupem je spouštět sestavení indexu na pozadí, avšak u velkých indexů kolekcí jsme s tímto přístupem zaznamenali několik problémů. V případě clusteru se třemi uzly začnou oba sekundární servery vytvářet index a přestanou reagovat na jakékoli požadavky. Primární tedy nemá kvorum a přesune se do sekundárního stavu, čímž se váš cluster vypne. Také výchozí sestavení indexu spouštěné z příkazového řádku jsou sestavení indexu v popředí – což z toho dělá nyní rozšířený problém. V budoucích verzích doufáme, že se to stane pozadím jako výchozí.

Jakmile spustíte index, pouhé restartování serveru náš problém nevyřeší; MongoDB naváže sestavení indexu od místa, kde skončilo. Pokud jste dříve po restartu spouštěli sestavení indexu na pozadí, nyní se z něj stane sestavení indexu v popředí, takže v tomto případě by restartování mohlo problém zhoršit.

Pokud jste již spustili sestavení indexu, jak jej zastavíte? Naštěstí je relativně snadné zastavit vytváření indexu.

Možnost 1:Ukončete proces vytváření indexu

Vyhledejte proces sestavení indexu pomocí db.currentOp() a poté operaci ukončete pomocí db.killOp(). Operace indexu bude vypadat nějak takto:

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

Pokud uzel, ve kterém se vytváří index, nereaguje na nová připojení nebo funkce killOp nefunguje, použijte níže uvedenou možnost 2:

Možnost 2:Konfigurace „noIndexBuildRetry“ a restartování

MongoDB poskytuje možnost „–noIndexBuildRetry“, která dává MongoDB pokyn, aby při restartu zastavil vytváření neúplných indexů.

Zdá se, že tento parametr není podporován z konfiguračního souboru, pouze jako parametr pro proces mongod. U této možnosti nechceme spouštět mongod ručně, protože pokud omylem spustíte proces mongod jako uživatel se zvýšenými oprávněními (např. root), změní se oprávnění všech souborů. Po spuštění jako „root“ jsme také měli občasné problémy se spuštěním procesu jako mongod znovu.

Jednodušší možností je upravit soubor /etc/init.d/mongod. Hledá tento řádek:

OPTIONS=" -f $CONFIGFILE"

Nahraďte tímto řádkem:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Podrobné kroky

Pro účely této diskuse poskytujeme pokyny pro CentOS/RedHat/Amazon Linux.

  1. Nakonfigurujte „–noIndexBuildRetry“

    Přidejte možnost „–noIndexBuildRetry“ ke všem datovým uzlům, jak je vysvětleno výše.

  2. Restartujte všechny uzly vytvářející index

    Podívejte se na soubor protokolu mongod pro každý datový server a zjistěte, zda vytváří index. Pokud ano, restartujte server „service mongod restart“.

  3. Zrušte neúplný index

    Jakmile budou všechny relevantní uzly restartovány, podívejte se na seznam indexů a vypusťte neúplný index, pokud jej v seznamu vidíte.

  4. Odstraňte „–noIndexBuildRetry“

    Upravte soubor /etc/init.d/mongod a odeberte možnost –noIndexBuildRetry, kterou jste přidali v kroku 1, abychom se mohli vrátit zpět k výchozímu chování obnovení vytváření indexu.

Máte-li jakékoli další dotazy, kontaktujte nás na adrese [email protected].

Šťastné indexování!


  1. MongoDB $atan

  2. Redis benchmarking pro příkazy hget a hset

  3. Mongoose - Uložit pole řetězců

  4. Je toto platné použití ServiceStack Redis?