kademlia-1227143905867010-8.pdf

136
10分で解る Kademlia と +α 幾田(cooldaemon)@Zero Co. Ltd. 2008/11/20 第2回 Erlang 分散処理勉強会 1 20081120日木曜日

description

 

Transcript of kademlia-1227143905867010-8.pdf

Page 1: kademlia-1227143905867010-8.pdf

10分で解る Kademlia と +α

幾田(cooldaemon)@Zero Co. Ltd.2008/11/20

第2回 Erlang 分散処理勉強会

12008年11月20日木曜日

Page 2: kademlia-1227143905867010-8.pdf

自己紹介• id:cooldaemon

• Erlang 歴1年半くらい

• Kai Project では tcp_server 等

• DHT を知ったのは5ヶ月前

22008年11月20日木曜日

Page 3: kademlia-1227143905867010-8.pdf

今日のお題

•Kademlia とは?

• (更新|削除) 操作の実現

• Kai に組み込めるのか?

32008年11月20日木曜日

Page 4: kademlia-1227143905867010-8.pdf

Kademlia とは?

42008年11月20日木曜日

Page 5: kademlia-1227143905867010-8.pdf

概要

•カデムリアと読む

• DHT を代表するアルゴリズムの一つ

• BitTorrent のトラッカーレス等に使用

52008年11月20日木曜日

Page 6: kademlia-1227143905867010-8.pdf

基礎• ノードに ID として 160 ビットの数値を採番• キーは、SHA-1 で計算• 木のような構造上にノードを配置• ノードの距離 = 最大長 - プレフィクス一致長 - 1• 経路表は、距離毎にノード ID の一覧を持つ• メッセージは 4 種類• メッセージ受信により経路表を更新• メッセージは、転送されない• メッセージの送受信は非同期• プロトコルは UDP を使用

62008年11月20日木曜日

Page 7: kademlia-1227143905867010-8.pdf

•ノードに ID として 160 ビットの数値を採番

•キーは、SHA-1 で計算

•木のような構造上にノードを配置

772008年11月20日木曜日

Page 8: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 9: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 1

82008年11月20日木曜日

Page 10: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010

82008年11月20日木曜日

Page 11: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 1<0101 からの距離>

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1011 1100 1101 1110 11111010

0 12 3

82008年11月20日木曜日

Page 12: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 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日木曜日

Page 13: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 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日木曜日

Page 14: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 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日木曜日

Page 15: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 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日木曜日

Page 16: kademlia-1227143905867010-8.pdf

•ノードの距離 = 最大長 - プレフィクス一致長 - 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日木曜日

Page 17: kademlia-1227143905867010-8.pdf

•経路表は、距離毎にノード ID のリストを持つ

92008年11月20日木曜日

Page 18: kademlia-1227143905867010-8.pdf

•経路表は、距離毎にノード ID のリストを持つI ノードID 一覧0 ID11 ID2, D32 ID4, ID5, ID6, ID7

159 ID8, ID9,・・・, IDn

・・・

・・・

92008年11月20日木曜日

Page 19: kademlia-1227143905867010-8.pdf

•経路表は、距離毎にノード 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日木曜日

Page 20: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10102008年11月20日木曜日

Page 21: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

102008年11月20日木曜日

Page 22: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

102008年11月20日木曜日

Page 23: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

102008年11月20日木曜日

Page 24: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

102008年11月20日木曜日

Page 25: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

102008年11月20日木曜日

Page 26: kademlia-1227143905867010-8.pdf

•メッセージは 4 種類

10

種別 用途

PING 対象ノードの死活確認

STORE(Key, Value) 対象ノードにキーと値のペアを保持させる

FIND_NODE(ID) 対象ノードから ID に近いノードを k 個取得

FIND_VALUE(Key) 対象ノードからキーの値を取得値が無い場合は、FIND_NODE と同じ

•シンプル!

102008年11月20日木曜日

Page 27: kademlia-1227143905867010-8.pdf

•メッセージ受信時に経路表を更新する

11112008年11月20日木曜日

Page 28: kademlia-1227143905867010-8.pdf

<0000 の経路表に 1111 がある場合>0000

I ノードID3 1111

1111I ノードID3

• メッセージ受信時に経路表を更新する

11112008年11月20日木曜日

Page 29: kademlia-1227143905867010-8.pdf

<0000 の経路表に 1111 がある場合>0000

I ノードID3 1111

1111I ノードID3

• メッセージ受信時に経路表を更新する

