2009-07-09 4 views
14

Angenommen, Sie haben n Prozesse, n> 2. Sie wollen Übereinstimmung zwischen ihnen haben, dass man aktiv sein soll. Also müssen sie sich gegenseitig abstimmen, um festzustellen, welcher aktiv ist.Vermeidung von Split-Brain, Votes und Quorum

Alle Prozesse jederzeit ausfallen kann, wollen wir einen Prozess aktiv, wenn möglich, aber ...

Wir Muss hat nie zwei aktive zugleich, so dass, wenn sie nicht sein kann Sicher ist es besser, niemanden aktiv zu haben. (Ie. Wir wollen Split-Brain zu vermeiden)

Der einzige verfügbare Kommunikationsmechanismus zwischen ihnen ist Pub-Sub-Messaging (nicht Punkt zu Punkt).

Eine oder mehrere Datenbanken sind verfügbar, aber keine einzige Datenbank sollte ein einzelner Fehlerpunkt sein. Ie. Es wäre sehr unerwünscht, wenn alle Prozesse zur Verfügung stünden und dies durch den Verlust einer einzigen Datenbank verhindert würde.

Design? Welche Nachrichten müssen veröffentlicht werden?

Antwort

29

Theorie:

Dies ist führend Wahl, die eine Form der Consensus Problem ist, auch manchmal The Two Generals Problem genannt. Unter einigen Annahmen (vollständig async und Nachrichten können verloren gehen) hat es sich als unmöglich erwiesen, und der Beweis ist besonders elegant.

Die Intuition dieses Problems ist: Stellen Sie sich vor, dass ein Algorithmus existiert, der es erlaubt, in einer bestimmten Anzahl von Nachrichten einen Konsens zu erreichen. Da Fehler toleriert werden, können wir eine Nachricht aus dem Protokoll löschen, und es sollte immer noch funktionieren. Wir können diesen Prozess wiederholen, bis überhaupt keine Nachrichten mehr vorliegen, was eindeutig eine Unmöglichkeit ist.

In der Praxis überwinden wir dies mit Fehlerdetektoren, um ein synchrones System zu simulieren.

Der bekannteste Algorithmus, der den Konsens löst, ist Paxos, der Fehler bis zur Hälfte der beteiligten Knoten tolerieren kann. Paxos hat den Ruf, sehr schwierig zu implementieren, da selbst geringfügige Missverständnisse über die Einzelheiten des Protokolls dessen Korrektheit zerstören.

Praktische Lösungen:

Während das Problem in der Regel recht schwierig ist, immer funktionierende Systeme bis ist viel einfacher. Es sind Standard-Implementierungen von Paxos oder gleichwertige Algorithmen verfügbar. Apache Zookeeper ist das Beste, was mir bekannt ist. Für dein spezifisches Problem bin ich mir ziemlich sicher, dass es deine schnellste Route sein wird. Andere Paxos-Implementierungen sind in der Nähe und es könnte auch möglich sein, etwas auf Netzwerk-Redundanz-virtuellen IP-Tools wie Wackamole aufzubauen. Ich glaube, dass die High-End-Versionen der meisten kommerziellen Datenbanken Quorum-Funktionen als (teure) Option bieten.

Auch für viele Anwendungen ist es akzeptabel, die Korrektheit geringfügig zu schwächen oder das Problem auf andere Weise anzupassen, um viel einfachere Lösungen zu ermöglichen.

Zum Beispiel, wenn ein einzelner Fehlerpunkt tolerierbar ist, weil die Wiederherstellung wahrscheinlich schnell ist, dann ist das Problem trivial: nur einen speziellen Knoten die Arbeit machen.

Ein anderer Ansatz könnte darin bestehen, das System um idempotente Aktionen herum aufzubauen, so dass doppelte Verarbeitung tolerierbar wird.

Schließlich können Sie die Arbeitslast in einen Pool nicht redundanter Systeme aufteilen: Hier verzögern Fehler die Verarbeitung bis zur Wiederherstellung, jedoch nur für Elemente auf diesem Knoten, nicht für die gesamte Arbeitslast.

Diese Art von Kompromissen ist so viel einfacher, dass sie oft die bessere Wahl sind. Man muss den Nutzen einer vollständigen Lösung gegen die Komplexität der Implementierung abwägen und sehen, ob es wirklich einen Wert gibt. Aus diesem Grund verwenden so viele praktische Systeme einfach 2 Phase oder 3 Phase Commit, obwohl sie in einigen Szenarien blockieren: Die verringerte Verfügbarkeit ist tolerierbar im Vergleich zur Komplexität eines vollständigen Quorumsystems.

+1

Vielen Dank für diese detaillierte Erklärung und die Referenzen. Ich stimme zu, dass eine Lockerung der Zwänge, um eine einfachere Lösung zu ermöglichen, ein Weg ist, den wir erforschen müssen. [Ich kann jetzt Spike Milligans Epitaph widerspiegeln, wenn ich zurück zum Team gehe "Siehst du, ich habe dir gesagt, dass es hart war!"]. – djna

+0

Aus Gründen der Klarheit implementiert Zookeeper ZAB "Zookeeper Atomic Broadcast", das mit abstrakten Paxos übereinstimmt, sich jedoch von klassischen Paxos unterscheidet, sodass Nachrichten die primäre Reihenfolge beibehalten, was in vielen Szenarien sehr wichtig ist. – gertas

1

Ich bin nicht klar auf Pub-Sub-Messaging.

Wenn sie irgendeine Art von Arbeitsobjekten von einer externen Quelle erhalten und nur eine von ihnen die Arbeit verarbeiten soll, können Sie einen Hash-Wert-Raum, 2^64, durch die Anzahl teilen Knoten, von denen jeder Knoten ein Stück nimmt. Jeder Knoten könnte die Arbeitsobjekte bei ihrem Eintreffen hashen und bestimmen, ob es ihnen gehört.

+0

pub-sb messaging, impliziert, dass jedes Mitglied Informationen übertragen kann, aber nicht sicher sein kann, dass die anderen Mitglieder es sehen. Wie auch immer, Ihre Antwort ist eigentlich eine, an die wir gedacht hatten und die wirklich gut gefallen hat. Der Nachteil ist, dass wir eigentlich nur 2 Knoten haben und so im "degraded" Modus die Hälfte der Arbeit verlieren. – djna

0

Sehen Sie sich an, wie Routing-Protokolle (OSPF und IS-IS) es tun, und sehen Sie, ob das für Sie funktioniert. Sie wählen einen Anführer (und im OSPF-Fall einen Backup-Anführer).

+0

Es war der Wahlprozess selbst, der uns störte. Danke für den Vorschlag. Dieser http://routergod.com/sevenofnine/osph_part_2.html Artikel beschreibt, was vor sich geht, gibt aber nicht viele Details. Das Problem für mich ist, wie man mit unzuverlässigen Kommunikationen umgeht und die Möglichkeit eines geteilten Gehirns vermeidet. – djna

+0

Dieser Link erklärt nur einen kurzen Überblick. Werfen Sie einen Blick auf einige Cisco-Dokumente oder das Buch "Routing TCP/IP". – Thomas

Verwandte Themen