So überwachen Sie die Leistung der MongoDB-Datenbank

Rick Golba ist Lösungsingenieur bei Percona.

MongoDB ist eine beliebte Datenbank für Entwickler. Als NoSQL-Datenbankoption bietet es Entwicklern eine Datenbankumgebung mit flexiblem Schemadesign, automatisiertem Failover und einer dem Entwickler vertrauten Eingabesprache, nämlich JSON.

Es gibt viele verschiedene Arten von NoSQL-Datenbanken. Schlüsselwertspeicher speichern und rufen jedes Element unter seinem Namen ab (auch als Schlüssel bezeichnet). Breite Spaltenspeicher sind eine Art Schlüsselwertspeicher, der Spalten und Zeilen verwendet (ähnlich wie bei einer relationalen Datenbank). Nur die Namen der Spalten und Zeilen in einer Tabelle können variieren. Diagrammdatenbanken verwenden Diagrammstrukturen zum Speichern von Datennetzen. Dokumentorientierte Datenbanken speichern Daten als Dokumente und bieten so mehr strukturelle Flexibilität als andere Datenbanken.

MongoDB ist eine dokumentenorientierte Datenbank. Es handelt sich um eine plattformübergreifende Datenbank, die Daten in Dokumenten in einem binär codierten JSON-Format (als binäres JSON oder BSON bezeichnet) enthält. Das Binärformat erhöht sowohl die Geschwindigkeit als auch die Flexibilität von JSON und fügt weitere Datentypen hinzu.

Die Replikationsmechanismen von MongoDB sorgen für eine hohe Verfügbarkeit, und der Sharding-Mechanismus ermöglicht eine horizontale Skalierbarkeit. Viele Top-Internetunternehmen wie Facebook und eBay verwenden MongoDB in ihrer Datenbankumgebung.

Warum MongoDB überwachen?

Ihre MongoDB-Datenbankumgebung kann einfach oder kompliziert, lokal oder verteilt, lokal oder in der Cloud sein. Wenn Sie eine leistungsfähige und verfügbare Datenbank sicherstellen möchten, sollten Sie Analysen verfolgen und überwachen, um:

  • Bestimmen Sie den aktuellen Status der Datenbank
  • Überprüfen Sie die Leistungsdaten, um ungewöhnliches Verhalten festzustellen
  • Geben Sie einige Diagnosedaten an, um festgestellte Probleme zu beheben
  • Beheben Sie kleine Probleme, bevor sie zu größeren Problemen werden
  • Sorgen Sie dafür, dass Ihre Umgebung reibungslos funktioniert
  • Stellen Sie die ständige Verfügbarkeit und den Erfolg sicher

Durch die messbare und regelmäßige Überwachung Ihrer Datenbankumgebung wird sichergestellt, dass Sie Unstimmigkeiten, ungewöhnliches Verhalten oder Probleme erkennen können, bevor sie sich auf die Leistung auswirken. Durch eine ordnungsgemäße Überwachung können Sie Verzögerungen, Ressourcenbeschränkungen oder anderes abweichendes Verhalten schnell erkennen und diese Probleme beheben, bevor Sie von den Folgen langsamer Websites und Anwendungen, nicht verfügbarer Daten oder frustrierter Kunden betroffen sind.

Was sollen wir überwachen?

Es gibt viele Dinge, die Sie in einer MongoDB-Umgebung überwachen können, aber einige Schlüsselbereiche werden Sie schnell darauf hinweisen, wenn etwas nicht stimmt. Sie sollten die folgenden Metriken analysieren:

  • Replikationsverzögerung . Replikationsverzögerung bezieht sich auf Verzögerungen beim Kopieren von Daten vom Primärknoten auf einen Sekundärknoten.
  • Replikatstatus . Der Replikatstatus ist eine Methode zum Verfolgen, ob sekundäre Knoten gestorben sind und ob ein neuer primärer Knoten ausgewählt wurde.
  • Sperrzustand . Der Sperrstatus zeigt an, welche Datensperren gesetzt sind und wie lange sie vorhanden waren.
  • Festplattenauslastung . Die Datenträgerauslastung bezieht sich auf den Datenträgerzugriff.
  • Speichernutzung . Die Speichernutzung bezieht sich darauf, wie viel Speicher verwendet wird und wie er verwendet wird.
  • Anzahl der Verbindungen . Die Anzahl der Verbindungen, die die Datenbank geöffnet hat, um Anforderungen so schnell wie möglich zu bearbeiten.

