構造化オーバーレイネットワークに適した 分散双方向連結リスト ddll

32
構構構構構構構構構構構構構構構構構構構 構構構構構構構構構構 DDLL 構構 構構 ( 構構構構構構 ) 構構 構 (BBR) 2010.09.17 1 DPS144

Upload: samira

Post on 14-Feb-2016

41 views

Category:

Documents


2 download

DESCRIPTION

構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL. 安倍 広多 ( 大阪市立大学 ) 吉田 幹 (BBR). 分散双方向連結リストとは. ネットワークで接続された複数のノードが 双方向連結リストを構成 各ノードは右ノードと左ノードへのポインタ (IP アドレスなど ) を保持 各ノードが保持するキーによってソートされている 循環リストを想定. 分散双方向連結リストの応用例. 構造化オーバーレイ (P2P) ネットワークでよく用いられる Chord, Chord#, Symphony, Skip graph, SkipNet , etc. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

構造化オーバーレイネットワークに適した分散双方向連結リスト DDLL

安倍 広多 ( 大阪市立大学 )吉田 幹 (BBR)

2010.09.17

Page 2: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 2

分散双方向連結リストとは

• ネットワークで接続された複数のノードが双方向連結リストを構成

– 各ノードは右ノードと左ノードへのポインタ(IPアドレスなど )を保持

– 各ノードが保持するキーによってソートされている

– 循環リストを想定

2010.09.17

Page 3: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 3

分散双方向連結リストの応用例

• 構造化オーバーレイ (P2P)ネットワークでよく用いられる

– Chord, Chord#, Symphony, Skip graph, SkipNet, etc.• 自律分散的に動作する分散双方向連結リストが必要

Skip Graph

James Aspnes and Gauri Shah "Skip Graphs", ACM Trans. on Algorithm, 2007

2010.09.17

Page 4: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 4

分散双方向連結リストの難しいところ

• ノードは勝手なタイミングで挿入・削除– 複数ノードが並行して挿入・削除するかも

• ノードは削除手続きを実行せずに(勝手に)離脱・故障

• これらを考慮したアルゴリズムが必要– ノード挿入

– ノード削除

– リンク修復2010.09.17

Page 5: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 5

従来の手法

1. 楽観的アプローチ (Chordなど )– 周囲のノードを気にせずに挿入・削除

– 連結リストを理想的な状態に戻すために定期的に修復

– 利点 : リンク修復が容易

– 欠点 : (理想的な状態ではない間)到達できないノードが存在

2. 排他制御アプローチ

– 分散排他制御を用いて厳密に挿入・削除

– 利点 : 挿入されているノードに必ず到達できる

– 欠点 : 障害からの回復が困難(ノードが故障した場合,ロックされたままに)

挿入されているノードに必ず到達可能で,かつ障害からの回復が容易なアルゴリズムが欲しい

2010.09.17

Page 6: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 6

DDLL アルゴリズム(障害を考慮しないバージョン)

2010.09.17

Page 7: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 7

前提

• ノードの実行速度は任意

• ノード間の通信路:–送信したメッセージはいずれ到着

–伝送時間の上限はない

– FIFO でなくてもよい

• 全てのキーはユニーク(重複しない)–キーの後ろに十分なビット数の乱数を

付け加えれば良い

2010.09.17

Page 8: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 8

DDLL での挿入・削除の基本的な流れ

挿入・削除のどちらの場合でも

1. まず,左ノードの右リンクを書き換える(右リンク更新処理)

2. 次に,右ノードの左リンクを書き換える(左リンク更新処理)削除挿入

SetRメッセージ 右リンク更新要求SetRAckメッセージ 確認応答SetLメッセージ 左リンク更新要求

2010.09.17

Page 9: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 9

右リンク更新処理 | 提案手法

分散排他制御を用いずに安全に右リンクを更新a-b 間にノードuを挿入する場合 :1. uは左リンクを aに,右リンクをb に張る

