MongoDB-Speichernutzung, Verwaltung und Anforderungen

MongoDB-Speichernutzung, Verwaltung und Anforderungen

  • ITOps & DevOps
6 Minuten Lesezeit Aktualisiert Feb 27, 2019

Auf einen Blick: Das Speichermanagement von MongoDB ist entscheidend, um Serverausfälle durch Datenüberlastung zu verhindern. Es bietet Strategien zur Überwachung des Speicherverbrauchs und Richtlinien zur Skalierung durch das Hinzufügen von Knoten, wenn nötig.

  • MongoDB verwendet Caching für schnellen Datenabruf, nicht als In-Memory-Datenbank.
  • Kostenlose Überwachungsdienste helfen dabei, den Speicherverbrauch und die Serverleistung zu verfolgen.

Wenn Sie zu viele Daten in Ihre MongoDB-Datenbank legen, geht Ihr Server ohne Speicher.  Das kann er auch schnell tun, so schnell, dass Sie den Mongo-Datenbankprozess nicht einmal abschalten können, da die Bash-Shell nicht mehr reagiert. Die Lösung dafür ist, einen weiteren Knoten zu Ihrem Cluster hinzuzufügen. Wir zeigen, wie ein Server aussieht, wenn ihm der Speicher ausgeht, indem wir absichtlich mehr Daten auf eine 8-GB-Maschine legen, als sie unterstützen kann, und dann Abfragen darauf ausführen.   Dann zeigen wir, wie die Logs aussehen und welche Tools Sie zur Überwachung dieser Situation verwenden können. Mit 215 MB Daten verbrauchte dieser Server konstant 11 % Speicher, wenn er mehrere Suchanfragen durchführte.  Dann fügten wir 3,5 GB Daten hinzu, woraufhin er bei 92 % Speicherauslastung blockierte.

Wenn MongoDB keinen Speicher mehr hat, fügen Sie einen weiteren Knoten hinzu

MongoDB ist keine In-Memory-Datenbank.  Obwohl es so konfiguriert werden kann.  Aber es nutzt großzügig Cache, das heißt, Datensätze werden für schnellen Abruf gespeichert, im Gegensatz zu Festplatten. Auf StackOverflow gibt es viele schlechte Informationen darüber, was zu tun ist, wenn dein Server keinen Speicher mehr hat.  Zusammengefasst verbraucht der Mongod-Prozess immer mehr Speicher, je voller Cache der Cache ist.  Daher haben viele überlegt, dass man, wenn der Computer Speicher ausgeht, den für MongoDB bereitgestellten Speicher begrenzen sollte.  Aber es gibt keine solche Einstellung. MongoDB verwendet in seiner Standardkonfiguration entweder 256 MB oder 1/2 MB (RAM - 1 GB) für seine Cache-Größe. Man kann die Cache-Größe von MongoDB begrenzen, indem man das Argument cacheSizeGB zur /etc/mongod.conf-Konfigurationsdatei einfügt, wie unten gezeigt.  Aber MongoDB verwendet sowohl seinen internen Cache als auch den Dateisystemcache des Systems.  Wenn man ihn also an einer Stelle einschränkt, verbraucht er mehr an der anderen Stelle.  Das ist also keine Lösung.

    storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  wiredTiger:
      engineConfig:
         cacheSizeGB: 1

Kostenloser Überwachungsdienst von MongoDB

Du solltest den kostenlosen Überwachungsdienst von MongoDB nutzen. Dieser wird auf deren Webseite gehostet, aber das bedeutet nicht, dass du ihren Cloud-Dienst (Atlas) nutzen musst. Er funktioniert mit deinen eigenen Servern. Um das zu nutzen, öffne die Mongo-Shell und füge dann diesen Befehl ein:

    db.enableFreeMonitoring()

Ein Teil ihrer Webseite sieht so aus.  Man sieht, dass auf diesem 8GB-Rechner kein Speicher mehr ist. Dadurch sendet MongoDB Nutzungsstatistiken an ihre Website, wo sie diesen Status verfolgen und auf einer Webseite für dich hosten.  Sie geben dir eine URL, um deine Seite zu verfolgen.  Das ist eine persistente URL, da sie deiner Installation eine eindeutige ID zuweisen.

Nutzung von Display Memory MongoDB

Diese Kennzahlen umfassen CPU-Auslastung usw. Oben  zeige ich nur den Speicherabschnitt. Das heißt:

  • resident – die Menge des tatsächlichen physischen Speichers (RAM), die von einem Prozess verwendet wird.
  • virtuell – RAM plus Speicher, der auf den Dateisystem-Cache ausgeweitet wurde, also virtuellen Speicher.
  • mapped—MongoDB führt seit Version 3.2 keine Speicherzuordnung von Dateien mehr durch. Das wurde vom vorherigen Speicherverwaltungsmodul namens MMAPv1 verwendet. Jetzt verwendet es standardmäßig WiredTiger.