11

1. 0000 が 1111 にメッセージを送信

112008年11月20日木曜日

Page 30: kademlia-1227143905867010-8.pdf

<0000 の経路表に 1111 がある場合>0000

I ノードID3 1111

1111I ノードID3

• メッセージ受信時に経路表を更新する

11

1. 0000 が 1111 にメッセージを送信2. 1111 の経路表に 0000 を追加 0000

112008年11月20日木曜日

Page 31: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 32: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 33: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 34: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 35: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 36: kademlia-1227143905867010-8.pdf

•メッセージは転送されない

12122008年11月20日木曜日

Page 37: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12122008年11月20日木曜日

Page 38: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key)

122008年11月20日木曜日

Page 39: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

122008年11月20日木曜日

Page 40: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

value

122008年11月20日木曜日

Page 41: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

valuevalue

122008年11月20日木曜日

Page 42: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

valuevalue

<メッセージ転送されない例>0000 0001

0011

122008年11月20日木曜日

Page 43: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

valuevalue

<メッセージ転送されない例>0000 0001

0011

FIND_VALUE(key)

122008年11月20日木曜日

Page 44: kademlia-1227143905867010-8.pdf

0000

<メッセージ転送される例>

0001 0011

• メッセージは転送されない

12

FIND_VALUE(key) FIND_VALUE(key)

valuevalue

<メッセージ転送されない例>0000 0001

0011

FIND_VALUE(key)

{nodes, [0011]}

122008年11月20日木曜日

Page 45: kademlia-1227143905867010-8.pdf

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日木曜日

Page 46: kademlia-1227143905867010-8.pdf

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日木曜日

Page 47: kademlia-1227143905867010-8.pdf

•メッセージの送受信は非同期

•プロトコルは UDP を使用

13132008年11月20日木曜日

Page 48: kademlia-1227143905867010-8.pdf

0000

000100100011

010001010110

000100101001

000100101100

<FIND_XXXX α=3 の例>

•メッセージの送受信は非同期

•プロトコルは UDP を使用

13132008年11月20日木曜日

Page 49: kademlia-1227143905867010-8.pdf

0000

000100100011

010001010110

000100101001

000100101100

<FIND_XXXX α=3 の例>

•メッセージの送受信は非同期

•プロトコルは UDP を使用

13132008年11月20日木曜日

Page 50: kademlia-1227143905867010-8.pdf

0000

000100100011

010001010110

000100101001

000100101100

<FIND_XXXX α=3 の例>

•メッセージの送受信は非同期

•プロトコルは UDP を使用

13

• メッセージの不到達を許容•速度重視

132008年11月20日木曜日

Page 51: kademlia-1227143905867010-8.pdf

実践•ノードの参加

•ノードの離脱

•キーと値の保存

•キーと値の探索

142008年11月20日木曜日

Page 52: kademlia-1227143905867010-8.pdf

•ノードの参加

15152008年11月20日木曜日

Page 53: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15152008年11月20日木曜日

Page 54: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING

152008年11月20日木曜日

Page 55: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加

152008年11月20日木曜日

Page 56: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001

152008年11月20日木曜日

Page 57: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

152008年11月20日木曜日

Page 58: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001STORE

152008年11月20日木曜日

Page 59: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)

STORE

152008年11月20日木曜日

Page 60: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)

STORE

152008年11月20日木曜日

Page 61: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加

STORE

152008年11月20日木曜日

Page 62: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加k 個を一気に!

STORE

152008年11月20日木曜日

Page 63: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加 FIND_NODE(0000)k 個を一気に!

STORE

152008年11月20日木曜日

Page 64: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加 FIND_NODE(0000) 0000 を経路表に追加k 個を一気に!

STORE

152008年11月20日木曜日

Page 65: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)

k 個を一気に!

STORE

152008年11月20日木曜日

Page 66: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)ノード一覧を

経路表に追加

k 個を一気に!

STORE

152008年11月20日木曜日

Page 67: kademlia-1227143905867010-8.pdf

<ermlia の場合>

0000 0001 ****

• ノードの参加

15

PING 0000 を経路表に追加0001 を

経路表に追加0001

FIND_NODE(0000)ノード一覧(k 個)ノード一覧を

経路表に追加 FIND_NODE(0000) 0000 を経路表に追加ノード一覧(k 個)ノード一覧を

経路表に追加

k 個を一気に!

STORE

STORE

152008年11月20日木曜日

