Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
構造化オーバーレイネットワークに適した分散双方向連結リスト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の右...
Prochain SlideShare
Chargement dans…5
×

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

2 440 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

構造化オーバーレイネットワークに適した分散双方向連結リスト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 />

×