Endlose erholt Zustand des sekundären
Baue ich eine Replikation festgelegt, die mit einer primären, einen sekundären und einen Schiedsrichter auf MongoDB 3.0.2. Die primär-und Schiedsrichter sind auf dem gleichen host und die sekundäre auf einem anderen host.
Mit dem Anbau von schreiben, überlast, kann die sekundäre Datenbank nicht nach den primären und Schritt in den Zustand der Wiederherstellung. Die Grundschule kann eine Verbindung zu den sekundären als ich mich einloggen kann auf dem sekundären server von Mongo-shell auf dem host des primären.
Ich halt alle Vorgänge und beobachten Sie den sekundären ist-Zustand mit dem Befehl rs.status()
und geben Sie den Befehl rs.syncFrom("primary's ip:port")
auf sekundäre.
Anschließend das Ergebnis des rs.status()
Befehls zeigt, dass die optimeDate der sekundäre ist weit hinter der der primäre, und eine Nachricht erscheint zeitweise als unten:
"set" : "shard01",
"date" : ISODate("2015-05-15T02:10:55.382Z"),
"myState" : 3,
"members" : [
{
"_id" : 0,
"name" : "xxx.xxx.xxx.xxx:xxx",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 135364,
"optime" : Timestamp(1431655856, 6),
"optimeDate" : ISODate("2015-05-15T02:10:56Z"),
"lastHeartbeat" : ISODate("2015-05-15T02:10:54.306Z"),
"lastHeartbeatRecv" : ISODate("2015-05-15T02:10:53.634Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1431520398, 2),
"electionDate" : ISODate("2015-05-13T12:33:18Z"),
"configVersion" : 3
},
{
"_id" : 1,
"name" : "xxx.xxx.xxx.xxx:xxx",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 135364,
"lastHeartbeat" : ISODate("2015-05-15T02:10:53.919Z"),
"lastHeartbeatRecv" : ISODate("2015-05-15T02:10:54.076Z"),
"pingMs" : 0,
"configVersion" : 3
},
{
"_id" : 2,
"name" : "xxx.xxx.xxx.xxx:xxx",
"health" : 1,
"state" : 3,
"stateStr" : "RECOVERING",
"uptime" : 135510,
"optime" : Timestamp(1431602631, 134),
"optimeDate" : ISODate("2015-05-14T11:23:51Z"),
"infoMessage" : "could not find member to sync from",
"configVersion" : 3,
"self" : true
}
],
"ok" : 1
"infoMessage" : "nicht finden konnten, Mitglied synchronisieren von"
Den primär-und Schiedsrichter sind beide OK. Ich möchte wissen, warum diese Meldung und wie ändern Sie den sekundären ist-Zustand von "wiederherstellen" auf "Sekundär".
Poste bitte die Ausgabe von
rs.status()
und versuchen, eine Verbindung von drei sekundären in Frage, auf dem konfigurierten port für mongod
auf dem primären.Ich kann nicht fügen Sie ein Bild und die
rs.status()
Ausgabe gefällt das: "stateStr" : "PRIMARY" "optimeDate" : Isodatum("2015-05-15T06:32:52Z")," "stateStr" : "WIEDERHERSTELLEN", "optimeDate" : Isodatum("2015-05-14T11:23:51Z")Bitte Bearbeiten Sie die Frage und Stelle die Ausgabe von
rs.status()
es so, dass die Menschen erhalten Sie mehr info über deine Frage einfacher. Und ich Stimme mit @MarkusWMahlberg, sollten Sie zunächst sicherstellen, dass es keine Verbindungsprobleme zwischen primären und sekundären.InformationsquelleAutor tottishi05 | 2015-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem (wahrscheinlich)
Den letzten Vorgang auf dem primären ist von "2015-05-15T02:10:56Z", in der Erwägung, dass die Letzte operation des Sekundär ist von "2015-05-14T11:23:51Z", das ist ein Unterschied von rund 15 Stunden. Das Fenster darf auch Ihre Replikation oplog Fenster (die Differenz zwischen der Zeit, in der die erste und die Letzte operation Eintrag in Ihrem oplog). Einfach ausgedrückt, es gibt zu viele Vorgänge auf dem primären in den sekundären aufholen.
Etwas mehr ausgearbeitet (allerdings vereinfacht): in einer ersten sync werden die Daten der sekundären synchronisiert, ist die Daten von einem gegebenen Punkt in der Zeit. Wenn die Daten von diesem Punkt in der Zeit synchronisiert ist, über die sekundäre Verbindung der oplog und wendet die änderungen, die vorgenommen wurden, zwischen sagte Punkt in der Zeit und jetzt nach der oplog-Einträge. Dies funktioniert solange gut, wie der oplog hält alle Operationen zwischen den erwähnten Punkt in der Zeit. Aber das oplog hat eine begrenzte Größe (es ist ein sogenanntes capped collection). Also, wenn es mehr Operationen geschehen auf der primären als der oplog halten kann, während der Synchronisation, die ältesten Operationen "fade-out". Die sekundäre erkennt, dass nicht alle Operationen werden notwendig, "bauen" die selben Daten wie der primäre und weigert sich, die zum abschließen der Synchronisierung, bleiben in
RECOVERY
- Modus.Die Lösung(en)
Das problem ist bekannt und kein bug, sondern ein Ergebnis der inneren Funktionsweise von MongoDB und mehrere fail-safe-Annahmen, Entwicklung-team. So gibt es mehrere Möglichkeiten, um mit der situation umzugehen. Leider, da Sie nur zwei Daten-Lager-Knoten, die alle betreffen Ausfallzeiten.
Option 1: Anhebung der oplog Größe
Dies ist meine bevorzugte Methode, da es befasst sich mit dem problem einmal und (Art) für alle. Es ist ein bisschen komplizierter als andere Lösungen, aber. Von einer hohen Perspektive, dies sind die Schritte, die Sie nehmen.
mongod
im standalone-Modusmongod
als Teil der Replikatgruppe istVergessen Sie nicht, erhöhen Sie die oplog der sekundären vor dem ersten sync, da kann es zu primären einige Zeit in der Zukunft!
Für details, Lesen Sie bitte die "Ändern Sie die Größe der oplog" in den tutorials bezüglich der Replikatgruppe Wartung.
Option 2: schalten Sie die app während der Synchronisierung
Wenn option 1 nicht realisierbar ist, ist die einzige wirkliche andere Lösung ist ein Herunterfahren der Anwendung verursacht, laden Sie Sie auf der replica set, starten Sie den sync und warten, bis es zu vervollständigen. Je nach der Menge der zu übertragenden Daten, berechnen Sie mit mehreren Stunden.
Eine persönliche note
Der oplog-Fenster, problem ist bekannt. Während der Replikat-sets und sharded Cluster einfache Einrichtung mit MongoDB, einige Kenntnisse und ein wenig Erfahrung benötigt wird, pflegen Sie Sie richtig. Führen Sie nicht etwas so wichtig wie eine Datenbank mit einem komplexen setup, ohne zu wissen, die Grundlagen in dem Fall Etwas Schlechtes (tm) passiert, könnte es auch zu einer situation führen, FUBAR.
Sie retten meinen Tag! Ich meine oplog Größe auf 1MB, es ist nur hält der Betrieb für die Dauer von 3 Stunden. Nun, ich brauche, um es zu 30MB. (Meine Knoten sind im gleichen Rechenzentrum, so laggy ist kein großes problem 🙂 )
Froh, dass ich helfen konnte.
Nach der aktuellen (Juli 2018) - version von docs.mongodb.com/manual/tutorial/change-oplog-size, es scheint, dass Sie nicht wirklich brauchen, um beenden Sie die Knoten, um die Größe anzupassen der oplog.
InformationsquelleAutor Markus W Mahlberg
Eine weitere Möglichkeit (vorausgesetzt, primär gesunden Daten) ist, löschen Sie einfach die Daten in der sekundären mongo ' s data-Ordner und neu starten. Dadurch wird es zu synchronisieren, zurück zu der primären, als ob Sie gerade Hinzugefügt haben es in der Replikat-Gruppe.
InformationsquelleAutor Steffan Perry
Eine vierte hinzufügen neuer Knoten zu der Replikatgruppe. Sobald es synchronisiert ist, und setzen dann die veralteten sekundären.
InformationsquelleAutor Gabriel