200 likes | 342 Views
3.3 非同期システムにおける合意. 仮定 故障 クラッシュ故障のみ 通信 送ったメッセージはいつか届く 扱う問題 コンセンサス問題 ビザンチン将軍問題より簡単. 3.3 コンセンサス問題. プロセス ={P1, P2, …} Pi (i=1,2,..): propose(vi), Pi (i=1,2,..): decide(w i ) 条件 停止性 合意 : Pi, Pj が正常なら, w i = w j 妥当性 : Pi が正常のとき, w i = vj となる Pj が存在 (j=i でもよい). propose(1).
E N D
3.3 非同期システムにおける合意 • 仮定 • 故障 • クラッシュ故障のみ • 通信 • 送ったメッセージはいつか届く • 扱う問題 • コンセンサス問題 • ビザンチン将軍問題より簡単
3.3 コンセンサス問題 • プロセス={P1, P2, …} • Pi (i=1,2,..): propose(vi), • Pi (i=1,2,..): decide(wi) • 条件 • 停止性 • 合意: Pi, Pjが正常なら,wi = wj • 妥当性: Piが正常のとき,wi= vj となるPjが存在(j=iでもよい)
propose(1) decide(3) A propose(3) propose(2) B C decide(3) decide(3) propose(1) A decide(3) propose(3) B C propose(2) decide(3)
コンセンサスの応用 • 非ブロッキング原子コミット (3.4.4) • 原子ブロードキャスト (3.5.2) • プロセス多重化 (3.5) • データ多重化 (3.6)
非同期システムでのコンセンサス • 無理 • FLP不可能性 (FLP impossibility result) • 1プロセスのクラッシュ故障でも不可能 • 故障ノードと遅いノードとを区別できない Di Di Di Di P1 P1 Dto Dto ! ! P2 P2 Dto Dto 時間 時間 (a) (b)
非同期システムでのコンセンサス • まず停止性以外の条件を満たすことを考える • 合意: Pi, Pjが正常なら,wi = wj • 妥当性: Piが正常のとき,wi = vj となるPjが存在 • Chandra-Touegアルゴリズム • 各プロセスが4ステップからなるラウンドを繰り返し実行 • 調停者プロセスによって決定する値が定まった場合,その値を高信頼ブロードキャスト
高信頼ブロードキャスト • ブロードキャスト • 全ノードにメッセージを伝えること • 高信頼ブロードキャスト • 故障が起きても,正常な全ノードにつたわるか,どのノードにも伝わらない A R-deliver(m) A A R-bcast(m) B C B C B C R-deliver(m) R-deliver(m)
高信頼ブロードキャストアルゴリズム R-bcast(m) • R-bcast(m)を実行: • send(m) to 全ノード • R-deliver(m) • mを受信: • if (mを初めて受信) • send(m) to 全ノード • R-deliver(m) P1 P2 P3 P4 R-bcast(m) P1 P2 P3 P4
P1 P2 P3 Chandra-Touegアルゴリズムステップ1 • 調停者プロセスに,候補となる値(e)と,その値を得たラウンド番号(u)を送信する • 巡回調停者 • ラウンド1: P1 → ラウンド2: P2 →ラウンド3: P3 →ラウンド4: P1 → v1,0 propose(v1) e1:= v1 u1:= 0 v2,0 r1:= 1 propose(v2) e2:= v2 u2:= 0 v3,0 r2:= 1 propose(v3) e3:= v3 u3:= 0 r3:= 1
P1 P2 P3 Chandra-Touegアルゴリズムステップ2 • 調停者は過半数のプロセスからのメッセージを待ち,最も新しいもの(uの値が大きいもの)を選び,全てのプロセスにそのvの値を送信する • 調停者以外のプロセスは何も行わない v1,0 v1 e1:= v1 u1:= 0 v1 v2,0 r1:= 1 e2:= v2 u2:= 0 v3,0 v1 r2:= 1 e3:= v3 u3:= 0 r3:= 1
P1 P2 P3 Chandra-Touegアルゴリズムステップ3 • メッセージを受け取った場合,e,uを更新し,ackを調停者に送信する • e:= 受信した値,u:=現在のラウンド番号r • 故障していると判断した場合,nackを調停者に送信する e1:= v1 u1:= 1 v1,0 Ack v1 e1:= v1 u1:= 0 v1 Ack v2,0 r1:= 1 e2:= v2 e2:= v1 u2:= 0 u2:= 1 v3,0 v1 Ack r2:= 1 e3:= v3 e3:= v1 u3:= 0 u3:= 1 r3:= 1
P1 P2 P3 Chandra-Touegアルゴリズムステップ4 • 調停者は過半数のプロセスからの返信を待つ • すべてAckなら,値を高信頼ブロードキャスト • Nackが一つでもあれば,ステップ1へ戻る • 調停者以外のプロセスはステップ1へ戻る e1:= v1 v1を高信頼ブロードキャスト u1:= 1 v1,0 Ack decide(v1) v1 e1:= v1 u1:= 0 v1 Ack v2,0 decide(v1) r1:= 1 r2:= 2 e2:= v2 e2:= v1 u2:= 0 u2:= 1 v3,0 v1 Ack r2:= 1 decide(v1) e3:= v3 e3:= v1 r3:= 2 ラウンド 1 ラウンド 2 u3:= 0 u3:= 1 r3:= 1
P1 P2 P3 Chandra-Touegアルゴリズムステップ3 故障と判断した場合 • メッセージを受け取った場合,e,uを更新し,ackを調停者に送信する • 故障していると判断した場合,nackを調停者に送信する e1:= v1 v1を高信頼ブロードキャスト v1,0 Ack u1:= 1 v1 v1 v1 v2,0 v1 Ack Nack v2,0 e2:= v1 v1を高信頼ブロードキャスト u2:= 2 Ack v1 v1 v3,0 v1,1 Ack e3:= v1 ラウンド 2 ラウンド 1 u3:= 1
P1 P2 P3 Chandra-Touegアルゴリズム耐故障性 • ステップ2,ステップ4で,調停者は過半数のプロセスからのメッセージで動作する • 1/2未満のプロセスの故障に耐性がある u1:= 1 v1を高信頼ブロードキャスト v1,0 Ack v1 e1:= v1 u1:= 0 v1 Ack v2,0 r1:= 1 r2:= 2 e2:= v2 e2:= v1 u2:= 0 u2:= 1 v3,0 v1 r2:= 1 e3:= v3 ラウンド 1 u3:= 0 r3:= 1
P1 P2 P3 合意 Pi: decide(wi) 合意: Pi, Pjが正常なら,wi = wj e1:= v1 v1を高信頼ブロードキャスト v1,0 Ack u1:= 1 • 高信頼ブロードキャストするラウンドでは,過半数のプロセスが値を更新 • 更新される値は,過半数のプロセスで,最も新しい(最近更新された)値 • 過半数同士の集合には共通プロセスが存在 • ブロードキャスト後は,常にその値が更新値として選ばれる v1 v1 v1 v2,0 v1 Ack Nack v2,0 e2:= v1 v1を高信頼ブロードキャスト u2:= 2 Ack v1 v1 v3,0 v1,1 Ack e3:= v1 ラウンド 2 ラウンド 1 u3:= 1
一律合意 Uniform Agreement 一律合意が満たされる • 合意 • Pi, Pjが正常なら,wi = wj • 一律合意 • 故障プロセスPiについても,decide(wi)を実行したなら,wi = wj 一律合意ではない propose(1) propose(1) A A decide(3) decide(2) B C B C propose(2) propose(2) propose(3) propose(3) decide(3) decide(2) decide(3) decide(3)
P1 P2 P3 停止性 • 進行しない場合 • Step 3で故障した調停者を故障と判定しない場合 • タイムアウトで対処可能 • 動き続ける場合 • Step 3で故障と判定することが続く場合 Ack Nack Nack Nack Nack
停止性 • 正常な調停者プロセスを,正常だと判断できるラウンドに達すればよい. • 何らかの同期に関する仮定が必要 • (FLP不可能性) • 部分的同期性の例 (3.3.4) • メッセージの遅延,命令の実行時間に上限があるがその値が分かっていない
故障検出 • 部分的同期性の例 • メッセージの遅延,命令の実行時間に上限があるがその値が分かっていない Di Di Di Di Di P1 Dto Dto ! ! P2 Dto Dto Dto := Dto+a 遅延を短めに見積もりすぎ 検出に失敗した場合,タイムアウト時間を延長
その他 • 結局,コンセンサスが解ける条件は,故障検出能力に依存 • 障害検出器 failure detector (3.3.4) • 形式的に故障検出能力を定義したもの • コンセンサス • 将来的強(eventually strong)以上が必要 • ビザンチン将軍問題(クラッシュ故障のみ) • 完全が必要 • その他のアルゴリズム • Paxos (3.3.5)