Eine MongoDB betreibt man meist in einem Replikationsset. Dieses Set besteht aus minimal drei physischen Datenbankserver. Jetzt kann es aber vorkommen, dass ein Server einen Plattencrash hat und somit die Daten inkonsistent werden. Machen wir also mal folgendes Gedankenexperiment, damit ich euch dann die Lösung dazu präsentieren kann:

Ich habe also drei Server:

  • Server 1 (immer Primary, da das Voting so angepasst wurde)
  • Server 2 (Secondary)
  • Server 3 (Secondary)

In meinem Experiment hat Server 1 einen Plattencrash und die Daten sind nun unvollständig. Der Server 2 wird nach dem Crash zum Primary ernannt und hat die vollständigen Daten vorrätig. Wenn ich jetzt aber einfach den ersten Server, mit seinen unvollständigen Datensatz starte, wird er wieder zum Primary ernannt und das kann wiederum zu Problemen führen:

Es kann zum Beispiel vorkommen, das man auf Daten zugreift, die Server 2 vorrätig hätte, aber da der Primary antwortet, also Server 1, kommen keine Daten zurück.

Dieses Problem kann sehr einfach gelöst werden. Vorher sollte natürlich ein Backup erstellt werden. Der Server 1 sollte zu diesem Zeitpunkt heruntergefahren sein. Der Server 2 sollte daher wieder Primary sein. Erstellt nun also von Server 2 das Backup und speichert es irgendwo gut weg.

Danach könnt ihr auf dem Server 1 den Datenbankordner leeren.

sudo rm -rf /pfad/zum/datenbankordner/*

Jetzt startet ihr die MongoDB auf dem Server 1 neu. Server 2 und Server 3 versuchen Server 1 wieder ins ReplSet aufzunehmen. Server 1 bekommt aber nun mit, das er nicht mehr auf dem neuesten Stand ist und wir sogleich einen initialen Sync ausführen. Nachdem dieser Sync beendet ist, wird Server 1 wieder Primary. Bis zu diesen Zeitpunkt ist also Server 2 für alles zuständig und übergibt dann wieder die Aufgabe an Server 1.

Bei diesem Experiment hatte ich an ein paar Stellen Bedenken die unbegründet waren:

  • Wenn der Server 1 immer Primary ist un mit einen leeren Datenbankordner startet, werden sich die anderen dann auch "leer" synchronisieren?
  • Wird Server 1 wieder automatisch Primary nachdem er fertig mit synchronisieren ist?
  • Kann man das bedenkenlos machen?

Diese Bedenken waren aber völlig unbegründet. Der Server 1 zieht sich ganz normal den Stand vom Server 2 und wird danach wieder Primary. Man kann das natürlich bedenkenlos machen, da man ja auch ein Backup der Daten hat.

Und abschließend:
Genau dafür ist ja ein ReplSet gut. Da können auch mal Platten ausfallen und der Betrieb kann trotzdem bedenkenlos fortgeführt werden

via GIPHY