Page 68: kademlia-1227143905867010-8.pdf

•ノードの離脱

16162008年11月20日木曜日

Page 69: kademlia-1227143905867010-8.pdf

•ノードの離脱

16

無視勝手に落ちればぁ?

162008年11月20日木曜日

Page 70: kademlia-1227143905867010-8.pdf

•キーと値の保存

17172008年11月20日木曜日

Page 71: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の保存

17172008年11月20日木曜日

Page 72: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の保存

17

1. クライアントからキーと値のペアをもらう

<Key, Value>

172008年11月20日木曜日

Page 73: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の保存

17

1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する

<Key, Value>

172008年11月20日木曜日

Page 74: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の保存

17

1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する3. キーに近いノードを k 個選ぶ

<Key, Value>

172008年11月20日木曜日

Page 75: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の保存

17

1. クライアントからキーと値のペアをもらう2. キーと値のペアを保存する3. キーに近いノードを k 個選ぶ4. 選んだノード k 個にキーと値のペアを STORE する

<Key, Value>STORE(Key, Value)

172008年11月20日木曜日

Page 76: kademlia-1227143905867010-8.pdf

•キーと値の探索

18182008年11月20日木曜日

Page 77: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18182008年11月20日木曜日

Page 78: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう

<Key>

182008年11月20日木曜日

Page 79: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了

<Key><Value>

182008年11月20日木曜日

Page 80: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了

<Key>

182008年11月20日木曜日

Page 81: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)

<Key>

182008年11月20日木曜日

Page 82: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する

<Key>FIND_VALUE(Key)

182008年11月20日木曜日

Page 83: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する5. α 個の問い合わせ結果に、キーとペアの値があるなら、値をクライアントへ返して終了

<Key>FIND_VALUE(Key){value, Value}

<Value>

182008年11月20日木曜日

Page 84: kademlia-1227143905867010-8.pdf

<ermlia の場合>

クライアント

•キーと値の探索

18

1. クライアントからキーをもらう2. キーとペアの値があるなら、値をクライアントへ返して終了3. キーに近いノードを k 個選ぶ (近い順・RTT 順にソート)4. 選んだノード k 個に先頭から α 個づつ FIND_VALUE する5. α 個の問い合わせ結果に、キーとペアの値があるなら、値をクライアントへ返して終了

<Key>

182008年11月20日木曜日

Page 85: kademlia-1227143905867010-8.pdf

<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日木曜日

Page 86: kademlia-1227143905867010-8.pdf

参考資料

• P2P教科書 (インプレス標準教科書シリーズ)

• http://d.hatena.ne.jp/ytakano/20080507/1210136628

• http://www.shudo.net/article/Kademlia-20040727/

192008年11月20日木曜日

Page 87: kademlia-1227143905867010-8.pdf

(更新|削除) 操作の実現

202008年11月20日木曜日

Page 88: kademlia-1227143905867010-8.pdf

特性

212008年11月20日木曜日

Page 89: kademlia-1227143905867010-8.pdf

特性•Kademlia は、隙あらばデータを複製しまくる!

• データが失われ難い

• 読み取りの性能が高い

212008年11月20日木曜日

Page 90: kademlia-1227143905867010-8.pdf

特性•Kademlia は、隙あらばデータを複製しまくる!

• データが失われ難い

• 読み取りの性能が高い

•データには TTL を付加するのが基本

• データ保持の為、定期的に STORE する必要がある

212008年11月20日木曜日

Page 91: kademlia-1227143905867010-8.pdf

問題点

222008年11月20日木曜日

Page 92: kademlia-1227143905867010-8.pdf

問題点•程よい TTL を決定する事は困難

•そもそも頻繁に更新される用途では使えない

222008年11月20日木曜日

Page 93: kademlia-1227143905867010-8.pdf

問題点•程よい TTL を決定する事は困難

•そもそも頻繁に更新される用途では使えない

•全ての複製を持つノードに更新・削除を伝播させる事も困難

• Chord 以上に難しい・・・

222008年11月20日木曜日

Page 94: kademlia-1227143905867010-8.pdf

更新の実現•ノード・コントローラの導入

•UDP マルチキャスト + Vector Clocks

• P2P層とレプリケーション層の分離

• Kademlia にお任せ + Vector Clocks

232008年11月20日木曜日

Page 95: kademlia-1227143905867010-8.pdf

•ノード・コントローラの導入

24242008年11月20日木曜日

Page 96: kademlia-1227143905867010-8.pdf

