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
------------------------------------------------
MongoDB-Leitfaden
- MongoDB-Überblick: Einstieg mit MongoDB
- Wie man MongoDB auf Ubuntu und Mac installiert
- Erstellung einer Datenbank in MongoDB
- MongoDB Shell Grundbefehle
- MongoDB Compass: Nutzung der Mongo GUI
- MongoDB rollenbasierte Zugriffskontrolle (RBAC) erklärt
- MongoDB-Projektion und Projektionsoperatoren erklärt
- MongoDB-Aggregatfunktionen erklärt
- MongoDB-Sortierung: sort()-Methode & Beispiele
- Verwendung von Push-and-Pull-Operatoren in MongoDB
- Wie man MongoDB $unwind
- 23 Gängige MongoDB-Abfrageoperatoren und deren Verwendung
- MongoDB GeoLocation-Abfragebeispiele
- Einführung in MongoDB-Transaktionen
- MongoDB-Indizes: Top-Indextypen und deren Verwaltung
- Die wichtigsten MongoDB-Befehle, die du kennen solltest
- MongoDB-Replikation: Eine vollständige Einführung
- Wie man einen MongoDB-Cluster einrichtet
- MongoDB Sharding: Konzepte, Beispiele & Tutorials
- MongoDB Atlas: Einrichtung und Nutzung von verwaltetem MongoDB
- Wie man MongoDB als Docker-Container ausführt
- MongoDB-Speichernutzung, Verwaltung und Anforderungen
- Wie man Mongodump für MongoDB-Backups verwendet
- Mongorestore-Beispiele zur Wiederherstellung von MongoDB-Backups
- Wie man PyMongo benutzt
- Wie man Mongoose für MongoDB und NodeJS verwendet
- MongoDB Spickzettel
- MongoDB vs Cassandra: NoSQL-Datenbanken im Vergleich
- PostgreSQL vs MongoDB: Vergleich von Datenbanken
- MySQL vs. MongoDB: Vergleich von Datenbanken
- MongoDB-Zertifizierungen: Eine Einführung
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.