Um den Dateisystem-Cache zu überprüfen, laufen Sie frei -k , um verfügbaren virtuellen Speicher in Kilobyte anzuzeigen.  Unten sehen Sie, wie mein Server in 5-Minuten-Intervallen aussah, als ich den Speicher ausgeschaltet habe.   Die zu beachten Spalte ist verfügbar.  Teilen Sie die angezeigte Zahl durch 1024*1024, um diese Zahl in Gigabyte umzuwandeln.

    free -k


             total        used        free      shared  buff/cache   available
Mem:        8173744     1088440     6753392        9052      331912     6816176
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        8173744     4654600     2663432        9080      855712     3249520
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        8173744     7992568      119508        9052       61668       45682

Natürlich kann man auch top-p (mongod pid) verwenden, um den Speicher zu überwachen.  VIRT und RES sind virtueller und residenter Speicher.  Unten sieht man, dass Mongod in diesem Beispiel 91 % des Systemspeichers nutzt.  Ab diesem Punkt reagierte das System nicht mehr.

Du kannst auch Speichernutzungsstatistiken von MongoDB in der Shell abrufen:

    db.serverStatus().mem
{
	"bits" : 64,
	"resident" : 907,
	"virtual" : 1897,
	"supported" : true,
	"mapped" : 0,
	"mappedWithJournal" : 0
}

Wenn du überhaupt C- oder C++-Programmierung gemacht hast, bist du mit Malloc vertraut. Das ist die Systemfunktion, die du aufrufst,  wenn du Speicher für deinen Rechner reservieren musst.  Wenn MongoDB das nicht mehr kann, erscheinen diese Warnungen in /var/log/mongodb/mongod.log:

    2019-02-19T03:44:18.738+0000 I COMMAND  [ftdc] serverStatus was very slow: { after basic: 202, after asserts: 686, after backgroundFlushing: 890, after connections: 1399, after dur: 1717, after extra_info: 2039, after freeMonitoring: 3003, after globalLock: 3389, after locks: 4073, after logicalSessionRecordCache: 4782, after network: 5520, after opLatencies: 6068, after opcounters: 6477, after opcountersRepl: 6818, after repl: 7441, after security: 7799, after storageEngine: 8616, after tcmalloc: 9676, after transactions: 10081, after transportSecurity: 10412, after wiredTiger: 22733, at end: 24170 }

Bis schließlich steht:

    2019-02-19T03:45:17.456+0000 F -        [free_mon] out of memory.

Du kannst dich auch bei Mongo anmelden und die beiden untenstehenden Befehle wiederholen (du musst beide ausführen, um die Ausgabe zu aktualisieren), um zu beobachten, wie dein Speicherverbrauch stark ansteigt, wenn dein Server abfällt.

    var mem = db.serverStatus().tcmalloc;

mem.tcmalloc.formattedString

Hier ist die Ausgabe. Wie du siehst,  ist der gesamte verfügbare Speicher auf diesem 8-GB-Rechner erschöpft. Du kannst dich auch bei Mongo anmelden und die beiden untenstehenden Befehle wiederholen (du musst beide ausführen, um den Ausgang zu aktualisieren), um zu beobachten, wie dein Speicherverbrauch stark ansteigt, wenn dein Server abfällt.

    ------------------------------------------------
MALLOC:       73048776 (   69.7 MiB) Bytes in use by application
MALLOC: +      3792896 (    3.6 MiB) Bytes in page heap freelist
MALLOC: +       508776 (    0.5 MiB) Bytes in central cache freelist
MALLOC: +       978848 (    0.9 MiB) Bytes in transfer cache freelist
MALLOC: +      1399344 (    1.3 MiB) Bytes in thread cache freelists
MALLOC: +      1335552 (    1.3 MiB) Bytes in malloc metadata
MALLOC:   ------------
MALLOC: =     81064192 (   77.3 MiB) Actual memory used (physical + swap)
MALLOC: +            0 (    0.0 MiB) Bytes released to OS (aka unmapped)
MALLOC:   ------------
MALLOC: =     81064192 (   77.3 MiB) Virtual address space used
MALLOC:
MALLOC:            816              Spans in use
MALLOC:             21              Thread heaps in use
MALLOC:           4096              Tcmalloc page size
------------------------------------------------

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus ITOps & DevOps

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.