1 / 32

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

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

samira
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 構造化オーバーレイネットワークに適した分散双方向連結リストDDLL構造化オーバーレイネットワークに適した分散双方向連結リストDDLL 安倍広多 (大阪市立大学) 吉田幹 (BBR) DPS144

  2. 分散双方向連結リストとは • ネットワークで接続された複数のノードが双方向連結リストを構成 • 各ノードは右ノードと左ノードへのポインタ(IPアドレスなど)を保持 • 各ノードが保持するキーによってソートされている • 循環リストを想定 DPS144

  3. 分散双方向連結リストの応用例 • 構造化オーバーレイ(P2P)ネットワークでよく用いられる • Chord, Chord#, Symphony, Skip graph, SkipNet, etc. • 自律分散的に動作する分散双方向連結リストが必要 Skip Graph James Aspnes and Gauri Shah "Skip Graphs", ACM Trans. on Algorithm, 2007 DPS144

  4. 分散双方向連結リストの難しいところ • ノードは勝手なタイミングで挿入・削除 • 複数ノードが並行して挿入・削除するかも • ノードは削除手続きを実行せずに(勝手に)離脱・故障 • これらを考慮したアルゴリズムが必要 • ノード挿入 • ノード削除 • リンク修復 DPS144

  5. 従来の手法 • 楽観的アプローチ (Chordなど) • 周囲のノードを気にせずに挿入・削除 • 連結リストを理想的な状態に戻すために定期的に修復 • 利点: リンク修復が容易 • 欠点: (理想的な状態ではない間)到達できないノードが存在 • 排他制御アプローチ • 分散排他制御を用いて厳密に挿入・削除 • 利点: 挿入されているノードに必ず到達できる • 欠点: 障害からの回復が困難(ノードが故障した場合,ロックされたままに) • 挿入されているノードに必ず到達可能で,かつ障害からの回復が容易なアルゴリズムが欲しい DPS144

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

  7. 前提 • ノードの実行速度は任意 • ノード間の通信路: • 送信したメッセージはいずれ到着 • 伝送時間の上限はない • FIFOでなくてもよい • 全てのキーはユニーク(重複しない) • キーの後ろに十分なビット数の乱数を付け加えれば良い DPS144

  8. DDLLでの挿入・削除の基本的な流れ 挿入・削除のどちらの場合でも • まず,左ノードの右リンクを書き換える(右リンク更新処理) • 次に,右ノードの左リンクを書き換える(左リンク更新処理) 挿入 削除 SetRメッセージ右リンク更新要求 SetRAckメッセージ確認応答 SetLメッセージ左リンク更新要求 DPS144

  9. 右リンク更新処理 | 提案手法 分散排他制御を用いずに安全に右リンクを更新 a-b間にノードuを挿入する場合: • uは左リンクをaに,右リンクをbに張る • uはSetRメッセージで新リンク先(u)とaの現在の右リンク先(b)をaに送信 • aは,aが削除中ではなく,かつ右リンク先が等しい場合に限り右リンクを更新し,SetRAckを返す • 複数ノードが同時にa-b間に挿入しようとしても,SetRに成功するのは1つ → 分散排他制御不要 • aの右リンクがuになったとき,uの右リンクはbになっている→ 右リンクは途切れない(一瞬たりとも) DPS144

  10. 右リンク更新処理 | 例 • 複数ノードが同時にa-b間に挿入しようとしても,SetRに成功するのは1つ → 分散排他制御不要 • aの右リンクがuになったとき,uの右リンクはbになっている→ 右リンクは途切れない(一瞬たりとも) DPS144

  11. 左リンク更新処理 | 問題1 • 右リンクの更新に成功したら左リンクを更新 → SetRAckを受け取ったらSetLメッセージを送信 • SetLメッセージの到着順序はSetRの順番通りとは限らない! ? DPS144

  12. 左リンク更新処理 | 問題1の解決法 • SetLメッセージにシーケンス番号を付与 • SetLメッセージを送信する時点で同一ノードを宛先とするSetLメッセージのシーケンス番号を決定できる→ SetLメッセージを受信順序に関係なく処理可能 • 各ノードに右リンク番号と左リンク番号を割り当てる • 左リンク番号: 今までに受信したSetLメッセージの最大シーケンス番号 • 挿入直後は 0 • 右リンク番号: 右ノードの左リンク番号 • 基本的に左右のリンク番号は等しい(過渡的な状態を除けば) 0 0 DPS144

  13. 左リンク更新処理 | リンク番号の更新方法 • ノードが受信するSetLメッセージに,送信時点でシーケンス番号を付与できる 挿入 削除 DPS144

  14. 左リンク更新処理 | 同時挿入の例 Dの右リンク番号=6 Bの右リンク番号=4 Cの右リンク番号=5 SetLの到着順序が入れ替わっても問題ない! DPS144

  15. 左リンク更新処理 | 問題2 • このままだと左リンクが削除済みノードを指す場合がある • 左リンクを常に使えるようにするために... DPS144

  16. 左リンク更新処理 | 問題2の解決法 • 参照カウンタ(ref)の導入 • 左リンクによって参照されている数をカウント • SetRメッセージを受信 → 1加算 • UnrefLメッセージを受信 → 1減算 • SetLを受信したノードは変更前の左ノードにUnrefLメッセージを送信し,参照されなくなったことを通知 • ノードは ref = 0 になれば停止可能 DPS144

  17. 検索処理 • DDLLでは • 右リンクは常に正しいノードを指す • 左リンクは常に正しいとは限らない • これを考慮してリストをトラバースする必要がある • 左リンクを使うときは注意が必要 • 詳細は省略 DPS144

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

  19. リンク修復 • 故障したノードをバイパスして連結リストを修復 • 各ノードは左側のリンクを修復 • 左リンク番号を単調に増加させるため • 各ノードは,定期的に左ノードをチェック • 前提: 修復して接続するノードは求められる • 左側のk個のノードを保持しておくなど DPS144

  20. 修復時のリンク番号の問題 • 単純に左リンク番号を+1すると困る例 • Bの故障直前にXが挿入したが,Cはそのことを知らずに修復開始 • Cを右リンクとするノードが2つ存在し(A, X),右リンク番号も同一! • X-C間に新たなノードYが挿入されると,Cの左リンクはYを指してしまう DPS144

  21. 解決策(リンク番号の拡張) • リンク番号を(g, s)形式に拡張 • g: リンクを修復した回数 • s: 通常のシーケンス番号 • gが大きい方が優先 • リンク修復前の状態には戻らない DPS144

  22. 各ノードが保持する変数 • ノードの状態 • out リストから外れている • ins 挿入するために左ノードにSetR送信中 • inswait insでSetRNakを受信し,リトライ待ち • in 少なくとも右方向は挿入済み • del 削除するために左ノードにSetR送信中 • delwait delでSetRNakを受信し,リトライ待ち • grace 削除時に,refが0になるのを待機中 • キー • 右リンク(右ノードへのポインタとキー) • 左リンク(左ノードへのポインタとキー) • 右リンク番号 • 左リンク番号 • 参照カウンタ (ref) DPS144

  23. 詳細なアルゴリズム DPS144

  24. 本発表で割愛した点 • 検索アルゴリズム • 修復時の参照カウンタの取り扱い • ノード故障誤検出からの修復 • 生きているノードを(誤って)故障していると判断した場合でも回復できる • 挿入・削除時のノード故障の取り扱い • ノードの再挿入の取り扱い DPS144

  25. まとめ • 分散双方向連結リストを構築・維持する自律分散アルゴリズムDDLLを提案 • DDLLの特徴 • 複数のノードが並行して挿入・削除する場合でも,連結リストの構造は常に維持 • 挿入されたノードには必ず到達できる(ネットワーク分断が発生しない限り) • 分散排他制御を用いない ⇒ ノード故障時に容易に修復可能 • アルゴリズムは単純で容易に実装可能 • 構造化オーバーレイネットワークにDDLLを適用した場合, • 信頼性の向上 • リンク修復処理の簡略化 • 今後の課題 • DDLLを用いた構造化オーバーレイネットワークの実装と評価 DPS144

  26. DPS144

  27. 予備スライド DPS144

  28. 検索アルゴリズム • 前提: 挿入しようとするノードuは何らかの方法で挿入済みのノードqを知っている • n:=qとする.q < uならばp:=q.l,そうでなければp:=q.r • ord(n, u, n.r) = true ∧ n.s ≠ grace→ nと n.rがそれぞれ uの左ノード,右ノードの候補 • ord(n,u,p) = true ∧ n.s ≠ grace→ p := n; n := n.rとし,2に戻る • p := n; n := n.lとし,2 に戻る 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 orn' ∈ (left, u)) left = n' DPS144

  30. 排他制御アプローチとその問題点 • 例: a-b間にuを挿入する場合,aで排他制御するパターン • uはaにロック要求を送信 • aはロックされていなければロックし,uにロック完了通知を送信 • 応答を受信したuはaの右リンクとbの左リンクを変更 • uはaにロック解放要求を送信 • 問題点1: 障害に弱い • step 4の前にuが故障したらロックが解放されない • タイムアウトでロック解放する方法は危険 • 問題点2: 性能上の問題 • ロックしている間,aの右側に他のノードは挿入できない • ロックしている間,bは削除できない DPS144

  31. BとCが同時にAとDの間に挿入 同時挿入の例 右リンクミスマッチ SetLの到着順序が入れ替わっても問題ない DPS144

  32. リンク不整合からの回復 • EがCを故障していると誤って判定した場合からの回復 DPS144

More Related