Lassen Sie uns einige Details untersuchen.

Replikationsverzögerung

MongoDB verwendet die Replikation, um Verfügbarkeitsherausforderungen und -ziele zu erfüllen. Replikation ist die Weitergabe von Daten von einem Primärknoten an mehrere Sekundärknoten, da Operationen auf dem Primärknoten die Daten ändern. Diese Knoten können sich nebeneinander, an verschiedenen geografischen Standorten oder virtuell befinden.

Wenn alle Dinge gleich sind, sollte die Datenreplikation schnell und ohne Probleme erfolgen. Es können viele Dinge passieren, die den reibungslosen Ablauf des Replikationsprozesses verhindern. Selbst unter den besten Bedingungen begrenzen die physikalischen Eigenschaften des Netzwerks, wie schnell Daten repliziert werden. Die Verzögerung zwischen dem Starten der Replikation und dem Abschluss der Replikation wird als Replikationsverzögerung bezeichnet.

In einem reibungslos laufenden Satz von Primär- und Sekundärknoten (als „Replikatsatz“ bezeichnet) kopieren die Sekundärknoten Änderungen schnell auf den Primärknoten und replizieren jede Gruppe von Vorgängen so schnell wie möglich (oder so nah wie möglich) aus dem Oplog. . Ziel ist es, die Replikationsverzögerung nahe Null zu halten. Daten, die von einem beliebigen Knoten gelesen werden, sollten konsistent sein. Wenn der ausgewählte primäre Knoten ausfällt oder anderweitig nicht mehr verfügbar ist, kann ein sekundärer Knoten die primäre Rolle übernehmen, ohne die Genauigkeit der Daten für Clients zu beeinträchtigen. Die replizierten Daten sollten mit den Primärdaten übereinstimmen, bevor die Primärdaten ausfallen.

Replikationsverzögerung ist der Grund dafür, dass primäre und sekundäre Knoten nicht mehr synchron sind. Wenn ein sekundärer Knoten zum primären Knoten gewählt wird und die Replikationsverzögerung hoch ist, ist die Version der sekundären Daten möglicherweise veraltet. Ein Zustand erhöhter Replikationsverzögerung kann aus mehreren nicht permanenten oder undefinierten Gründen auftreten und sich selbst korrigieren. Wenn jedoch die Replikationsverzögerung hoch bleibt oder regelmäßig zunimmt, ist dies ein Zeichen für ein System- oder Umweltproblem. In beiden Fällen besteht das Risiko, dass Ihre Daten für Clients veraltet sind, je größer die Replikationsverzögerung ist und je länger sie hoch bleibt.

Es gibt nur einen Weg, diese Metrik zu analysieren: Überwachen Sie sie! Dies ist eine Metrik, die rund um die Uhr und 365 Tage die Woche überwacht werden sollte. Verwenden Sie daher am besten Automatisierungs- und Auslösewarnungen, um Datenbankadministratoren oder Administratoren von Antwortsystemen zu benachrichtigen, sobald sie einen unerwünschten Schwellenwert erreichen. Die Konfiguration für diesen Schwellenwert hängt von der Toleranz Ihrer Anwendung für Replikationsverzögerungen ab. Verwenden Sie ein Tool, das die zeitliche Verzögerung grafisch darstellt, z. B. Compass, MongoBooster, Studio 3T oder Percona Monitoring and Management (PMM), um den richtigen Schwellenwert zu ermitteln.

Replikatstatus

Die Replikation erfolgt über Replikatsätze. Ein Replikatsatz ist ein Satz von Knoten mit einem ausgewählten Primärknoten und mehreren Sekundärknoten. Der Primärknoten ist der Verwalter der aktuellsten Daten, und diese Daten werden auf die Sekundärdaten repliziert, wenn Änderungen am Primärknoten vorgenommen werden.

Normalerweise ist ein Mitglied eines Replikatsatzes primär und alle anderen Mitglieder sind sekundär. Der zugewiesene Status ändert sich selten. Wenn ja, wollen wir es wissen (normalerweise sofort). Der Rollenwechsel erfolgt normalerweise schnell und normalerweise nahtlos. Es ist jedoch wichtig zu verstehen, warum sich der Knotenstatus geändert hat, da dies möglicherweise auf einen Hardware- oder Netzwerkfehler zurückzuführen ist. Das Wechseln zwischen dem Primär- und dem Sekundärzustand (auch als Flattern bezeichnet) ist kein normales Ereignis und sollte in einer perfekten Welt nur aus bekannten Gründen erfolgen (z. B. während der Wartung der Umgebung wie dem Aktualisieren von Software oder Hardware oder während eines bestimmten Vorfalls wie z als Netzwerkausfall).

