Mongodump beeinflusst die App-Leistung sehr schlecht

8

Wir haben eine ziemlich große Mongo-Instanz (150 GB) ohne Sharding, und unser reguläres Backup ( mongodump) hat einen sehr signifikanten Einfluss auf die App-Leistung. Schlimmer noch, aufgrund der starken Nutzung von Mongo durch die App dauert das Backup mehr als 10 Stunden.

Ich weiß, dass wir Sharding brauchen, und wir haben Pläne, zu ElasticSearch zu wechseln. Deshalb suche ich nach einer kurzfristigen Lösung.

Kann ich etwas tun, um dies zu verbessern, z. B. die Anzahl der Abfragen pro Sekunde für Mongodump oder ähnliches begrenzen?

Wir haben einen eigenständigen Mongo auf einem 32-Kern-190-GB-RAM-Server, der ihn mit Nginx, Rabbitmq und einigen kleinen Dingen teilt. Nicht das sauberste Setup aller Zeiten, ich weiß :)

Alexander Mikhalchenko
quelle

Antworten:

16

Alle über ausgegebenen Daten mongodumpmüssen vom MongoDB-Server in den Speicher eingelesen werden. Es ist auch erwähnenswert, dass mongodumpDaten und Indexdefinitionen gesichert werden. Die Wiederherstellungszeit kann im Vergleich zu anderen Ansätzen auch erheblich länger sein, da mongorestorenach dem Laden der Daten alle Sekundärindizes neu erstellt werden müssen.

Wie in der MongoDB-Dokumentation erwähnt , mongodumpeignet es sich zum Sichern und Wiederherstellen kleiner Bereitstellungen, ist jedoch nicht ideal zum Erfassen vollständiger Sicherungen größerer Systeme:

Bei Verbindung mit einer MongoDB-Instanz kann Mongodump die Leistung von Mongod beeinträchtigen. Wenn Ihre Daten größer als der Systemspeicher sind, wird der Arbeitssatz durch die Abfragen aus dem Speicher verschoben, was zu Seitenfehlern führt.

Ein eigenständiger Server schränkt Ihre Sicherungsoptionen ein, wenn Sie Ihre Bereitstellung auch während der Sicherung verfügbar halten möchten.

Hier sind einige vorgeschlagene Ansätze in der Reihenfolge der meisten bis am wenigsten empfohlenen:

Ansatz 1: Verwenden Sie einen Cloud-Sicherungsdienst

Für die einfachste kurzfristige Lösung würde ich die Verwendung eines kommerziellen Cloud-Backup-Dienstes wie MongoDB Cloud Manager in Betracht ziehen . MongoDB Cloud Manager bietet eine kontinuierliche Sicherung mit geplanten Snapshots und einer Aufbewahrungsrichtlinie ( weitere Informationen finden Sie unter Sicherungsvorbereitungen ). Ein Cloud-Dienst vermeidet außerdem, dass Sie zusätzliche Server / Infrastrukturen bereitstellen müssen. Selbst wenn Sie dies in Zukunft planen, ist dies eine hilfreiche kurzfristige Lösung.

Der allgemeine Ansatz wäre:

Als zusätzlichen Vorteil enthält Cloud Manager auch einen Überwachungsagenten, mit dem der Metrikverlauf Ihrer Bereitstellung erfasst und Warnungen konfiguriert werden können.

Ansatz 2: Konvertieren Sie Ihre Bereitstellung in ein Replikatset und sichern Sie sie von einer versteckten sekundären Seite

Dieser Ansatz erfordert die Bereitstellung einer zusätzlichen Infrastruktur, entlastet jedoch die Auswirkungen der Sicherung von Ihrem Primärserver. In der Regel werden Replikatsätze mit mindestens drei Mitgliedern für hohe Verfügbarkeit und automatisches Failover bereitgestellt. Wenn Ihr einziges Ziel jedoch die Sicherung ist, können Sie eine weniger ideale Konfiguration mit zwei Servern verwenden.

Der allgemeine Ansatz wäre:

  • Stellen Sie einen zweiten Server bereit, der für die Sicherung verwendet wird
  • Konvertieren Sie Ihren eigenständigen Server in ein Replikatset .
  • Fügen Sie Ihren Sicherungsserver als versteckten sekundären Server mit einer Priorität von 0 (er wird niemals primär) und 0 Stimmen hinzu.
  • Verwenden Sie eine der unterstützten Sicherungsmethoden , um Sicherungen auf Ihrem versteckten sekundären Server durchzuführen. Die Sicherungsmethoden sind in der allgemeinen Reihenfolge der Empfehlungen aufgeführt: Dateisystem-Snapshots (sofern von Ihrer Konfiguration unterstützt) oder Dateikopien (vorausgesetzt, Sie stoppen mongod) sind vorzuziehen mongodump.
  • Fügen Sie (idealerweise) eine weitere datenführende Sekundärseite hinzu, wenn Sie die Hochverfügbarkeits- und Failover-Vorteile einer Replikatsatzkonfiguration nutzen möchten.

Ansatz 3: Verwenden Sie Dateisystem-Snapshots (falls verfügbar und angemessen).

Eine weniger effektive Sicherungsstrategie als Ihre derzeitige mongodumpwäre die Verwendung von Dateisystem-Snapshots , vorausgesetzt, Sie haben ein Dateisystem, das Snapshots unterstützt (und alle Ihre Daten- und Journaldateien befinden sich auf einem einzigen Volume, sodass Sie einen konsistenten Snapshot einer Ausführung erhalten können mongod). Der Vorteil von Dateisystem-Snapshots besteht darin, dass nicht alle Daten von in den Speicher eingelesen werden mongodmüssen. Snapshots können jedoch weiterhin Auswirkungen haben (insbesondere beim Erstellen des ersten Snapshots auf einem ausgelasteten System). Aufeinanderfolgende Snapshots sind effizienter und weniger wirkungsvoll, stellen jedoch keine vollständige Sicherungslösung dar, da die Snapshots lokal auf Ihrem Server sind (und Sie derzeit nur über einen Standalone verfügen).

Vorsichtsmaßnahmen

  • Die Ansätze Nr. 1 und Nr. 2 beinhalten beide das Aktivieren der Replikation, um Sicherungen zu erleichtern. Durch die Replikation werden einige zusätzliche lokale E / A auf Ihrem Primärserver hinzugefügt, da alle Schreibvorgänge in einer speziellen gekappten Sammlung namens oplog (Operationsprotokoll) vermerkt sind .

  • Sie haben einen wahrscheinlichen Bedarf an Sharding in der Zukunft erwähnt, aber vorher würde ich Ihre MongoDB-Workload von den anderen Prozessen isolieren, die denselben Server gemeinsam nutzen. Wenn Sie Ihre Sicherungsstrategie auf eine effizientere Strategie als ändern können mongodump, entfernen Sie Ressourcenkonflikte und erfassen Sie einen Basismetrikverlauf zur Überprüfung. Möglicherweise ist Sharding noch nicht erforderlich.

Stennie
quelle
3

Ich bin zu spät zur Party, habe aber erst kürzlich das gleiche Problem auf VMs mit relativ wenig RAM (4 GB RAM, 50 GB HD, 5 GB Daten) festgestellt. Unsere Problemumgehung besteht darin, die Option von mongodump zu verwenden --forceTableScanund, falls Sekundärdateien verwendet werden sollten, diese ebenfalls hinzuzufügen --readPreference secondary. Das hat unsere Müllkippe um den Faktor 10 auf 30 beschleunigt.

Kay
quelle