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