Indexaufbauten in MongoDB können sich nachteilig auf die Verfügbarkeit Ihres MongoDB-Clusters auswirken. Wenn Sie eine Indexerstellung im Vordergrund für eine große Sammlung auf Ihrem Produktionsserver auslösen, stellen Sie möglicherweise fest, dass Ihr Cluster nicht mehr reagiert, bis die Indexerstellung abgeschlossen ist. Bei einer großen Sammlung kann dies mehrere Stunden oder Tage dauern, wie in den Gefahren der Indexerstellung in MongoDB beschrieben.
Die empfohlene Best Practice besteht darin, Indexaufbauten im Hintergrund auszulösen, bei großen Sammlungsindizes haben wir jedoch mehrere Probleme mit diesem Ansatz festgestellt. Im Fall eines Clusters mit drei Knoten beginnen beide sekundären Knoten mit der Indexerstellung und reagieren nicht mehr auf Anfragen. Folglich hat der primäre Cluster kein Quorum und wechselt in den sekundären Status, wodurch Ihr Cluster heruntergefahren wird. Außerdem sind die standardmäßigen Indexerstellungen, die von der Befehlszeile ausgelöst werden, Vordergrundindexerstellungen – was dies zu einem mittlerweile weit verbreiteten Problem macht. Wir hoffen, dass dies in zukünftigen Versionen standardmäßig zum Hintergrund wird.
Sobald Sie einen Index ausgelöst haben, löst ein einfacher Neustart des Servers unser Problem nicht; MongoDB setzt die Indexerstellung dort fort, wo sie aufgehört hat. Wenn Sie zuvor nach dem Neustart einen Indexaufbau im Hintergrund ausgeführt haben, wird dieser jetzt zu einem Indexaufbau im Vordergrund. In diesem Fall könnte der Neustart das Problem also verschlimmern.
Wenn Sie bereits einen Indexaufbau ausgelöst haben, wie stoppen Sie ihn? Glücklicherweise ist es relativ einfach, einen Indexaufbau zu stoppen.
Option 1:Beenden Sie den Indexerstellungsprozess
Suchen Sie den Indexerstellungsprozess mit db.currentOp() und beenden Sie dann die Operation mit 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%" }
Wenn der Knoten, auf dem der Index erstellt wird, nicht auf neue Verbindungen antwortet oder die KillOp nicht funktioniert, verwenden Sie Option 2 unten:
Option 2:„noIndexBuildRetry“ konfigurieren und neu starten
MongoDB bietet eine „–noIndexBuildRetry“-Option, die MongoDB anweist, beim Neustart keine unvollständigen Indizes mehr zu erstellen.
Dieser Parameter scheint von der Konfigurationsdatei nicht unterstützt zu werden, nur als Parameter für den Mongod-Prozess. Wir ziehen es nicht vor, mongod mit dieser Option manuell auszuführen, denn wenn Sie den mongod-Prozess versehentlich als Benutzer mit erhöhten Rechten (z. B. root) ausführen, ändert er am Ende die Berechtigungen aller Dateien. Außerdem hatten wir nach der Ausführung als „root“ zeitweise Probleme, den Prozess erneut als mongod auszuführen.
Eine einfachere Möglichkeit besteht darin, die Datei /etc/init.d/mongod zu bearbeiten. Sucht nach dieser Zeile:
OPTIONS=" -f $CONFIGFILE"
Ersetzen Sie durch diese Zeile:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Detaillierte Schritte
Für diese Diskussion stellen wir Anweisungen für CentOS/RedHat/Amazon Linux bereit.
-
Konfigurieren Sie „–noIndexBuildRetry“
Fügen Sie die Option „–noIndexBuildRetry“ wie oben beschrieben zu allen Ihren Datenknoten hinzu.
-
Starten Sie alle Knoten neu, die den Index erstellen
Sehen Sie sich die Mongod-Protokolldatei für jeden Datenserver an und stellen Sie fest, ob er den Index erstellt. Wenn dies der Fall ist, starten Sie den Server neu „service mongod restart“.
-
Löschen Sie den unvollständigen Index
Nachdem alle relevanten Knoten neu gestartet wurden, sehen Sie sich die Liste der Indizes an und löschen Sie den unvollständigen Index, wenn Sie ihn in der Liste sehen.
-
Entfernen Sie „–noIndexBuildRetry“
Bearbeiten Sie die Datei /etc/init.d/mongod, um die Option –noIndexBuildRetry zu entfernen, die Sie in Schritt 1 hinzugefügt haben, damit wir zum Standardverhalten zurückkehren können, bei dem die Indexerstellung fortgesetzt wird.
Bei weiteren Fragen wenden Sie sich bitte an [email protected].
Viel Spaß beim Indizieren!