回答:
わかりました、それらは基本的にかなり単純なアイデアです。DHTは辞書のようなインターフェースを提供しますが、ノードはネットワーク全体に分散されます。DHTのコツは、特定のキーを格納するノードがそのキーをハッシュすることで見つかるということです。その結果、実際には、ハッシュテーブルバケットはネットワーク内の独立したノードになります。
これにより、フォールトトレランスと信頼性が大幅に向上し、パフォーマンスが向上する可能性がありますが、頭痛の種も多くなります。たとえば、ノードが失敗したり、その他の理由でノードがネットワークを離れるとどうなりますか?また、ノードが参加するときに、負荷が大まかに分散されるように、キーをどのように再配布しますか。考えてみれば、どうやってキーを均等に分配するのですか?そして、ノードが参加するとき、すべてを再ハッシュしないようにするにはどうすればよいですか?(バケットの数を増やす場合は、通常のハッシュテーブルでこれを行う必要があります)。
これらの問題のいくつかに取り組むDHTの1つの例は、nノードの論理リングで、それぞれがキースペースの1 / nを担当します。ネットワークにノードを追加すると、リング上の他の2つのノードの間に位置する場所が検出され、兄弟ノードのキーの一部を担当します。このアプローチの優れた点は、リング内の他のノードが影響を受けないことです。2つの兄弟ノードのみがキーを再配布する必要があります。
たとえば、3つのノードリングで、最初のノードにキー0〜10、2番目のノードに11〜20、3番目のノードに21〜30があるとします。4番目のノードが来て、ノード3と0の間に自分自身を挿入する場合(それらはリングにあることを思い出してください)、3のキースペースの半分の役割を担うことができるので、26-30を扱い、ノード3は21を扱います。 -25。
コンテンツベースのルーティングを使用して、キーを格納する適切なノードを見つける、このような他の多くのオーバーレイ構造があります。リングでキーを見つけるには、一度に1つのノードでリングを検索する必要があります(ローカルルックアップテーブルを保持しない限り、何千ものノードのDHTで問題があります)。これはO(n)ホップルーティングです。その他の構造-拡張リングを含む-はO(log n)ホップルーティングを保証し、一部のメンテナンスはO(1)ホップルーティングを要求しますが、より多くのメンテナンスが必要です。
ウィキペディアのページを読んでください。少し詳しく知りたい場合は、ハーバードのこのコースページをチェックしてください。かなり包括的なリーディングリストがあります。
DHTは、通常のハッシュテーブルと同じタイプのインターフェースをユーザーに提供します(キーで値を検索します)が、データは任意の数の接続されたノードに分散されます。ウィキペディアには良い基本的な紹介があり、これを書けば本質的に逆流します-
一貫性のあるハッシュについての洞察を得たばかりなので、HenryRの便利な答えを追加したいと思います。ノーマル/ナイーブハッシュルックアップは2つの変数の関数であり、そのうちの1つはバケットの数です。一貫性のあるハッシュの優れている点は、バケットの数「n」を方程式から削除することです。
単純ハッシュでは、最初の変数はテーブルに格納されるオブジェクトのキーです。キーを「x」と呼びます。2番目の変数はバケットの数「n」です。したがって、オブジェクトが格納されているバケット/マシンを特定するには、hash(x)mod(n)を計算する必要があります。したがって、バケットの数を変更すると、ほとんどすべてのオブジェクトが格納されているアドレスも変更されます。
これを一貫したハッシュと比較してください。「R」をハッシュ関数の範囲として定義しましょう。Rは定数です。一貫したハッシュでは、オブジェクトのアドレスはhash(x)/ Rにあります。ルックアップはバケット数の関数ではなくなったため、バケット数を変更したときの再マッピングが少なくなります。
hash(x)/R
なります。それでも34500%3を実行する必要があります。