Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
構造化オーバーレイネットワークに適した分散双方向連結リストDDLL<br />安倍広多 (大阪市立大学)<br />吉田幹 (BBR)<br />2010.09.17<br />1<br />DPS144<br />
分散双方向連結リストとは<br />ネットワークで接続された複数のノードが双方向連結リストを構成<br />各ノードは右ノードと左ノードへのポインタ(IPアドレスなど)を保持<br />各ノードが保持するキーによってソートされている<br />...
分散双方向連結リストの応用例<br />構造化オーバーレイ(P2P)ネットワークでよく用いられる<br />Chord, Chord#, Symphony,  Skip graph, SkipNet, etc.<br />自律分散的に動作する分...
分散双方向連結リストの難しいところ<br />ノードは勝手なタイミングで挿入・削除<br />複数ノードが並行して挿入・削除するかも<br />ノードは削除手続きを実行せずに(勝手に)離脱・故障<br />これらを考慮したアルゴリズムが必要<b...
従来の手法<br />楽観的アプローチ (Chordなど)<br />周囲のノードを気にせずに挿入・削除<br />連結リストを理想的な状態に戻すために定期的に修復<br />利点: リンク修復が容易<br />欠点: (理想的な状態ではない間...
DDLLアルゴリズム(障害を考慮しないバージョン)<br />2010.09.17<br />6<br />DPS144<br />
前提<br />ノードの実行速度は任意<br />ノード間の通信路:<br />送信したメッセージはいずれ到着<br />伝送時間の上限はない<br />FIFOでなくてもよい<br />全てのキーはユニーク(重複しない)<br />キーの後ろ...
DDLLでの挿入・削除の基本的な流れ<br />挿入・削除のどちらの場合でも<br />まず,左ノードの右リンクを書き換える(右リンク更新処理)<br />次に,右ノードの左リンクを書き換える(左リンク更新処理)<br />挿入<br />削除...
右リンク更新処理 | 提案手法<br />分散排他制御を用いずに安全に右リンクを更新<br />a-b間にノードuを挿入する場合:<br />uは左リンクをaに,右リンクをbに張る<br />uはSetRメッセージで新リンク先(u)とaの現在の...
aの右リンクがuになったとき,uの右リンクはbになっている-> 右リンクは途切れない(一瞬たりとも)</li></ul>2010.09.17<br />9<br />DPS144<br />
右リンク更新処理 | 例<br /><ul><li>複数ノードが同時にa-b間に挿入しようとしても,SetRに成功するのは1つ	-> 分散排他制御不要
aの右リンクがuになったとき,uの右リンクはbになっている-> 右リンクは途切れない(一瞬たりとも)</li></ul>2010.09.17<br />10<br />DPS144<br />
左リンク更新処理 | 問題1<br />右リンクの更新に成功したら左リンクを更新<br />-> SetRAckを受け取ったらSetLメッセージを送信<br />SetLメッセージの到着順序はSetRの順番通りとは限らない!<br />?<br...
左リンク更新処理 | 問題1の解決法<br />SetLメッセージにシーケンス番号を付与<br />SetLメッセージを送信する時点で同一ノードを宛先とするSetLメッセージのシーケンス番号を決定できる-> SetLメッセージを受信順序に関係な...
左リンク更新処理 | リンク番号の更新方法<br />挿入<br />削除<br />ノードが受信するSetLメッセージに,送信時点でシーケンス番号を付与できる<br />2010.09.17<br />13<br />DPS144<br />
Dの右リンク番号=6<br />左リンク更新処理 | 同時挿入の例<br />Bの右リンク番号=4<br />Cの右リンク番号=5<br />SetLの到着順序が入れ替わっても問題ない!<br />2010.09.17<br />14<br /...
左リンク更新処理 | 問題2<br />このままだと左リンクが削除済みノードを指す場合がある<br /><ul><li>左リンクを常に使えるようにするために... </li></ul>2010.09.17<br />15<br />DPS144...
左リンク更新処理 | 問題2の解決法<br />参照カウンタ(ref)の導入<br />左リンクによって参照されている数をカウント<br />SetRメッセージを受信		->	1加算<br />UnrefLメッセージを受信	->	1減算<br ...
検索処理<br />DDLLでは<br />右リンクは常に正しいノードを指す<br />左リンクは常に正しいとは限らない<br />これを考慮してリストをトラバースする必要がある<br />左リンクを使うときは注意が必要<br />詳細は省略<...
DDLLアルゴリズム(障害を考慮するバージョン)<br />2010.09.17<br />18<br />DPS144<br />
リンク修復<br />故障したノードをバイパスして連結リストを修復<br />各ノードは左側のリンクを修復<br />左リンク番号を単調に増加させるため<br />各ノードは,定期的に左ノードをチェック<br />前提: 修復して接続するノード...
修復時のリンク番号の問題<br />単純に左リンク番号を+1すると困る例<br />Bの故障直前にXが挿入したが,Cはそのことを知らずに修復開始<br />Cを右リンクとするノードが2つ存在し(A, X),右リンク番号も同一!<br />X-C...
解決策(リンク番号の拡張)<br />リンク番号を(g, s)形式に拡張<br />g: リンクを修復した回数<br />s: 通常のシーケンス番号<br />gが大きい方が優先<br />リンク修復前の状態には戻らない<br />2010.0...
各ノードが保持する変数<br />ノードの状態<br />out			リストから外れている<br />ins				挿入するために左ノードにSetR送信中<br />inswait		insでSetRNakを受信し,リトライ待ち<br />in...
詳細なアルゴリズム<br />2010.09.17<br />23<br />DPS144<br />
本発表で割愛した点<br />検索アルゴリズム<br />修復時の参照カウンタの取り扱い<br />ノード故障誤検出からの修復<br />生きているノードを(誤って)故障していると判断した場合でも回復できる<br />挿入・削除時のノード故障の...
まとめ<br />分散双方向連結リストを構築・維持する自律分散アルゴリズムDDLLを提案<br />DDLLの特徴<br />複数のノードが並行して挿入・削除する場合でも,連結リストの構造は常に維持<br />挿入されたノードには必ず到達できる...
2010.09.17<br />26<br />DPS144<br />
予備スライド<br />2010.09.17<br />27<br />DPS144<br />
検索アルゴリズム<br />前提: 挿入しようとするノードuは何らかの方法で挿入済みのノードqを知っている<br />n:=qとする.q < uならばp:=q.l,そうでなければp:=q.r<br />ord(n, u, n.r) = true...
楽観的アプローチの例 | Chord<br />A-D間にBとCを並行挿入した場合<br />定期的にスタビライズ処理を行って正常にする<br />到達できないノードが存在!<br />u.join()<br />  left = nil; r...
排他制御アプローチとその問題点<br />例: a-b間にuを挿入する場合,aで排他制御するパターン<br />uはaにロック要求を送信<br />aはロックされていなければロックし,uにロック完了通知を送信<br />応答を受信したuはaの右...
Nächste SlideShare
Wird geladen in …5
×

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

2.428 Aufrufe

Veröffentlicht am

a presentation of the DDLL algorithm, which constructs and maintains distributed doubly-linked lists.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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

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

×