Download - 構造化オーバーレイネットワークに適した 分散双方向連結リスト DDLL
構造化オーバーレイネットワークに適した分散双方向連結リスト DDLL
安倍 広多 ( 大阪市立大学 )吉田 幹 (BBR)
2010.09.17
DPS144 2
分散双方向連結リストとは
• ネットワークで接続された複数のノードが双方向連結リストを構成
– 各ノードは右ノードと左ノードへのポインタ(IPアドレスなど )を保持
– 各ノードが保持するキーによってソートされている
– 循環リストを想定
2010.09.17
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
DPS144 4
分散双方向連結リストの難しいところ
• ノードは勝手なタイミングで挿入・削除– 複数ノードが並行して挿入・削除するかも
• ノードは削除手続きを実行せずに(勝手に)離脱・故障
• これらを考慮したアルゴリズムが必要– ノード挿入
– ノード削除
– リンク修復2010.09.17
DPS144 5
従来の手法
1. 楽観的アプローチ (Chordなど )– 周囲のノードを気にせずに挿入・削除
– 連結リストを理想的な状態に戻すために定期的に修復
– 利点 : リンク修復が容易
– 欠点 : (理想的な状態ではない間)到達できないノードが存在
2. 排他制御アプローチ
– 分散排他制御を用いて厳密に挿入・削除
– 利点 : 挿入されているノードに必ず到達できる
– 欠点 : 障害からの回復が困難(ノードが故障した場合,ロックされたままに)
挿入されているノードに必ず到達可能で,かつ障害からの回復が容易なアルゴリズムが欲しい
2010.09.17
DPS144 6
DDLL アルゴリズム(障害を考慮しないバージョン)
2010.09.17
DPS144 7
前提
• ノードの実行速度は任意
• ノード間の通信路:–送信したメッセージはいずれ到着
–伝送時間の上限はない
– FIFO でなくてもよい
• 全てのキーはユニーク(重複しない)–キーの後ろに十分なビット数の乱数を
付け加えれば良い
2010.09.17
DPS144 8
DDLL での挿入・削除の基本的な流れ
挿入・削除のどちらの場合でも
1. まず,左ノードの右リンクを書き換える(右リンク更新処理)
2. 次に,右ノードの左リンクを書き換える(左リンク更新処理)削除挿入
SetRメッセージ 右リンク更新要求SetRAckメッセージ 確認応答SetLメッセージ 左リンク更新要求
2010.09.17
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
DPS144 10
右リンク更新処理 | 例•複数ノードが同時に a-b 間に挿入しようとしても, SetR に成功するのは 1 つ
→ 分散排他制御不要
•a の右リンクが u になったとき, u の右リンクは b になっている
→ 右リンクは途切れない(一瞬たりとも)
2010.09.17
DPS144 11
左リンク更新処理 | 問題 1• 右リンクの更新に成功したら左リンクを更新
→ SetRAck を受け取ったら SetL メッセージを送信
• SetL メッセージの到着順序は SetR の順番通りとは限らない !
?2010.09.17
DPS144 12
左リンク更新処理 | 問題 1 の解決法
• SetLメッセージにシーケンス番号を付与
– SetLメッセージを送信する時点で同一ノードを宛先とする
SetLメッセージのシーケンス番号を決定できる
→ SetL メッセージを受信順序に関係なく処理可能
• 各ノードに右リンク番号と左リンク番号を割り当てる
– 左リンク番号 : 今までに受信したSetL メッセージの最大シーケンス番
号
• 挿入直後は 0– 右リンク番号 : 右ノードの左リンク番号
– 基本的に左右のリンク番号は等しい(過渡的な状態を除けば)
0
02010.09.17
DPS144 13
削除
左リンク更新処理 | リンク番号の更新方法
挿入
• ノードが受信する SetL メッセージに,送信時点でシーケンス番号を付与できる
2010.09.17
DPS144 14
Dの右リンク番号 =6
左リンク更新処理 | 同時挿入の例
SetLの到着順序が入れ替わっても問題ない!
Bの右リンク番号 =4
Cの右リンク番号 =5
2010.09.17
DPS144 15
左リンク更新処理 | 問題 2• このままだと左リンクが削除済みノードを指す場合がある
• 左リンクを常に使えるようにするために ...
2010.09.17
DPS144 16
左リンク更新処理 | 問題 2 の解決法• 参照カウンタ (ref)の導入
– 左リンクによって参照されている数をカウント
– SetRメッセージを受信 → 1加算
– UnrefLメッセージを受信 → 1減算• SetLを受信したノードは変更前の左ノードにUnrefLメッセージを送信し,
参照されなくなったことを通知
• ノードは ref = 0 になれば停止可能
2010.09.17
DPS144 17
検索処理
• DDLL では–右リンクは常に正しいノードを指す
–左リンクは常に正しいとは限らない
• これを考慮してリストをトラバースする必要がある–左リンクを使うときは注意が必要
–詳細は省略
2010.09.17
DPS144 18
DDLL アルゴリズム(障害を考慮するバージョン)
2010.09.17
DPS144 19
リンク修復
• 故障したノードをバイパスして連結リストを修復
• 各ノードは左側のリンクを修復– 左リンク番号を単調に増加させるため
– 各ノードは,定期的に左ノードをチェック
• 前提 : 修復して接続するノードは求められる– 左側の k個のノードを保持しておくなど
2010.09.17
DPS144 20
修復時のリンク番号の問題• 単純に左リンク番号を +1
すると困る例
• B の故障直前に X が挿入したが, C はそのことを知らずに修復開始
• C を右リンクとするノードが 2 つ存在し (A, X) ,右リンク番号も同一 !
• X-C 間に新たなノード Y が挿入されると, C の左リンクは Y を指してしまう
2010.09.17
DPS144 21
解決策 ( リンク番号の拡張 )• リンク番号を (g, s)形式に拡張– g: リンクを修復した回数
– s: 通常のシーケンス番号
• g が大きい方が優先
• リンク修復前の状態には戻らない
2010.09.17
DPS144 22
各ノードが保持する変数• ノードの状態
– out リストから外れている
– ins 挿入するために左ノードにSetR送信中
– inswait insでSetRNakを受信し,リトライ待ち
– in 少なくとも右方向は挿入済み
– del 削除するために左ノードにSetR送信中
– delwait delでSetRNakを受信し,リトライ待ち
– grace 削除時に, refが0になるのを待機中
• キー
• 右リンク(右ノードへのポインタとキー)
• 左リンク(左ノードへのポインタとキー)
• 右リンク番号
• 左リンク番号
• 参照カウンタ (ref)
2010.09.17
DPS144 23
詳細なアルゴリズム
2010.09.17
DPS144 24
本発表で割愛した点
• 検索アルゴリズム
• 修復時の参照カウンタの取り扱い
• ノード故障誤検出からの修復–生きているノードを (誤って ) 故障している
と判断した場合でも回復できる
• 挿入・削除時のノード故障の取り扱い
• ノードの再挿入の取り扱い
2010.09.17
DPS144 25
まとめ• 分散双方向連結リストを構築・維持する自律分散アルゴリズム DDLL
を提案
• DDLLの特徴– 複数のノードが並行して挿入・削除する場合でも,
連結リストの構造は常に維持
– 挿入されたノードには必ず到達できる(ネットワーク分断が発生しない限り)
– 分散排他制御を用いない ⇒ ノード故障時に容易に修復可能
– アルゴリズムは単純で容易に実装可能
• 構造化オーバーレイネットワークに DDLLを適用した場合,– 信頼性の向上
– リンク修復処理の簡略化
• 今後の課題– DDLLを用いた構造化オーバーレイネットワークの実装と評価
2010.09.17
DPS144 262010.09.17
DPS144 27
予備スライド
2010.09.17
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
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
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
DPS144 31
同時挿入の例
右リンクミスマッチ
Bと Cが同時に Aと Dの間に挿入
SetLの到着順序が入れ替わっても問題ない2010.09.17
DPS144 32
リンク不整合からの回復
• E が C を故障していると誤って判定した場合からの回復
2010.09.17