論文翻訳: Kademlia: A Peer-to-peer Information System Based on the XOR Metric
Petar Maymounkov and David Mazières
{petar,dm}@cs.nyu.edu
http://kademlia.scs.cs.nyu.edu
New York University
Abstract
障害の発生しやすい環境において証明可能な一貫性とパフォーマンスをもつ P2P システムについて述べる。我々のシステムはアルゴリズムを簡素化し、証明を用意にする新しい XOR ベースのメトリックストポロジーを用いてクエリーをルーティングし、ノードを探索する。このトポロジーには、交換されるすべてのメッセージが有用なコンタクト情報を伝える、または強化するという性質を持っている。このシステムはこの情報を利用してユーザにされるすべてのメッセージが有用なコンタクト情報を伝える、または強化するという性質を持っている。このシステムはこの情報を利用してユーザにタイムアウトの遅延を課すことなく、ノードの障害を許容する並列非同期のクエリーメッセージを送信する。
Table of Contents
1 導入
この論文では P2P 分散ハッシュテーブル (DHT) である Kademlia について述べる。Kademlia はこれまでの DHT では同時に提供されていなかった多くの望ましい機能を持っている。Kademlia はノードがお互いを知るために送信しなければならない設定メッセージ数を最小限に抑えている。設定情報はキー検索の副作用として自動的に拡散される。ノードは十分な情報と柔軟性を持ち、低レイテンシーの経路を介してクエリーをルーティングすることができる。Kademlia は故障したノードによるタイムアウトの遅延を回避するために並列の非同期クエリーを使用している。ノードが互いの存在を記録するアルゴリズムは、ある基本的なサービス拒否攻撃の耐性を持っている。最後に、Kademlia のいくつかの重要な特性は、駆動時間の分布に関する弱い仮定 (既存の P2P システムの測定値を用いて検証した仮定) を使用して形式的に証明することができる。
Kademlia は多くの DHT の基本的なアプローチを採用している。キーは不透明 (opaque; 検索に使用する以外に設計上の意味を持たない) な 160 ビット量である (例えばある大きなデータの SHA-1 ハッシュ値など)。参加するコンピュータは 160 ビットのキー空間にノード ID を持っている。〈key, value〉のペアは、ある近さの概念に対してキーに "近い" ID を持つノードに格納される。最後に、ノード ID に基づくルーティングアルゴリズムによって誰もが特定のターゲットキーに近いサーバを効率的に見つけることができる。
Kademlia の利点の多くはキー空間内のポイント間の距離に XOR メトリクスを使用していることである。XOR は対称的であるため、Kademlia の参加者はルーティングテーブルに含まれているノードの全く同じ分布から検索クエリーを受け取ることができる。この特性がないと Chord [5] などのシステムは受信したクエリーから有用なルーティング情報を学習することができない。さらに悪いことに、非対称性は硬直したルーティングテーブルにつながる。Chord ノードの finger テーブルの各エントリは ID 空間内のある区間の前にある正確なノードを格納しなければならない。区間内のノードは実際には同じ区間内で先行するノードから離れすぎているだろう。Kademlia はこれとは対照的に区間内の任意のノードにクエリーを送信することができ、レイテンシーに基づいてルートを選択したり、同等に適切な複数のノードに並列で非同期クエリーを送信することができる。
Kademlia は特定の ID に近いノードを探索するために最初から最後まで単一のルーティングアルゴリズムを使用する。これとは対照的に、他のシステムでは目標の ID に近づくためにあるアルゴリズムを使用し、最後の数ホップで別のアルゴリズムを使用している。既存のシステムの中で Kademlia がもっとも似ているのは Pastry [1] の第一フェーズ (この著者らはそのように表現していないが) であり、Kademlia の XOR メトリクスを用いてターゲット ID からほぼ半分の距離にあるノードを連続的に見つけるというものである。ただし、Pastry の第二フェーズでは距離メトリクスを ID 間の数値差に切り替える。またレプリケーションでは第二フェーズの数値差メトリクスを使用する。残念ながら、第二フェーズのメトリクスと近いノードは第一フェーズのメトリクスとかなり離れている可能性があり、特定のノード ID 値で不連続性が発生し、パフォーマンスが低下し、最悪ケースの挙動を形式的に分析する試みが複雑となる。
2 システム詳細
我々のシステムは他の DHT と同じ一般的なアプローチを採用している。160 ビットの不透明な ID をノードに割り当て、任意の目的 ID に "近い" ノードを連続的に検索し、対数的なステップで検索対象に収束させる検索アルゴリズムを提供する。
Kademlia はノードを二分木の葉のように効率的に扱い、各ノードの位置はその ID のもっとも近い一意のプレフィクスによって決定される。Fig. 1 はツリーの例として一意なプレフィクス 0011 を持つノードの位置を示している。この二分木はあるノードに対してそのノードを含まない下位のサブツリーに分割してゆく。最上位のサブツリーはそのノードを含まない二分木の半分で構成される。次のサブツリーはそのノードを含まない残りのツリーの半分で構成される。ノード 0011 の例ではサブツリーは円で囲まれ、それぞれのプレフィクスが 1, 01, 000 および 0010 を持つ全てのノードで構成されている。
0011... のツリー内での位置を示している。グレーの楕円はノード 0011... がコンタクトする必要のあるサブツリーを表している。Kademlia のプロトコルでは、サブツリーにノードが含まれているのであれば各ノードはそのサブツリー内の少なくとも 1 つのノードを確実に認識するように保証している。この保証によりどのノードでもそのノードの ID で他のノードの位置を特定することができる。Figure 2 はノード 0011 が下位のサブツリーと下位サブツリー内のコンタクトを見つけるために、自身が知っている最良のノードに連続的に問い合わせることでノード 1110 を検索する例を示している。
0011 を持つノードはより近いノードを順に学習して照会することによりプレフィクス 1110 のノードを見つける。上部の線は 160 ビット ID 空間を表しており、検索が目的のノードに収束する様子を示している。下部は 1110 によってなされた RPC メッセージを示している。最初の RPC はすでに 1110 が知っているノード 101 宛である。続く RPC は前の RPC によって返されたノード宛である。このセクションの残りの部分では検索アルゴリズムの詳細を詰めてより具体的なものにする。最初に ID の近接性の正確な概念を定義し、キーにもっとも近い
2.1 XOR メトリクス
Kademlia の各ノードは 160 ビットのノード ID を持つ。ノード ID は今のところ単にランダムな 160 ビット識別子だが Chord と同じように構築することもできる。ノードが送信するすべてのメッセージにはノード ID が含まれているため受信者は必要に応じて送信者の存在を記録することができる。
キーもまた 160 ビットの識別子である。〈key, value〉ペアを特定のノードに割り当てるために Kademlia は 2 つの識別子間の距離の概念に依存している。2 つの 160 ビット識別子
まず我々は XOR が非ユークリッドメトリクスであっても有効であることを記述する。
次に我々は XOR が二分木ベースのシステムの概要図で暗黙のうちに距離の概念を捉えていることを記述する。160 ビットの ID すべてが配置された二分木では、2 つの ID 間の距離の大きさはその両方を含む最小のサブツリーの高さとなる。木が完全に配置されていない場合、ID
Chord の時計回りの円周メトリクスと同様に XOR は一方向である。任意の点
2.2 ノード状態
Kademlia ノードはクエリーメッセージをルーティングするために互いのコンタクト情報を保存する。
Kademlia ノードは別のノードからメッセージ (リクエストまたは応答) を受信すると、送信者のノード ID に対応する適切な
2.3 Kademlia プロトコル
Kademlia のプロトコルは PING, STORE, FIND_NODE, FIND_VALUE の 4 つの RPC で構成されている。PING RPC はノードを試してオンラインであるかを確認する。STORE は後で検索できるように〈key, value〉ペアを保存するようノードに指示する。
FIND_NODE は 160 ビットの ID を引数に取る。RPC の受信者は目的の ID にもっとも近いことが分かっている
FIND_VALUE は RPC 受信者がすでにそのキーの STORE RPC を受け取っているのであれば単に格納されている値を返し、そうでなければ FIND_NODE と同様に〈IPアドレス, UDPポート, ノードID〉の三値を返す動作をする。
すべての RPC で受信者は 160 ビットのランダムな RPC ID をエコーしなければならない。これによりアドレス偽造に対する耐性が得られる。PRC 受信者が送信者のネットワークアドレスに対する追加の確証を得るために RPC の応答で PING をピギーバックすることもできる。
Kademlia の参加者が実行しなければならないもっとも重要な手順は、指定されたノード ID にもっとも近い FIND_NODE RPC を送信する。
再帰ステップでは、イニシエーターが過去の RPC から学習したノードに FIND_NODE を再送する (この再帰ステップは前の RPC の FIND_NODE RPC を再送する1。迅速に応答しないノードは応答があるまでは考慮から除外される。FIND_NODE ラウンドですでに見つけているもっとも近いノードよりも近いノードを返すことに失敗した場合、イニシエータはまだ問い合わせをしていないもっとも近い FIND_NODE を再送する。検索はイニシエータが照会し、既知のもっとも近い
ほとんどの操作は上記の検索手順に基づいて実装されている。参加者は〈key, value〉ペアを格納するためにキーにもっとも近い STORE RPC を送信する。さらに、Section 2.5 で述べるように各ノードは必要に応じて〈key, value〉ペアを再発行しそれらを維持する。これにより非常に高い確率で〈key, value〉ペアの永続性が保証される (証明の概略で示す)。Kademlia の現在のアプリケーション (ファイル共有) では〈key, value〉ペアの大本の発行者が 24 時間ごとに再発行するように要求している。そうしないと〈key, value〉ペアは公開から 24 時間で有効期限が切れ、システム内の古くなったインデックス情報を制限している。デジタル証明書や暗号論的ハッシュから値へのマッピングなど、他のアプリケーションでは有効期限を長く設定することが適切かもしれない。
〈key, value〉ペアを見つけるために、ノードはキーにもっとも近い ID を持つ FIND_NODE RPC ではなく FIND_VALUE を使用する。さらに、任意のノードが値を返すと手続きは直ちに停止する。キャッシングの目的で、一度検索が成功すると要求ノードは観測されたキーにもっとも近いが値を返さなかったノードに〈key, value〉ペアを保存する。
トポロジーには単一方向性があるため、将来に同じキーを検索するともっとも近いノードに問い合わせる前にキャッシュされたエントリにヒットする可能性がある。特定のキーの人気が高いときには、システムの多くのノードがそのキーをキャッシュしている可能性がある。"オーバーキャッシング" を避けるためノードのデータベース内の〈key, value〉ペアの有効期限を現在のノードとキー ID にもっとも近いノードの間のノード数に指数関数的に反比例させる2。単純な LRU の退避でも同様のライフタイム分布が得られるが、ノードにはシステムが保存する値の数に関する事前情報がないため、キャッシュサイズを選択する自然な方法はない。
バケットは通常、ノードを通過するリクエストのトラフィックによって新鮮な状態に保たれる。特定の ID 範囲に対する検索がまったくないといった病的なケースに対処するために、各ノードは過去 1 時間にノード検索を実行していないバケットをリフレッシュする。リフレッシュとは、バケットの範囲内のランダムな ID を選択し、その ID に対するノード検索を行うことを意味する。
ネットワークに参加するには、ノード
- 1bucket のエントリと
FIND応答は 個のノードの選択に使用するためにラウンドトリップ時間の見積もりで拡張できる。 - 2この数値は現在のノードのバケット構造から推測できる。
2.4 ルーティングテーブル
Kademlia の基本的なルーティングテーブルの構造はプロトコルを考えるとかなり分かりやすいものだが、非常に不均衡なツリーを扱うために少し微妙な工夫が必要である。ルーティングテーブルは葉に
ルーティングツリーのノードは必要に応じて動的に割り当てられる。Fig. 4 にそのプロセスを示す。初期状態でノード
非常に不均衡なツリーでは 1 つの複雑な問題が発生する。ノード 000 で始まる唯一のノードであり、システムにはすでにプレフィクス 001 を持つノードが 001 を持つすべてのノードは 001 を持つすべてのノードがそれを知ることになる。
00...00 のノードの緩和された (relaxed) ルーティングテーブルを例示している。緩和されたルーティングテーブルは少なくとも
2.5 効率的なキーの再発行
ノードはキーと値のペアの永続性を確保するために定期的にキーを再発行する必要がある。そうしないと 2 つの現象により有効なキーの検索に失敗する可能性がある。第一に、発行されたキーと値のペアを最初に取得した
Kademlia はネットワークを離脱するノードを補うためにそれぞれのキーと値のペアを 1 時間に 1 回再発行する。この戦略を単純に実装すると、キーと値のペアを格納している最大 STORE RPC を実行することになり多くのメッセージが必要となる。幸い、この再発行プロセスは大幅に最適化することができる。まず、あるノードが特定のキー-値ペアの STORE RPC を受信すると、その RPC は他の
2 つ目の最適化は、キーを再発行する前にノード検索を行わないことである。Section 2.4 で説明したように、不均衡なツリーを処理するためにノードは必要に応じて
サイズが
新しいノードがシステムに参加しようとしているとき、そのノードは自身ともっとも近い STORE RPC を発行して関連するキーと値のペアを新しいノードに転送する。ただし、ノードは冗長な STORE RPC の重複を避けるために自身の ID が他のノードの ID よりもキーに近い場合のみキーと値のペアを転送する。
3 証明の概略図
我々のシステムが適切に機能することを実証するために、ほとんどの操作がある定数
まずいくつかの定義から始める。距離範囲
次のステップでは、ノードが適切な範囲に存在する場合、すべてのノードのすべての
この不変条件が正しいことを証明するには、まず不変条件が成立する場合のバケットのフレッシュの影響を検討する。フレッシュ後、バケットには
ノードのバケットはリクエストの受信または送信のたびに更新されるため、実際には故障の確率は 1 時間以内に
さらに、単一ノードの単一バケット上で不変条件が失敗したとしても、これは (いくつかの検索にホップを追加することで) 実行時間に影響を与えるだけで、ノード検索の正確さには影響しない。検索を失敗させるには、検索経路上の
次に〈key, value〉ペアのリカバリについて考慮する。〈key, value〉ペアが公開されるとキーにもっとも近い
4 実装ノート
この章では Kademlia 実装のパフォーマンスを改善するために使用した 2 つの重要な技法について説明する。
4.1 最適化されたコンタクトアカウント
望ましい PING RPC を送信する必要がある。PING は PING のために大量のネットワークメッセージが必要になる。
Kademlia はトラフィックを削減するために有益なメッセージを送信できるようになるまでコンタクトの有効性調査を遅らせるようにしている。Kademlia ノードが未知のコンタクトからの RPC を受信し、そのコンタクトの
関連する問題として、Kademlia は UDP を使用しているためネットワークパケットが失われると有効なコンタクトが応答できなくなることがある。パケットロスはネットワークの輻輳を示すことが多いため、Kademlia は応答のないコンタクトをロックし、指数増加のバックオフ間隔以上に RPC を送信しないようにする。Kademlia の検索はほとんどの段階で
コンタクトが連続して 5 回の RPC に応答しない場合、そのコンタクトは古くなっているとみなされる。
4.2 高速化された検索
実装におけるもう一つの最適化は、ルーティングテーブルのサイズを大きくすることによって検索あたりのホップ数を少なくすることである。概念的には ID を一度に 1 ビットではなく
Section 2.4 ではバケットが満杯でその範囲にノード自身の ID が含まれる場合に Kademlia は
XOR ベースのルーティングは Pastry [1]、Tapestry [2]、Plaxton の分散探索アルゴリズム [3] の第一段階のルーティングアルゴリズムに似ているが、3 つとも
5 まとめ
斬新な XOR ベースのメトリクストポロジーを備えた Kademlia は、証明可能な一貫性とパフォーマンス、レイテンシーを最小限に抑えるルーティング、および対称的な単一方向性トポロジーを組み合わせた最初の P2P システムである。Kademlia はさらに同時実行性パラメータ
References
- A. Rowstron and P. Druschel. Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems. Accepted for Middleware, 2001, 2001. http://research.microsoft.com/~antr/pastry/.
- Ben Y. Zhao, John Kubiatowicz, and Anthony Joseph. Tapestry: an infrastructure for fault-tolerant wide-area location and routing. Technical Report UCB/CSD-01-1141, U.C. Berkeley, April 2001.
- Andréa W. Richa C. Greg Plaxton, Rajmohan Rajaraman. Accessing nearby copies of replicated objects in a distributed environment. In Proceedings of the ACM SPAA, pages 311–320, June 1997.
- Stefan Saroiu, P. Krishna Gummadi and Steven D. Gribble. A Measurement Study of Peer-to-Peer File Sharing Systems. Technical Report UW-CSE-01-06-02, University of Washington, Department of Computer Science and Engineering, July 2001.
- Ion Stoica, Robert Morris, David Karger, M. Frans Kaashoek, and Hari Balakrishnan. Chord: A scalable peer-to-peer lookup service for internet applications. In Proceedings of the ACM SIGCOMM ’01 Conference, San Diego, California, August 2001.
翻訳抄
二分探索木に基づき距離関数に XOR を使用する分散ハッシュテーブルアルゴリズム Kademlia に関する 2002 年の論文。ネットワーク全体では二分木の構造だが、個々のノードのルーティングテーブルはその部分木として見ることのできるリスト構造となる。ルーティングテーブルの参照先は
- Maymounkov P., Mazières D. Kademlia: A Peer-to-Peer Information System Based on the XOR Metric. In: Druschel P., Kaashoek F., Rowstron A. (eds) Peer-to-Peer Systems. IPTPS 2002. Lecture Notes in Computer Science, vol 2429. Springer, Berlin, Heidelberg.




