kademlia-1227143905867010-8.pdf
-
Upload
hiroshi-ono -
Category
Documents
-
view
591 -
download
1
description
Transcript of kademlia-1227143905867010-8.pdf
10分で解る Kademlia と +α
幾田(cooldaemon)@Zero Co. Ltd.2008/11/20
第2回 Erlang 分散処理勉強会
12008年11月20日木曜日
自己紹介• id:cooldaemon
• Erlang 歴1年半くらい
• Kai Project では tcp_server 等
• DHT を知ったのは5ヶ月前
22008年11月20日木曜日
今日のお題
•Kademlia とは?
• (更新|削除) 操作の実現
• Kai に組み込めるのか?
32008年11月20日木曜日
Kademlia とは?
42008年11月20日木曜日
概要
•カデムリアと読む
• DHT を代表するアルゴリズムの一つ
• BitTorrent のトラッカーレス等に使用
52008年11月20日木曜日
基礎• ノードに ID として 160 ビットの数値を採番• キーは、SHA-1 で計算• 木のような構造上にノードを配置• ノードの距離 = 最大長 - プレフィクス一致長 - 1• 経路表は、距離毎にノード ID の一覧を持つ• メッセージは 4 種類• メッセージ受信により経路表を更新• メッセージは、転送されない• メッセージの送受信は非同期• プロトコルは UDP を使用
62008年11月20日木曜日
•ノードに ID として 160 ビットの数値を採番
•キーは、SHA-1 で計算
•木のような構造上にノードを配置
772008年11月20日木曜日
<ID が 4 ビットの例>
•ノードに ID として 160 ビットの数値を採番
•キーは、SHA-1 で計算
•木のような構造上にノードを配置
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
00
0
0 1
1
0 1
10
0 1
1
0 1
10
0
0 1
1
0 1
10
0 1
1
0 1
772008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0 12 3
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0
XOR プレフィックス一致長 I ノード ID0001 3 0 0100
0010 ~ 0011 2 1 011*0100 ~ 0111 1 2 00**1000 ~ 1111 0 3 1***
12 3
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0
XOR プレフィックス一致長 I ノード ID0001 3 0 0100
0010 ~ 0011 2 1 011*0100 ~ 0111 1 2 00**1000 ~ 1111 0 3 1***
12 3
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0
XOR プレフィックス一致長 I ノード ID0001 3 0 0100
0010 ~ 0011 2 1 011*0100 ~ 0111 1 2 00**1000 ~ 1111 0 3 1***
12 3
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0
XOR プレフィックス一致長 I ノード ID0001 3 0 0100
0010 ~ 0011 2 1 011*0100 ~ 0111 1 2 00**1000 ~ 1111 0 3 1***
12 3
82008年11月20日木曜日
•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010
0
XOR プレフィックス一致長 I ノード ID0001 3 0 0100
0010 ~ 0011 2 1 011*0100 ~ 0111 1 2 00**1000 ~ 1111 0 3 1***
上記表の I と ノード ID の列が 0101 の経路表
12 3
82008年11月20日木曜日
•経路表は、距離毎にノード ID のリストを持つ
92008年11月20日木曜日
•経路表は、距離毎にノード ID のリストを持つI ノードID 一覧0 ID11 ID2, D32 ID4, ID5, ID6, ID7
159 ID8, ID9,・・・, IDn
・・・
・・・
92008年11月20日木曜日
•経路表は、距離毎にノード ID のリストを持つI ノードID 一覧0 ID11 ID2, D32 ID4, ID5, ID6, ID7
159 ID8, ID9,・・・, IDn
・・・
・・・
• I の範囲は 0 ~ 159• I 毎に最大 k 個(例えば k = 20)の ID を保持• k-bucket と呼ばれる• ID は、参照時刻の古い順に並んでいる
92008年11月20日木曜日
•メッセージは 4 種類
10102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
102008年11月20日木曜日
•メッセージは 4 種類
10
種別 用途
PING 対象ノードの死活確認
STORE(Key, Value) 対象ノードにキーと値のペアを保持させる
FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得
FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ
•シンプル!
102008年11月20日木曜日
•メッセージ受信時に経路表を更新する
11112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信2. 1111 の経路表に 0000 を追加 0000
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信2. 1111 の経路表に 0000 を追加 0000
<1111 の経路表が溢れた場合>I ノードID3 0001, 0011, 0100
00011111
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信
1. 先頭の 0001 へ PING を送信
2. 1111 の経路表に 0000 を追加 0000
<1111 の経路表が溢れた場合>I ノードID3 0001, 0011, 0100
00011111
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信
1. 先頭の 0001 へ PING を送信
2. 1111 の経路表に 0000 を追加 0000
<1111 の経路表が溢れた場合>I ノードID3 0001, 0011, 0100
00011111
2. 0001 の応答が無ければ 0000 を経路表の末尾へ追加
0011, 0100, 0000
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
1. 0000 が 1111 にメッセージを送信
1. 先頭の 0001 へ PING を送信
2. 1111 の経路表に 0000 を追加 0000
<1111 の経路表が溢れた場合>I ノードID3 0001, 0011, 0100
00011111
2. 0001 の応答が無ければ 0000 を経路表の末尾へ追加
0011, 0100, 0000
3. 0001 の応答があれば 0001 を経路表の末尾へ移動
0011, 0100, 0001
112008年11月20日木曜日
<0000 の経路表に 1111 がある場合>0000
I ノードID3 1111
1111I ノードID3
• メッセージ受信時に経路表を更新する
11
• 経路表に対称性がある• churn 耐性がある
1. 0000 が 1111 にメッセージを送信
1. 先頭の 0001 へ PING を送信
2. 1111 の経路表に 0000 を追加 0000
<1111 の経路表が溢れた場合>I ノードID3 0001, 0011, 0100
00011111
2. 0001 の応答が無ければ 0000 を経路表の末尾へ追加
0011, 0100, 0000
3. 0001 の応答があれば 0001 を経路表の末尾へ移動
0011, 0100, 0001
112008年11月20日木曜日
•メッセージは転送されない
12122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key)
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
value
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
<メッセージ転送されない例>0000 0001
0011
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
<メッセージ転送されない例>0000 0001
0011
FIND_VALUE(key)
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
<メッセージ転送されない例>0000 0001
0011
FIND_VALUE(key)
{nodes, [0011]}
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
<メッセージ転送されない例>0000 0001
0011
FIND_VALUE(key)
{nodes, [0011]}FIND_VALUE(key)
122008年11月20日木曜日
0000
<メッセージ転送される例>
0001 0011
• メッセージは転送されない
12
FIND_VALUE(key) FIND_VALUE(key)
valuevalue
<メッセージ転送されない例>0000 0001
0011
FIND_VALUE(key)
{value, Value}
{nodes, [0011]}FIND_VALUE(key)
122008年11月20日木曜日
•メッセージの送受信は非同期
•プロトコルは UDP を使用
13132008年11月20日木曜日
0000
000100100011
010001010110
000100101001
000100101100
<FIND_XXXX α=3 の例>
•メッセージの送受信は非同期
•プロトコルは UDP を使用
13132008年11月20日木曜日
0000
000100100011
010001010110
000100101001
000100101100
<FIND_XXXX α=3 の例>
•メッセージの送受信は非同期
•プロトコルは UDP を使用
13132008年11月20日木曜日
0000
000100100011
010001010110
000100101001
000100101100
<FIND_XXXX α=3 の例>
•メッセージの送受信は非同期
•プロトコルは UDP を使用
13
• メッセージの不到達を許容•速度重視
132008年11月20日木曜日
実践•ノードの参加
•ノードの離脱
•キーと値の保存
•キーと値の探索
142008年11月20日木曜日
•ノードの参加
15152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加k 個を一気に!
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加 FIND_NODE(0000)k 個を一気に!
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加 FIND_NODE(0000) 0000 を経路表に追加k 個を一気に!
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)
k 個を一気に!
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)ノード一覧を
経路表に追加
k 個を一気に!
STORE
152008年11月20日木曜日
<ermlia の場合>
0000 0001 ****
• ノードの参加
15
PING 0000 を経路表に追加0001 を
経路表に追加0001
FIND_NODE(0000)ノード一覧(k 個)ノード一覧を
経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)ノード一覧を
経路表に追加
k 個を一気に!
STORE
STORE
152008年11月20日木曜日
•ノードの離脱
16162008年11月20日木曜日
•ノードの離脱
16
無視勝手に落ちればぁ?
162008年11月20日木曜日
•キーと値の保存
17172008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の保存
17172008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の保存
17
1. クライアントからキーと値のペアをもらう
<Key, Value>
172008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の保存
17
1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する
<Key, Value>
172008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の保存
17
1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する3. キーに近いノードを k 個選ぶ
<Key, Value>
172008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の保存
17
1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する3. キーに近いノードを k 個選ぶ4. 選んだノード k 個にキーと値のペアを STORE する
<Key, Value>STORE(Key, Value)
172008年11月20日木曜日
•キーと値の探索
18182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう
<Key>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了
<Key><Value>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了
<Key>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)
<Key>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する
<Key>FIND_VALUE(Key)
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する5. α 個の問い合わせ結果に、キーとペアの値があるなら、値をクライアントへ返して終了
<Key>FIND_VALUE(Key){value, Value}
<Value>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する5. α 個の問い合わせ結果に、キーとペアの値があるなら、値をクライアントへ返して終了
<Key>
182008年11月20日木曜日
<ermlia の場合>
クライアント
•キーと値の探索
18
1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する5. α 個の問い合わせ結果に、キーとペアの値があるなら、値をクライアントへ返して終了6. [3.] で得たノート一覧と [5.] で得たノード一覧をマージ&ソートして [4.] へ
<Key>FIND_V
ALUE(Key)
{nodes, [...]}
FIND_VALUE(Key){value, Value}
<Value>
182008年11月20日木曜日
参考資料
• P2P教科書 (インプレス標準教科書シリーズ)
• http://d.hatena.ne.jp/ytakano/20080507/1210136628
• http://www.shudo.net/article/Kademlia-20040727/
192008年11月20日木曜日
(更新|削除) 操作の実現
202008年11月20日木曜日
特性
212008年11月20日木曜日
特性•Kademlia は、隙あらばデータを複製しまくる!
• データが失われ難い
• 読み取りの性能が高い
212008年11月20日木曜日
特性•Kademlia は、隙あらばデータを複製しまくる!
• データが失われ難い
• 読み取りの性能が高い
•データには TTL を付加するのが基本
• データ保持の為、定期的に STORE する必要がある
212008年11月20日木曜日
問題点
222008年11月20日木曜日
問題点•程よい TTL を決定する事は困難
•そもそも頻繁に更新される用途では使えない
222008年11月20日木曜日
問題点•程よい TTL を決定する事は困難
•そもそも頻繁に更新される用途では使えない
•全ての複製を持つノードに更新・削除を伝播させる事も困難
• Chord 以上に難しい・・・
222008年11月20日木曜日
更新の実現•ノード・コントローラの導入
•UDP マルチキャスト + Vector Clocks
• P2P層とレプリケーション層の分離
• Kademlia にお任せ + Vector Clocks
232008年11月20日木曜日
•ノード・コントローラの導入
24242008年11月20日木曜日
•ノード・コントローラの導入
• P2P 教科書の SkeedCast を見て思いつく
24242008年11月20日木曜日
•ノード・コントローラの導入
• P2P 教科書の SkeedCast を見て思いつく
• ノード・コントローラに複製の位置を持たせよう!
24242008年11月20日木曜日
•ノード・コントローラの導入
• P2P 教科書の SkeedCast を見て思いつく
• ノード・コントローラに複製の位置を持たせよう!
• でも、それだと分散ハッシュではなくなる...
24242008年11月20日木曜日
•ノード・コントローラの導入
• P2P 教科書の SkeedCast を見て思いつく
• ノード・コントローラに複製の位置を持たせよう!
• でも、それだと分散ハッシュではなくなる...
• ノード・コントローラを Mnesia 等で冗長しないと...
24242008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks
25252008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!
25252008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!
• Erlang なら UDP マルチキャストも楽勝!
25252008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!
• Erlang なら UDP マルチキャストも楽勝!
• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?
25252008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!
• Erlang なら UDP マルチキャストも楽勝!
• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?
• 利用者は、ルータ越えの設定をする必要がある
25252008年11月20日木曜日
• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!
• Erlang なら UDP マルチキャストも楽勝!
• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?
• 利用者は、ルータ越えの設定をする必要がある
• ↑これを利用者が考慮し始めた時点でオーバーレイ・ネットワークの恩恵が受けられていないのではないか?
25252008年11月20日木曜日
• P2P層とレプリケーション層の分離
26262008年11月20日木曜日
• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ
26262008年11月20日木曜日
• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ
• Chord# + 定数ベースプロトコル + Paxos コミット
26262008年11月20日木曜日
• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ
• Chord# + 定数ベースプロトコル + Paxos コミット
• 現在、調査中... (ごめんなさい!)
26262008年11月20日木曜日
• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ
• Chord# + 定数ベースプロトコル + Paxos コミット
• 現在、調査中... (ごめんなさい!)
• Kademlia では、あるデータを持つ全てのノードを完全に特定できない為Paxos コミット と併用できない
26262008年11月20日木曜日
• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ
• Chord# + 定数ベースプロトコル + Paxos コミット
• 現在、調査中... (ごめんなさい!)
• Kademlia では、あるデータを持つ全てのノードを完全に特定できない為Paxos コミット と併用できない
• 蛇足だが、同じ理由で定数ベースプロトコルも使えない
26262008年11月20日木曜日
• Kademlia にお任せ + Vector Clocks
27272008年11月20日木曜日
• Kademlia にお任せ + Vector Clocks
•初回 STORE 送信時にクロックを付加する
27272008年11月20日木曜日
• Kademlia にお任せ + Vector Clocks
•初回 STORE 送信時にクロックを付加する
•更新の伝播は Kademlia に全て任せる
27272008年11月20日木曜日
• Kademlia にお任せ + Vector Clocks
•初回 STORE 送信時にクロックを付加する
•更新の伝播は Kademlia に全て任せる
•削除の伝播にエピデミックアルゴリズムと同じ問題があるので死亡証明書を利用する必要がある
27272008年11月20日木曜日
削除の実現
•死亡証明書
•休眠中死亡証明書
282008年11月20日木曜日
•死亡証明書
29292008年11月20日木曜日
•死亡証明書
•データの削除 = クロック情報の削除
29292008年11月20日木曜日
•死亡証明書
•データの削除 = クロック情報の削除
•削除後に古いデータを受け取る可能性がある
29292008年11月20日木曜日
•死亡証明書
•データの削除 = クロック情報の削除
•削除後に古いデータを受け取る可能性がある
•データの削除 = 削除記録(死亡証明書)の保存とし、クロック情報を残す事で古いデータの上書きを回避
29292008年11月20日木曜日
•死亡証明書
•データの削除 = クロック情報の削除
•削除後に古いデータを受け取る可能性がある
•データの削除 = 削除記録(死亡証明書)の保存とし、クロック情報を残す事で古いデータの上書きを回避
•死亡証明書が永遠に溜まり続ける
29292008年11月20日木曜日
•休眠中死亡証明書
30302008年11月20日木曜日
•休眠中死亡証明書
• TTL 付き死亡証明書(一定時間毎に削除される)
30302008年11月20日木曜日
•休眠中死亡証明書
• TTL 付き死亡証明書(一定時間毎に削除される)
•全てのノードに死亡証明書が伝播されない可能性がある為ごく少数の一部のノードに休眠中の死亡証明書を残しておく必要がある
30302008年11月20日木曜日
•休眠中死亡証明書
• TTL 付き死亡証明書(一定時間毎に削除される)
•全てのノードに死亡証明書が伝播されない可能性がある為ごく少数の一部のノードに休眠中の死亡証明書を残しておく必要がある
•休眠中の死亡証明書を持つノードに古いデータが STORE された場合再び、TTL 付き死亡証明書を伝播させる
30302008年11月20日木曜日
参考資料
• 分散システムー原理とパラダイム
• http://www-higashi.ist.osaka-u.ac.jp/~nakata/mobile-cp/
• http://www.onscale.de/Reinefeld_Erlang_Exchange.pdf
• http://www.hyuki.com/yukiwiki/wiki.cgi?EventuallyConsistent
312008年11月20日木曜日
Kai に組み込めるのか?
322008年11月20日木曜日
33
考慮すべき点
332008年11月20日木曜日
•利点•仕様がシンプルで実装が容易• Churn 耐性が高い•速度重視•書き込み成功率が高い
33
考慮すべき点
332008年11月20日木曜日
•利点•仕様がシンプルで実装が容易• Churn 耐性が高い•速度重視•書き込み成功率が高い•不利点•あるデータを持つ全てのノードを特定できない(大きな問題)
33
考慮すべき点
332008年11月20日木曜日
34
Kai プロジェクトへ提案
342008年11月20日木曜日
• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義
34
Kai プロジェクトへ提案
342008年11月20日木曜日
• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義
• Churn 耐性は Chord で十分実用的ではないか?
34
Kai プロジェクトへ提案
342008年11月20日木曜日
• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義
• Churn 耐性は Chord で十分実用的ではないか?• Kademlia に影響を受けた EpiChord はどうか?• メッセージ受信時に経路表を更新• メッセージを非同期で送信
34
Kai プロジェクトへ提案
342008年11月20日木曜日
• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義
• Churn 耐性は Chord で十分実用的ではないか?• Kademlia に影響を受けた EpiChord はどうか?• メッセージ受信時に経路表を更新• メッセージを非同期で送信
•と言う事で、EpiChord の採用検討を提案34
Kai プロジェクトへ提案
342008年11月20日木曜日
ご清聴ありがとうございました
352008年11月20日木曜日