Sperrzustand

Datenbanken sind sehr gleichzeitige und volatile Umgebungen, in denen mehrere Clients Anforderungen stellen und Transaktionen initiieren, die für die Daten ausgeführt werden. Diese Anforderungen und Transaktionen erfolgen nicht nacheinander oder in einer rationalen Reihenfolge. Konflikte können auftreten - zum Beispiel, wenn Transaktionen versuchen, denselben Datensatz oder dasselbe Dokument zu aktualisieren, wenn während einer Aktualisierung von Daten eine Leseanforderung eingeht usw. Die Art und Weise, wie viele Datenbanken damit umgehen, sicherzustellen, dass auf Daten auf organisierte Weise zugegriffen wird, ist „Sperren“. ” Das Sperren tritt auf, wenn eine Transaktion verhindert, dass ein Datenbankeintrag, ein Dokument, eine Zeile, eine Tabelle usw. geändert oder gelesen wird, bis die aktuelle Transaktion verarbeitet ist.

In MongoDB wird das Sperren auf Erfassungs- oder Dokumentebene durchgeführt, um Konflikte zwischen gleichzeitigen Transaktionen zu vermeiden. Bestimmte Vorgänge können auch eine globale Datenbanksperre erfordern (z. B. beim Löschen einer Sammlung). Wenn das Sperren zu häufig auftritt, wirkt sich dies auf die Leistung aus, indem Transaktionen (einschließlich Lesevorgänge) darauf warten, dass gesperrte Teile der Datenbank zum Lesen oder Ändern verfügbar werden. Ein hoher Prozentsatz an Sperren ist ein Zeichen für andere Probleme in der Datenbank: Hardwarefehler, schlechtes Schemadesign, schlecht konfigurierte Indizes, keine Verwendung von Indizes usw.

Es ist wichtig, den Sperrprozentsatz zu überwachen. Sie sollten wissen, was ein akzeptabler Prozentsatz in Bezug auf die Leistung ist und wie lange der Prozentsatz beibehalten werden kann, bevor die Leistung beeinträchtigt wird. Wenn sich die Leistung aufgrund eines hohen Sperrprozentsatzes zu stark verschlechtert, kann dies zu einer Änderung des Replikationsstatus führen, da der Server nicht mehr reagiert.

Festplattenauslastung

Jeder DBA sollte den verfügbaren Speicherplatz auf seinen Datenbankservern überwachen. Sobald eine Datenbank den Speicherplatz auf dem Host belegt, kommt dieser Server abrupt zum Stillstand. Die proaktive Größenanpassung von Daten und die Überwachung der Größe von Protokolldateien sind hervorragende Techniken für die Datenbankgröße.

Oft muss Ihre Datenbank automatisch wachsen. In diesen Fällen müssen Sie sicherstellen, dass die Hardware nicht herauswächst. Eine regelmäßige Überprüfung des Speicherplatzes kann dazu beitragen, unerwartete Stopps des Datenbankservers zu verhindern und schlechte Entwurfsprobleme zu lokalisieren (z. B. Abfragen, die einen vollständigen Sammlungsscan erfordern).

Speichernutzung

Wenn Sie alle Ihre Daten im RAM behalten, werden die Antwortzeiten der Datenbank verkürzt. Aber was bedeutet das und woher wissen Sie, wann sich etwas im RAM befindet?

Die Art und Weise, wie Ihre Datenbank Speicher verwendet, kann etwas unklar sein. Ein Großteil des von einem Server verwendeten Speichers wird für den Pufferpool (Daten) verwendet. Es kann schwierig sein herauszufinden, welche Datenbank den größten Teil des Pufferpoolspeichers verwendet, und noch schwieriger herauszufinden, welche Sammlungen oder Dokumente sich tatsächlich im Pufferpoolspeicher befinden. Die Kenntnis dieser Informationen ist hilfreich, wenn Sie Ihre Datenbank auf mehrere Server verteilen (über Sharding) oder Daten identifizieren, die für die Konsolidierung in einer Serverinstanz optimal sind.

