More Related Content
Similar to 構造化オーバーレイネットワークに適した分散双方向連結リストDDLL (9)
構造化オーバーレイネットワークに適した分散双方向連結リストDDLL
- 5. 従来の手法 楽観的アプローチ (Chordなど) 周囲のノードを気にせずに挿入・削除 連結リストを理想的な状態に戻すために定期的に修復 利点: リンク修復が容易 欠点: (理想的な状態ではない間)到達できないノードが存在 排他制御アプローチ 分散排他制御を用いて厳密に挿入・削除 利点: 挿入されているノードに必ず到達できる 欠点: 障害からの回復が困難(ノードが故障した場合,ロックされたままに) 挿入されているノードに必ず到達可能で,かつ障害からの回復が容易なアルゴリズムが欲しい 2010.09.17 5 DPS144
- 7. 前提 ノードの実行速度は任意 ノード間の通信路: 送信したメッセージはいずれ到着 伝送時間の上限はない FIFOでなくてもよい 全てのキーはユニーク(重複しない) キーの後ろに十分なビット数の乱数を付け加えれば良い 2010.09.17 7 DPS144
- 13. 左リンク更新処理 | 問題1 右リンクの更新に成功したら左リンクを更新 -> SetRAckを受け取ったらSetLメッセージを送信 SetLメッセージの到着順序はSetRの順番通りとは限らない! ? 2010.09.17 11 DPS144
- 14. 左リンク更新処理 | 問題1の解決法 SetLメッセージにシーケンス番号を付与 SetLメッセージを送信する時点で同一ノードを宛先とするSetLメッセージのシーケンス番号を決定できる-> SetLメッセージを受信順序に関係なく処理可能 各ノードに右リンク番号と左リンク番号を割り当てる 左リンク番号: 今までに受信したSetLメッセージの最大シーケンス番号 挿入直後は 0 右リンク番号: 右ノードの左リンク番号 基本的に左右のリンク番号は等しい(過渡的な状態を除けば) 0 0 2010.09.17 12 DPS144
- 18. 左リンク更新処理 | 問題2の解決法 参照カウンタ(ref)の導入 左リンクによって参照されている数をカウント SetRメッセージを受信 -> 1加算 UnrefLメッセージを受信 -> 1減算 SetLを受信したノードは変更前の左ノードにUnrefLメッセージを送信し,参照されなくなったことを通知 ノードは ref = 0 になれば停止可能 2010.09.17 16 DPS144
- 24. 各ノードが保持する変数 ノードの状態 out リストから外れている ins 挿入するために左ノードにSetR送信中 inswait insでSetRNakを受信し,リトライ待ち in 少なくとも右方向は挿入済み del 削除するために左ノードにSetR送信中 delwait delでSetRNakを受信し,リトライ待ち grace 削除時に,refが0になるのを待機中 キー 右リンク(右ノードへのポインタとキー) 左リンク(左ノードへのポインタとキー) 右リンク番号 左リンク番号 参照カウンタ (ref) 2010.09.17 22 DPS144
- 27. まとめ 分散双方向連結リストを構築・維持する自律分散アルゴリズムDDLLを提案 DDLLの特徴 複数のノードが並行して挿入・削除する場合でも,連結リストの構造は常に維持 挿入されたノードには必ず到達できる(ネットワーク分断が発生しない限り) 分散排他制御を用いない ⇒ ノード故障時に容易に修復可能 アルゴリズムは単純で容易に実装可能 構造化オーバーレイネットワークにDDLLを適用した場合, 信頼性の向上 リンク修復処理の簡略化 今後の課題 DDLLを用いた構造化オーバーレイネットワークの実装と評価 2010.09.17 25 DPS144
- 30. 検索アルゴリズム 前提: 挿入しようとするノード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 に戻る 2010.09.17 28 DPS144
- 31. 楽観的アプローチの例 | 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' 2010.09.17 29 DPS144
- 32. 排他制御アプローチとその問題点 例: a-b間にuを挿入する場合,aで排他制御するパターン uはaにロック要求を送信 aはロックされていなければロックし,uにロック完了通知を送信 応答を受信したuはaの右リンクとbの左リンクを変更 uはaにロック解放要求を送信 問題点1: 障害に弱い step 4の前にuが故障したらロックが解放されない タイムアウトでロック解放する方法は危険 問題点2: 性能上の問題 ロックしている間,aの右側に他のノードは挿入できない ロックしている間,bは削除できない 2010.09.17 30 DPS144