•ノード・コントローラの導入

• P2P 教科書の SkeedCast を見て思いつく

24242008年11月20日木曜日

Page 97: kademlia-1227143905867010-8.pdf

•ノード・コントローラの導入

• P2P 教科書の SkeedCast を見て思いつく

• ノード・コントローラに複製の位置を持たせよう!

24242008年11月20日木曜日

Page 98: kademlia-1227143905867010-8.pdf

•ノード・コントローラの導入

• P2P 教科書の SkeedCast を見て思いつく

• ノード・コントローラに複製の位置を持たせよう!

• でも、それだと分散ハッシュではなくなる...

24242008年11月20日木曜日

Page 99: kademlia-1227143905867010-8.pdf

•ノード・コントローラの導入

• P2P 教科書の SkeedCast を見て思いつく

• ノード・コントローラに複製の位置を持たせよう!

• でも、それだと分散ハッシュではなくなる...

• ノード・コントローラを Mnesia 等で冗長しないと...

24242008年11月20日木曜日

Page 100: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks

25252008年11月20日木曜日

Page 101: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!

25252008年11月20日木曜日

Page 102: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!

• Erlang なら UDP マルチキャストも楽勝!

25252008年11月20日木曜日

Page 103: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!

• Erlang なら UDP マルチキャストも楽勝!

• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?

25252008年11月20日木曜日

Page 104: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!

• Erlang なら UDP マルチキャストも楽勝!

• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?

• 利用者は、ルータ越えの設定をする必要がある

25252008年11月20日木曜日

Page 105: kademlia-1227143905867010-8.pdf

• UDP マルチキャスト + Vector Clocks• どうせ UDP を使うならマルチキャストを使おう!

• Erlang なら UDP マルチキャストも楽勝!

• UDP では到達性が疑わしいがVector Clocks との併用で一貫性の問題を回避可能?

• 利用者は、ルータ越えの設定をする必要がある

• ↑これを利用者が考慮し始めた時点でオーバーレイ・ネットワークの恩恵が受けられていないのではないか?

25252008年11月20日木曜日

Page 106: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離

26262008年11月20日木曜日

Page 107: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ

26262008年11月20日木曜日

Page 108: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ

• Chord# + 定数ベースプロトコル + Paxos コミット

26262008年11月20日木曜日

Page 109: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ

• Chord# + 定数ベースプロトコル + Paxos コミット

• 現在、調査中... (ごめんなさい!)

26262008年11月20日木曜日

Page 110: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ

• Chord# + 定数ベースプロトコル + Paxos コミット

• 現在、調査中... (ごめんなさい!)

• Kademlia では、あるデータを持つ全てのノードを完全に特定できない為Paxos コミット と併用できない

26262008年11月20日木曜日

Page 111: kademlia-1227143905867010-8.pdf

• P2P層とレプリケーション層の分離• Scalaris のプレゼン資料を眺めていて興味を持つ

• Chord# + 定数ベースプロトコル + Paxos コミット

• 現在、調査中... (ごめんなさい!)

• Kademlia では、あるデータを持つ全てのノードを完全に特定できない為Paxos コミット と併用できない

• 蛇足だが、同じ理由で定数ベースプロトコルも使えない

26262008年11月20日木曜日

Page 112: kademlia-1227143905867010-8.pdf

• Kademlia にお任せ + Vector Clocks

27272008年11月20日木曜日

Page 113: kademlia-1227143905867010-8.pdf

• Kademlia にお任せ + Vector Clocks

•初回 STORE 送信時にクロックを付加する

27272008年11月20日木曜日

Page 114: kademlia-1227143905867010-8.pdf

• Kademlia にお任せ + Vector Clocks

•初回 STORE 送信時にクロックを付加する

•更新の伝播は Kademlia に全て任せる

27272008年11月20日木曜日

Page 115: kademlia-1227143905867010-8.pdf

• Kademlia にお任せ + Vector Clocks

•初回 STORE 送信時にクロックを付加する

•更新の伝播は Kademlia に全て任せる

•削除の伝播にエピデミックアルゴリズムと同じ問題があるので死亡証明書を利用する必要がある

27272008年11月20日木曜日

Page 116: kademlia-1227143905867010-8.pdf

削除の実現

•死亡証明書

•休眠中死亡証明書

282008年11月20日木曜日

Page 117: kademlia-1227143905867010-8.pdf

•死亡証明書

29292008年11月20日木曜日

