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.
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
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