Ist dies eine gültige Sicherungsstrategie für MongoDB?

11

Ich habe einen einzelnen dedizierten Server mit einer MongoDB-Datenbank von ca. 10 GB. Ich muss täglich Backups durchführen, kann aber keine Ausfallzeiten mit der Datenbank haben. Ist es möglich, ein Replikatset auf einer einzelnen Festplatte zu verwenden (wobei 2 Mongod-Instanzen auf verschiedenen Ports ausgeführt werden) und die sekundäre einfach offline zu schalten und die Datendateien auf einem externen Speicher wie S3 zu sichern (Journaling ist aktiviert)? Oder wäre die Verwendung von Master / Slave besser als ein Replikatset?

Ist das machbar und wenn ja, welche potenziellen Probleme könnte ich haben? Wenn nicht, wie stelle ich mir das so vor?

James Simpson
quelle

Antworten:

6

ReplicaSet funktioniert in diesem Szenario. Ich kann jedoch nicht sagen, ob es eine gute Idee ist, zwei MongoDB-Instanzen auf demselben Server zu haben - dies hängt von der Serverhardware / -software und der Auslastung ab.

Um sicherzustellen, dass Ihr backupMongoDB-Knoten nicht zum Master wird, setzen Sie seinen priorityParameter auf 0z

rs.add({_id: 1, host: "localhost:<port>", priority: 0})

HINWEIS : Wenn Sie keine Ausfallzeit haben können, MÜSSEN Sie mindestens 2 primäre MongoDB-Knoten in ReplicaSet haben (siehe Artikel)

Alexander Azarov
quelle
2

Eine zu berücksichtigende Strategie ist die Verwendung der Option "versteckt" auf dem Sicherungsknoten in Ihrem Replikatsatz. Aus dem MongoDB-Blog:

Versteckte Server werden in den isMaster () - Ergebnissen nicht angezeigt. Dies bedeutet auch, dass sie nicht verwendet werden, wenn ein Treiber automatisch Lesevorgänge an Slaves verteilt. Ein versteckter Server muss eine Priorität von 0 haben (Sie können keinen versteckten Primärserver haben). Führen Sie Folgendes aus, um ein verstecktes Mitglied hinzuzufügen:

rs.add ({"_ id": num, "host": hostname, "priority": 0, "hidden": true})

Travis Dunn
quelle
1

Replikatsätze werden im Allgemeinen, aber auch in diesem Fall einfach aufgrund ihrer automatischen Wiederherstellung und automatischen Neusynchronisierungsfunktionalität bevorzugt. Die von Ihnen beschriebene Sicherungsmethode klingt völlig vernünftig und wurde bereits zuvor mit anderen Datenbanken verwendet.

Das einzige potenzielle Problem, das ich sehe, ist, dass Ihre Sekundärseite unter bestimmten Umständen zu Ihrer Primärseite befördert werden kann und Sie entweder a) Ihre Sicherung von der neuen Sekundärseite übernehmen müssen oder b) Ihr Sicherungsskript intelligent genug machen müssen, um diese Instanz zu erkennen MongoDB zurücktreten.

Die gute Nachricht ist, dass es ziemlich trivial sein sollte

  1. Fragen Sie Ihre Sicherungsquelle ab, um herauszufinden, welche Instanz primär und welche sekundär ist ( db.isMaster())
  2. Überzeugen Sie die Sicherungsinstanz, mit den Befehlen rs.freeze()und zurückzutreten oder die Verbindung zur sekundären wiederherzustellenrs.stepDown()
Charles Hooper
quelle
Ist es nicht eine Option, die Priorität auf 0 zu setzen, wie Alexander vorschlägt, damit die Sekundärseite niemals zur Primärseite wird?
James Simpson
Sie müssten einige Tests durchführen, aber ich bin nicht sicher, ob der sekundäre Prozess nur in den Standby-Modus wechselt, wenn der primäre Prozess aus irgendeinem Grund ausfällt. Ich wollte immer, dass meine Secondaries übernehmen;)
Charles Hooper
1
>> Ihre Sekundärseite kann zu Ihrer Primärseite befördert werden - Wie bereits erwähnt, verhindert das Setzen der Sekundärstufe auf Priorität 0, dass sie jemals zum Master wechselt.
Jonesome Reinstate Monica
Sie können eine Verbindung zu einem der Peers aus Ihrer Liste der Peer-Knoten herstellen (es kann sich um einen beliebigen primären, sekundären, Arbiter- oder versteckten Knoten handeln), diesen Peer fragen, wer die Secondaries sind ( rs.status()und eine Schleife durchlaufen result["members"]), und eine Verbindung zu einem der Peers herstellen Secondaries, um die Sicherung durchzuführen.
Yfeldblum