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

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