Page 118: kademlia-1227143905867010-8.pdf

•死亡証明書

•データの削除 = クロック情報の削除

29292008年11月20日木曜日

Page 119: kademlia-1227143905867010-8.pdf

•死亡証明書

•データの削除 = クロック情報の削除

•削除後に古いデータを受け取る可能性がある

29292008年11月20日木曜日

Page 120: kademlia-1227143905867010-8.pdf

•死亡証明書

•データの削除 = クロック情報の削除

•削除後に古いデータを受け取る可能性がある

•データの削除 = 削除記録(死亡証明書)の保存とし、クロック情報を残す事で古いデータの上書きを回避

29292008年11月20日木曜日

Page 121: kademlia-1227143905867010-8.pdf

•死亡証明書

•データの削除 = クロック情報の削除

•削除後に古いデータを受け取る可能性がある

•データの削除 = 削除記録(死亡証明書)の保存とし、クロック情報を残す事で古いデータの上書きを回避

•死亡証明書が永遠に溜まり続ける

29292008年11月20日木曜日

Page 122: kademlia-1227143905867010-8.pdf

•休眠中死亡証明書

30302008年11月20日木曜日

Page 123: kademlia-1227143905867010-8.pdf

•休眠中死亡証明書

• TTL 付き死亡証明書(一定時間毎に削除される)

30302008年11月20日木曜日

Page 124: kademlia-1227143905867010-8.pdf

•休眠中死亡証明書

• TTL 付き死亡証明書(一定時間毎に削除される)

•全てのノードに死亡証明書が伝播されない可能性がある為ごく少数の一部のノードに休眠中の死亡証明書を残しておく必要がある

30302008年11月20日木曜日

Page 125: kademlia-1227143905867010-8.pdf

•休眠中死亡証明書

• TTL 付き死亡証明書(一定時間毎に削除される)

•全てのノードに死亡証明書が伝播されない可能性がある為ごく少数の一部のノードに休眠中の死亡証明書を残しておく必要がある

•休眠中の死亡証明書を持つノードに古いデータが STORE された場合再び、TTL 付き死亡証明書を伝播させる

30302008年11月20日木曜日

Page 126: kademlia-1227143905867010-8.pdf

参考資料

• 分散システムー原理とパラダイム

• 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日木曜日

Page 127: kademlia-1227143905867010-8.pdf

Kai に組み込めるのか?

322008年11月20日木曜日

Page 128: kademlia-1227143905867010-8.pdf

33

考慮すべき点

332008年11月20日木曜日

Page 129: kademlia-1227143905867010-8.pdf

•利点•仕様がシンプルで実装が容易• Churn 耐性が高い•速度重視•書き込み成功率が高い

33

考慮すべき点

332008年11月20日木曜日

Page 130: kademlia-1227143905867010-8.pdf

•利点•仕様がシンプルで実装が容易• Churn 耐性が高い•速度重視•書き込み成功率が高い•不利点•あるデータを持つ全てのノードを特定できない(大きな問題)

33

考慮すべき点

332008年11月20日木曜日

Page 131: kademlia-1227143905867010-8.pdf

34

Kai プロジェクトへ提案

342008年11月20日木曜日

Page 132: kademlia-1227143905867010-8.pdf

• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義

34

Kai プロジェクトへ提案

342008年11月20日木曜日

Page 133: kademlia-1227143905867010-8.pdf

• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義

• Churn 耐性は Chord で十分実用的ではないか?

34

Kai プロジェクトへ提案

342008年11月20日木曜日

Page 134: kademlia-1227143905867010-8.pdf

• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義

• Churn 耐性は Chord で十分実用的ではないか?• Kademlia に影響を受けた EpiChord はどうか?• メッセージ受信時に経路表を更新• メッセージを非同期で送信

34

Kai プロジェクトへ提案

342008年11月20日木曜日

Page 135: kademlia-1227143905867010-8.pdf

• Kademlia を採用する場合STORE の扱いを変更する必要がある• 新しい DHT アルゴリズムを考える事と同義

• Churn 耐性は Chord で十分実用的ではないか?• Kademlia に影響を受けた EpiChord はどうか?• メッセージ受信時に経路表を更新• メッセージを非同期で送信

•と言う事で、EpiChord の採用検討を提案34

Kai プロジェクトへ提案

342008年11月20日木曜日

Page 136: kademlia-1227143905867010-8.pdf

ご清聴ありがとうございました

352008年11月20日木曜日