私は他の両方の答えに同意しません。
Multi-Paxosは、リーダーが唯一の提案者であるとは言っていません。これにより、システムに単一障害点が発生します。ネットワークパーティション中であっても、システムが進行できない場合があります。Multi-Paxosは、単一のノード(リーダー)がいくつかの準備フェーズをスキップできるようにする最適化です。他のノードは、リーダーが死んでいると考えて、彼女に代わってインスタンスを続行しようとする場合がありますが、それでも完全なBasic-Paxosプロトコルを使用する必要があります。
受け入れメッセージを削除すると、Paxosアルゴリズムに違反します。アクセプターは、受け入れないことを約束していない限り、すべての値を受け入れる必要があります。(無視することは許可されていますが、お勧めしません。ドロップされたメッセージが許可されているからです。)
これにはエレガントな解決策もあります。問題はリーダーのラウンド数(質問のN + 1)にあります。
ここにいくつかの仮定があります:
- ラウンドIDがすべてのノード間で互いに素であるようなスキームがあります(とにかくPaxosが必要です)。
- どのノードがPaxosインスタンスごとのリーダーであるかを判断する方法があります(Multi-Paxosで必要)。リーダーは、あるPaxosインスタンスから次のインスタンスに変更できます。
余談ですが、パートタイム議会は、これはリーダーが以前のPaxosインスタンスを獲得することによって行われることを示唆し(セクション3.1)、彼女が生きているか最も裕福である限りリーダーであり続けることができると指摘します(セクション3.3.1)。Paxosを介して提案された明示的なELECT_NEW_LEADER:<node>値があります。
- リーダーは、インスタンスごとの最初のラウンドで準備フェーズをスキップするだけです。後続のラウンドでは完全なベーシックパクソを使用します。
これらの仮定により、解決策は非常に簡単です。リーダーは、最初の承認フェーズで非常に低いラウンドIDを選択するだけです。このID(私はこれをINITIAL_ROUND_IDと呼びます)は、すべてのノードのラウンドIDよりも小さい限り、何でもかまいません。id選択スキームに応じて、-1、0、またはInteger.MIN_VALUEのいずれかが機能します。
別のノード(私は彼をスチュワートと呼びます)が何かを提案するために完全なPaxosプロトコルを通過する必要があり、彼のラウンドIDは常にINITIAL_ROUND_IDより大きいため、これは機能します。考慮すべき2つのケースがあります。リーダーの承認メッセージがスチュワートの準備メッセージが到達したノードのいずれかに到達したかどうかです。
リーダーの承認フェーズがどのノードにも到達していない場合、スチュワートはどのPromiseでも値を取り戻さず、通常のBasic-Paxosと同じように続行できます。
そして、リーダーの承認フェーズがノードに到達すると、スチュワートは、Basic-Paxosの場合と同様に、アルゴリズムを続行するために使用するpromiseの値を返します。
いずれの場合も、スチュワートのラウンドIDはINITIAL_ROUND_IDより大きいため、ノードがリーダーから受信する遅いAcceptメッセージは、常にNackになります。
アクセプターにもスチュワートにも特別なロジックはありません。そして、リーダーの最小限の特別なロジック(Viz。本当に低いINITIAL_ROUND_IDを選択します)。
OPの質問を1文字変更すると、OPの自己回答は正しいことに注意してください:Nack。
- 受信:準備(N)
- 返信:Promise(N、null)
- 受信:受け入れる!(N、V1)
- 返信:承認済み(N、V1)
- 受信:受け入れる!(N-1、V2)
- 返信:Nack(N、V1)
しかし、現状では、彼の答えはPaxosアルゴリズムを破っています。それは受け入れるべきです!
- 受信:準備(N)
- 返信:Promise(N、null)
- 受信:受け入れる!(N、V1)
- 返信:承認済み(N、V1)
- 受信:受け入れる!(N + 1、V2)
- 返信:承諾!(N + 1、V2)