einen Kontrapunkt zur akzeptierte Antwort zu geben, der Algorithmus selbst nie wirklich braucht zu beenden in jedem schrecklich klar definierten Sinne.Es ist sinnvoller, über jeden Knoten zu sprechen, der seine Teilnahme an dem implementierungsdefinierten Algorithmus individuell beendet. Dann könnte man vielleicht sagen, dass der Algorithmus selbst beendet ist, wenn alle teilnehmenden Knoten ausgefallen sind, wenn das eine nützliche Sache wäre, die man wissen möchte.
Der Algorithmus hat effektiv konvergiert, sobald eine Mehrheit von Akzeptoren ihre AcceptPropose
Nachrichten für die gleiche Abstimmung geschickt hat (in dem Sinne, dass einmal, dass es passiert ist, ist keine Option, über das, was Wert letztlich entschieden werden kann), aber das Dies ist kein Sachverhalt, der in der Praxis beobachtet werden kann: Wenn das Netzwerk beispielsweise unmittelbar vor dem Senden dieser Nachrichten AcceptPropose
Nachrichten senden würde, könnte kein Knoten erfahren, dass der Algorithmus konvergiert ist, bis die Konnektivität wiederhergestellt wurde.
Sobald jedoch ein Knoten weiß, dass der Algorithmus (indem er empfangene AcceptPropose
Nachrichten von einer Mehrheit) konvergiert hat es ist sicher für den gewählten Wert über herkömmliche Mittel zu teilen, z.B. durch Senden einer Decide
Nachricht durch Broadcast oder Klatsch und für andere Knoten, um es weiterzuleiten, bis jeder Knoten weiß, dass die Konvergenz erreicht wurde.
Jeder Knoten kann seine Teilnahme an dem Algorithmus beenden, sobald er den Wert kennt, zu dem der Algorithmus konvergiert ist, obwohl er es vorziehen würde, abhängig von den Implementierungsbeschränkungen länger beizutreten.
Sie müssen ein wenig über die Fehlertoleranz nachdenken, um sich davon zu überzeugen, dass das Beenden bei der Entscheidung Lebendigkeit bewahrt: Wenn alle Knoten, die wissen, welcher Wert entschieden wurde, sterben sollten, bevor sie es teilen könnten, wäre Fortschritt möglich ? Die Antwort ist, glücklicherweise, ja: Solange eine Mehrheit von Knoten am Leben bleibt, wenn einer von ihnen den entschiedenen Wert kennt, kann er ihn mit den anderen teilen, und wenn nicht, dann gibt es eine Mehrheit von teilnehmenden Knoten, die nur auswählen müssen eine höhere Wahlnummer und eine weitere Runde.
Eine Sache vorsichtig zu sein in der akzeptierte Antwort ist dieser Satz:
Die Wahl so schnell gemacht wird als eine Mehrheit eine akzeptieren erhält (n, v) Meldung, die sie nicht haben! versprach zu ignorieren.
Erstens gibt es nichts in dem Protokoll über vielversprechendeAcceptPropose
Nachrichten zu ignorieren. Versprechen, zu denen Propose
Messages ignoriert/abgelehnt werden sollten. Eine Mehrheit von AcceptPropose
Nachrichten kann immer verwendet werden, um den gewählten Wert zu lernen, unabhängig von der Wahlnummer.
Zweitens ist die Wahl effektiv gemacht, sobald eine Mehrheit AcceptPropose
Nachrichten sendet. Sie können dies nicht direkt beobachten, also müssen Sie warten, bis mindestens ein Knoten AcceptPropose
Nachrichten von einer Mehrheit erhalten hat, bevor Sie wissen, dass die Wahl getroffen wurde. Sobald das passiert ist, können Sie den ausgewählten Wert über weitere AcceptPropose
Nachrichten oder über einen Broadcast/Klatsch von Decided
Nachrichten teilen, je nachdem, welche Ihrer Implementierungsbeschränkungen besser sind.
Es ist eine Weile her :) Ich akzeptierte Ihre Antwort wegen der Phrase "die Wahl wird getroffen, sobald eine Mehrheit eine Annahme empfängt! (N, v) Nachricht, die sie nicht zu ignorieren versprochen haben". Das ist der Schlüssel. Das Paxos-Protokoll ist "vollständig", sobald die Mehrheit der Akzeptoren einen Wert akzeptiert. Das Commit (oder Decide) ist einfach eine Optimierung, bei der ein ausgezeichneter Lernerder Antragsteller) übermittelt den Konsens an alle interessierten Lernenden. Sie könnten das Commit überspringen, indem jeder Acceptor seine Stimme an alle Lernenden sendet. Dies ist in "Paxos Made Simple" angegeben, obwohl es leicht zu übersehen ist. –
@dougvk "Zeitstempel"? es gibt keine Zeitstempel in Paxos, meinen Sie die Wahlnummer? – simbo1905