Mithilfe von Tools, mit denen ermittelt werden kann, welche Instanzen am meisten Speicher für welche Daten verwenden, können Sie Ihre Umgebung optimieren.

Anzahl der Verbindungen

Datenbanktransaktionen werden normalerweise von Anwendungen und Prozessen über „Verbindungen“ initiiert. Die Anzahl der offenen Verbindungen kann sich auf die Leistung der Datenbank auswirken. Theoretisch sollte die Verbindung nach Abschluss einer Transaktion beendet werden. In der Praxis bleiben jedoch viele Verbindungen offen. Es ist normal, dass eine Datenbank einige Verbindungen am Leben erhält, um bestimmte Transaktionen zu erleichtern. Wenn jedoch zu viele offen bleiben, kann dies die Anzahl der im Verbindungspool verfügbaren Verbindungen begrenzen.

Als bewährte Methode sollte eine Datenbank die Verbindungen so lange wie möglich offen halten, um eine Anforderung abzuschließen. Auf diese Weise kann ein kleiner Pool von Verbindungen eine große Anzahl von Transaktionsanforderungen bearbeiten. Andernfalls bleiben Anwendungstransaktionsanforderungen hängen und warten auf eine offene Verbindung. Sie müssen die Anzahl der offenen Verbindungen in der Datenbank überwachen, um sicherzustellen, dass sie geschlossen werden und dass im Pool noch eine gesunde Anzahl von Verbindungen für eingehende Anforderungen vorhanden ist.

Mit MongoDB gelieferte Tools

Jetzt, da wir wissen, was wir überwachen sollen, ist die nächste Frage, wie? Glücklicherweise enthält MongoDB einige benutzerfreundliche Tools zur Überwachung von Serverstatistiken.

mongostat

Dieses Dienstprogramm bietet globale Statistiken zur Speichernutzung, zum Status des Replikatsatzes und mehr, die jede Sekunde aktualisiert werden (standardmäßig).

Das mongostatDienstprogramm gibt Ihnen einen Überblick über Ihre MongoDB-Serverinstanz. Wenn Sie eine einzelne "mongod" -Instanz ausführen, werden Ihnen die Statistiken für diese einzelne Instanz angezeigt. Wenn Sie eine MongoDB-Clusterumgebung ausführen, werden die Statistiken für die "mongos" -Instanz zurückgegeben. mongostatwird am besten verwendet, um eine einzelne Instanz für ein bestimmtes Ereignis zu überwachen (z. B. was passiert, wenn eine bestimmte Anwendungsanforderung eingeht). Mit diesem Befehl können Sie grundlegende Serverstatistiken überwachen:

  • Zentralprozessor
  • Erinnerung
  • Festplatten-E / A.
  • Netzwerktraffic

Einzelheiten mongostatzur Verwendung finden Sie in der MongoDB-Dokumentation zu .

mongotop

Dieses Dienstprogramm bietet Statistiken auf Leseebene zu Lese- und Schreibaktivitäten.

Der mongotopBefehl verfolgt die Zeit, die erforderlich ist, um Lese- und Schreibvorgänge auf einer MongoDB-Serverinstanz abzuschließen. Es bietet Statistiken auf Sammlungsebene. mongotopGibt standardmäßig jede Sekunde Werte zurück, aber Sie können den Zeitrahmen nach Bedarf anpassen.

Alle Metriken pro Sekunde beziehen sich auf die Konfiguration Ihres Servers sowie auf die Clusterarchitektur. Für einzelne Instanzen, die lokal ausgeführt werden und den Standardport verwenden, müssen Sie lediglich den mongotopBefehl eingeben . Wenn Sie in einer Clusterumgebung mit mehreren Mongod- und Mongos-Instanzen ausgeführt werden, müssen Sie mit dem Befehl einen Hostnamen und eine Portnummer angeben.

Einzelheiten mongotopzur Verwendung finden Sie in der MongoDB-Dokumentation zu .

rs.status()

Dieser Befehl gibt den Status des Replikatsatzes an.

Mit dem rs.status()Befehl können Sie Informationen zu einem laufenden Replikatsatz abrufen. Dieser Befehl kann von der Konsole eines beliebigen Mitglieds eines beliebigen Satzes ausgeführt werden und gibt den Status des Replikatsatzes zurück, der für das betreffende Mitglied angezeigt wird.

Einzelheiten rs.status()zur Verwendung finden Sie in der MongoDB-Dokumentation zu .