2. uはSetRメッセージで新リンク先 (u)とaの現在の右リンク先 (b)をaに送信

3. aは,aが削除中ではなく,かつ右リンク先が等しい場合に限り

右リンクを更新し,SetRAckを返す

•複数ノードが同時に a-b 間に挿入しようとしても, SetR に成功するのは 1 つ

→ 分散排他制御不要

•a の右リンクが u になったとき, u の右リンクは b になっている

→ 右リンクは途切れない(一瞬たりとも)

2010.09.17

Page 10: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 10

右リンク更新処理 | 例•複数ノードが同時に a-b 間に挿入しようとしても, SetR に成功するのは 1 つ

→ 分散排他制御不要

•a の右リンクが u になったとき, u の右リンクは b になっている

→ 右リンクは途切れない(一瞬たりとも)

2010.09.17

Page 11: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 11

左リンク更新処理 | 問題 1• 右リンクの更新に成功したら左リンクを更新

→ SetRAck を受け取ったら SetL メッセージを送信

• SetL メッセージの到着順序は SetR の順番通りとは限らない !

?2010.09.17

Page 12: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 12

左リンク更新処理 | 問題 1 の解決法

• SetLメッセージにシーケンス番号を付与

– SetLメッセージを送信する時点で同一ノードを宛先とする

SetLメッセージのシーケンス番号を決定できる

→ SetL メッセージを受信順序に関係なく処理可能

• 各ノードに右リンク番号と左リンク番号を割り当てる

– 左リンク番号 : 今までに受信したSetL メッセージの最大シーケンス番

• 挿入直後は 0– 右リンク番号 : 右ノードの左リンク番号

– 基本的に左右のリンク番号は等しい(過渡的な状態を除けば)

0

02010.09.17

Page 13: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 13

削除

左リンク更新処理 | リンク番号の更新方法

挿入

• ノードが受信する SetL メッセージに,送信時点でシーケンス番号を付与できる

2010.09.17

Page 14: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 14

Dの右リンク番号 =6

左リンク更新処理 | 同時挿入の例

SetLの到着順序が入れ替わっても問題ない!

Bの右リンク番号 =4

Cの右リンク番号 =5

2010.09.17

Page 15: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 15

左リンク更新処理 | 問題 2• このままだと左リンクが削除済みノードを指す場合がある

• 左リンクを常に使えるようにするために ...

2010.09.17

Page 16: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 16

左リンク更新処理 | 問題 2 の解決法• 参照カウンタ (ref)の導入

– 左リンクによって参照されている数をカウント

– SetRメッセージを受信 → 1加算

– UnrefLメッセージを受信 → 1減算• SetLを受信したノードは変更前の左ノードにUnrefLメッセージを送信し,

参照されなくなったことを通知

• ノードは ref = 0 になれば停止可能

2010.09.17

Page 17: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 17

検索処理

• DDLL では–右リンクは常に正しいノードを指す

–左リンクは常に正しいとは限らない

• これを考慮してリストをトラバースする必要がある–左リンクを使うときは注意が必要

–詳細は省略

2010.09.17

Page 18: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 18

DDLL アルゴリズム(障害を考慮するバージョン)

2010.09.17

Page 19: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 19

リンク修復

• 故障したノードをバイパスして連結リストを修復

• 各ノードは左側のリンクを修復– 左リンク番号を単調に増加させるため

– 各ノードは,定期的に左ノードをチェック

• 前提 : 修復して接続するノードは求められる– 左側の k個のノードを保持しておくなど

2010.09.17

Page 20: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 20

修復時のリンク番号の問題• 単純に左リンク番号を +1

すると困る例

• B の故障直前に X が挿入したが, C はそのことを知らずに修復開始

• C を右リンクとするノードが 2 つ存在し (A, X) ,右リンク番号も同一 !

• X-C 間に新たなノード Y が挿入されると, C の左リンクは Y を指してしまう

2010.09.17

Page 21: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 21

解決策 ( リンク番号の拡張 )• リンク番号を (g, s)形式に拡張– g: リンクを修復した回数

