分散ハッシュテーブル(DHT)の簡単な基本説明


回答:


237

わかりました、それらは基本的にかなり単純なアイデアです。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)ホップルーティングを要求しますが、より多くのメンテナンスが必要です。

ウィキペディアのページを読んでください。少し詳しく知りたい場合は、ハーバードのこのコースページをチェックしてください。かなり包括的なリーディングリストがあります。


23
+1良い答え。3番目の段落(「これらの問題のいくつかに取り組むDHTの1つの例は、nノードの論理リングです」)の意味は、一貫性ハッシュです。これは、Facebookによって作成された分散データベースであるApache Cassandraで使用される非常に興味深いトピックです。紙へのリンク(読む価値があります):cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf
santiagobasulto

5
非常に理解しやすいリングベースのルックアッププロトコルは、Chordです:pdos.csail.mit.edu/papers/chord
ThomasWeiss

Key-Valueがノードに保存される方法について詳しく説明していただけますか?それは、何らかの形のハッシュテーブルまたはDBでしょうか。
ワンドメーカー

@HenryR、「ノードリング」は単にツリー構造ではないですか?
Pacerier 2017年

-イリノイ州のユニは、誰もがより多くの読み物を望んでいる場合は、その分散システムクラスの一部として和音プロトコルごとの学期を教えcourses.engr.illinois.edu/ece428/sp2018/lectures.html
シッダールタ

11

DHTは、通常のハッシュテーブルと同じタイプのインターフェースをユーザーに提供します(キーで値を検索します)が、データは任意の数の接続されたノードに分散されます。ウィキペディアには良い基本的な紹介があり、これを書けば本質的に逆流します-

http://en.wikipedia.org/wiki/Distributed_hash_table


7

一貫性のあるハッシュについての洞察を得たばかりなので、HenryRの便利な答えを追加したいと思います。ノーマル/ナイーブハッシュルックアップは2つの変数の関数であり、そのうちの1つはバケットの数です。一貫性のあるハッシュの優れている点は、バケットの数「n」を方程式から削除することです。

単純ハッシュでは、最初の変数はテーブルに格納されるオブジェクトのキーです。キーを「x」と呼びます。2番目の変数はバケットの数「n」です。したがって、オブジェクトが格納されているバケット/マシンを特定するには、hash(x)mod(n)を計算する必要があります。したがって、バケットの数を変更すると、ほとんどすべてのオブジェクトが格納されているアドレスも変更されます。

これを一貫したハッシュと比較してください。「R」をハッシュ関数の範囲として定義しましょう。Rは定数です。一貫したハッシュでは、オブジェクトのアドレスはhash(x)/ Rにあります。ルックアップはバケット数の関数ではなくなったため、バケット数を変更したときの再マッピングが少なくなります。

http://michaelnielsen.org/blog/consistent-hashing/


1
とにかく、改造する必要がありますね。サーバーが3台あるとします。 34500にhash(x)/Rなります。それでも34500%3を実行する必要があります。
Pacerier 2017年

あなたのブログ投稿は不明瞭ですが、ノードが追加および削除される実際の例のステップごとのスナップショットと、追加および削除される行をリストする必要があります。
Pacerier 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.