MongoDB Replica Sets - Oplog im Betrieb verändern

Ein MongoDB Replica Set verwendet zur Synchronisation der Daten das so genannte Oplog. Dabei handelt es sich um eine eigene MongoDB Collection in der local Database. Diese ist capped (hat also eine maximale Größe). Erreicht die Collection ihre maximale Größe, werden die ältesten Einträge ersetzt. Erzeugt eine Applikation also die maximale Größe des Oplogs in beispielsweise 35 Minuten, hat dies zur Folge, dass ein MongoDB Knoten eines Replica Sets für maximal 34 Minuten und 59 Sekunden ausfallen darf, bevor er out-of-sync ist und nicht mehr alle Änderungen des Masters bekommen kann. Ist ein Knoten out-of-sync muss manuell eingegriffen werden, um den Sync mit dem Replica Set wiederherzustellen.

Einblick in die aktuelle Größe das Oplogs einer MongoDB Instanz gibt das MongoDB Shell Kommando:

db.getReplicationInfo()

Der Output enthält zum Einen die aktuelle Größe, zum Anderen der im Oplog abgebildete Zeitunterschied zwischen ersten und letzten Eintrag aus unterschiedlichen Perspektiven:

ep2:SECONDARY> db.getReplicationInfo() 
{ 
  "logSizeMB" : 12288, 
  "usedMB" : 12268.66, 
  "timeDiff" : 49881, 
  "timeDiffHours" : 13.86, 
  "tFirst" : "Mon May 30 2016 20:50:05 GMT+0200 (CEST)", 
  "tLast" : "Tue May 31 2016 10:41:26 GMT+0200 (CEST)", 
  "now" : "Tue May 31 2016 10:41:26 GMT+0200 (CEST)" 
}

In dem oben genannten Beispiel sind besonders die Punkte usedMB und timeDiffHours interessant. Aus beiden Werten kann abgelesen werden, welcher Zeitabschnitt im Oplog abgebildet wird und welche Größe das Oplog dafür wirklich beansprucht. Im konkreten oberen Beispiel, sind also fast 14 Stunden an Daten im Oplog enthalten. Fällt also nachts ein Knoten des Replica Sets aus, kann dieser am nächsten Morgen hochgefahren werden und sich wieder sauber in das Replica Set integrieren.

Ändert sich das Lastverhalten einer Applikation über den Tag, kann die Zeitrange, die das Oplog abbildet, schwanken. Dazu sollte man zu unterschiedlichen Zeiten des Tages die im Oplog abgebildeten Zeitspanne überprüfen und mit den eigenen Erwartungen/Anforderungen abgleichen. Bildet das Oplog zur Stoßzeit zuwenig Zeit ab, sollte das Oplog vergrößert werden.

Dazu kann man der Anleitung von MongoDB folgen oder das verlinkte Skript verwenden (was im Wesentlichen das o.g. Tutorial abbildet und bereits im Einsatz war). Das Skript kapselt die durchzuführenden Einzelschritte in sinnvolle, zusammengehörende Abschnitte.

Bevor ein Abschnitt ausgeführt wird die explizite Eingabe eines ‚y‘ und Bestätigung mittels Return des Anwenders, um die Möglichkeit zu geben die Schritte zu verifizieren und deren Auswirkungen einzuschätzen. Jede andere Eingabe bricht das Skript an genau dieser Stelle ab. Es findet allerdings kein reset der bisher durchgeführten Schritte statt (dies muss manuell erfolgen, sofern notwendig) und auch kein resume zu einem spätern Zeitpunkt an gleicher Stelle.

Shellskript zum Verändern des Oplog:

https://gist.github.com/strud/83b12f00c4c7c09d13e349f9201eec09