– s: 通常のシーケンス番号

• g が大きい方が優先

• リンク修復前の状態には戻らない

2010.09.17

Page 22: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 22

各ノードが保持する変数• ノードの状態

– out リストから外れている

– ins 挿入するために左ノードにSetR送信中

– inswait insでSetRNakを受信し,リトライ待ち

– in 少なくとも右方向は挿入済み

– del 削除するために左ノードにSetR送信中

– delwait delでSetRNakを受信し,リトライ待ち

– grace 削除時に, refが0になるのを待機中

• キー

• 右リンク(右ノードへのポインタとキー)

• 左リンク(左ノードへのポインタとキー)

• 右リンク番号

• 左リンク番号

• 参照カウンタ (ref)

2010.09.17

Page 23: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 23

詳細なアルゴリズム

2010.09.17

Page 24: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 24

本発表で割愛した点

• 検索アルゴリズム

• 修復時の参照カウンタの取り扱い

• ノード故障誤検出からの修復–生きているノードを (誤って ) 故障している

と判断した場合でも回復できる

• 挿入・削除時のノード故障の取り扱い

• ノードの再挿入の取り扱い

2010.09.17

Page 25: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 25

まとめ• 分散双方向連結リストを構築・維持する自律分散アルゴリズム DDLL

を提案

• DDLLの特徴– 複数のノードが並行して挿入・削除する場合でも,

連結リストの構造は常に維持

– 挿入されたノードには必ず到達できる(ネットワーク分断が発生しない限り)

– 分散排他制御を用いない ⇒ ノード故障時に容易に修復可能

– アルゴリズムは単純で容易に実装可能

• 構造化オーバーレイネットワークに DDLLを適用した場合,– 信頼性の向上

– リンク修復処理の簡略化

• 今後の課題– DDLLを用いた構造化オーバーレイネットワークの実装と評価

2010.09.17

Page 26: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 262010.09.17

Page 27: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 27

予備スライド

2010.09.17

Page 28: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 28

検索アルゴリズム

• 前提 : 挿入しようとするノード u は何らかの方法で挿入済みのノード q を知っている

1. n:=q とする. q < u ならば p:=q.l ,そうでなければ p:=q.r

2. ord(n, u, n.r) = true ∧ n.s ≠ grace→ n と n.r がそれぞれ u の左ノード,右ノードの候補

3. ord(n,u,p) = true ∧ n.s ≠ grace→ p := n; n := n.r とし, 2 に戻る

4. p := n; n := n.l とし, 2 に戻る

2010.09.17

Page 29: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 29

楽観的アプローチの例 | Chord• A-D間にBとCを並行挿入した場合

• 定期的にスタビライズ処理を行って正常にする

• 到達できないノードが存在 !u.join() left = nil; right = b;

u.stabilize() x = right.left; if (x (u, right))∈ right = x; right.notify(u);

u.notify(n') if (left = nil or n' (left, u))∈ left = n'

2010.09.17

Page 30: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 30

排他制御アプローチとその問題点• 例 : a-b間にuを挿入する場合,aで排他制御するパターン

1. uはaにロック要求を送信

2. aはロックされていなければロックし,uにロック完了通知を送信

3. 応答を受信したuはaの右リンクとbの左リンクを変更

4. uはaにロック解放要求を送信

• 問題点1: 障害に弱い

– step 4の前にuが故障したらロックが解放されない

• タイムアウトでロック解放する方法は危険

• 問題点2: 性能上の問題

– ロックしている間,aの右側に他のノードは挿入できない

– ロックしている間,bは削除できない

2010.09.17

Page 31: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 31

同時挿入の例

右リンクミスマッチ

Bと Cが同時に Aと Dの間に挿入

SetLの到着順序が入れ替わっても問題ない2010.09.17

Page 32: 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL

DPS144 32

リンク不整合からの回復

• E が C を故障していると誤って判定した場合からの回復

2010.09.17