MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

Tutorial: Größe des Oplog ändern

Marc-David Militz
Expert
Das Oplog wird in einem MongoDB Replica Set genutzt um die Daten auf allen Nodes zu replizieren. Die Größe des Oplogs, in Verbindung mit der Menge der Insert und Update Befehle, legen ein Zeitfenster fest in dem eine zeitversetze Replikation möglich ist. Da das Oplog eine Collection mit einer festen Größe ist, kann es bei steigender Anzahl der Schreiboperationen notwendig werden das Oplog zu vergrößern.

Da es sich um eine "Capped Collection" handelt ist dies aber nicht, so ohne weiteres, möglich. Das Oplog muß auf jedem einzelnen Member des Replica Sets neu, mit der neuen Größe, erzeugt werden. Hier nun ein kurzer Überblich über die dafür notwendigen Schritte.

MongoDB bietet zwei Befehle, mit denen man sich über den aktuellen Zustand des Oplogs informieren kann. Beide Befehle erzeugen die gleiche Ausgabe.
db.getReplicationInfo()
rs.printReplicationInfo()


Alle folgenden Schritte sollten immer nur auf einen Replica-Set-Member auf einmal angewendet werden um die Verfügbarkeit des Replica-Sets nicht zu beeinträchtigen.

  • Einen Member herunter fahren (z.B. auf der MongoDB Shell)

    • use admin
      db.shutdownServer()
      exit


      • Den Member als Standalone Instanz, temporär neu starten. Dazu ist es am einfachsten die Config-Parameter manuell bei Start zu setzen

        • z.B: unter Linux
          mongod --port 37018 --dbpath /srv/replset-1

          z.B. unter Windows
          start "mongoDB ReplSet Node 1" /MIN C:\MongoDB\Server\3.4\bin\mongod.exe --port 37018 --dbpath "C:\mongoDB\data\replset-1"


          • Erstellen eines Datenbankdumps des aktuellen Oplogs (für Sicherheitsfanatiker)

            • z.B: unter Linux
              mongodump --d local --c "oplog.rs" --port:37018 -o "replset-1"

              z.B. unter Windows
              C:\MongoDB\Server\3.4\bin\mongodump.exe /d local /c "oplog.rs" /port:37018 /o "C:\mongoDB\backup\replset-1"


              • Letzen Eintrag des Oplogs in eine temporäre Collection kopieren

                • use local
                  db.temp.drop()
                  db.temp.save(db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next())
                  db.temp.find()


                  • Das Oplog löschen

                    • db = db.getSiblingDB("local")
                      db.oplog.rs.drop()


                      • Das Oplog, mit neuer Größe, neu anlegen

                        • db.runCommand({ create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) })


                          • Letzen Eintrag einfügen. Dieser wird benötigt damit die Replikation weiß, bis zu welchem Stand die Replikation erfolgt ist.

                            • db.oplog.rs.save( db.temp.findOne() )
                              db.oplog.rs.find()


                              • Die temporäre Collection löschen

                                • db.temp.drop()


                                  • Als letztes muss der temporäre Dienst gestoppt und der reguläre Datenbankdienst wieder gestartet werden.

                                      • Dann müssen die Schritte nur auf allen anderen Membern des Replica Sets wiederholt werden.

Latest member activities

Recommend this community post