コンシステントハッシュアルゴリズムの詳細な説明

コンシステントハッシュアルゴリズムの詳細な説明

サーバー負荷分散を行う際には、ラウンドロビン、HASH、最小接続、応答時間、加重など、さまざまな負荷分散アルゴリズムから選択できます。その中でもハッシュアルゴリズムは最もよく使われるアルゴリズムです。

一般的なアプリケーション シナリオは次のようになります。キャッシュ サービスを提供する N 台のサーバーがあり、各サーバーに要求を均等に分散するためにサーバーの負荷を分散する必要があり、各マシンがサービスの 1/N を担当します。

よく使用されるアルゴリズムは、ハッシュ結果の余り (hash() mod N) を取得することです。つまり、マシンに 0 から N-1 までの番号を付け、カスタム hash() アルゴリズムに従って、各要求の hash() 値を N で割った余り i を取得し、番号 i のマシンに要求を配布します。しかし、このアルゴリズムには致命的な問題があります。マシンがクラッシュすると、そのマシンに届くはずのリクエストを正しく処理できなくなります。このとき、障害が発生したサーバーをアルゴリズムから削除する必要があります。このとき、(N-1)/N サーバーのキャッシュ データを再計算する必要があります。新しいマシンが追加された場合は、N/(N+1) サーバーのキャッシュ データを再計算する必要があります。これは通常、システムにとって許容できないスラッシングです (大量のキャッシュ無効化やデータの移動が必要になるため)。では、影響を受けるリクエストをできるだけ少なくするために、負荷分散戦略をどのように設計すればよいのでしょうか?

コンシステント ハッシュ アルゴリズムは、Memcached、Key-Value Store、Bittorrent DHT、LVS で使用されています。コンシステント ハッシュは、分散システムにおける負荷分散に最適なアルゴリズムであると言えます。

1. コンシステントハッシュアルゴリズムの説明

以下では、Memcached の Consistent Hashing アルゴリズムを例として使用します (Memcached の分散アルゴリズムを参照)。

ハッシュアルゴリズムの結果は一般的にunsigned int型なので、ハッシュ関数の結果は[0,232 -1]の間で均等に分布するはずです。232個の点を使って円を均等に切る場合、まずハッシュ(キー)関数に従ってサーバー(ノード)のハッシュ値を計算し、それを0から232までの円に分配します。

同じ hash(key) 関数を使用して、データを保存するキーのハッシュ値を見つけ、それを円にマッピングします。次に、データがマップされている場所から時計回りに検索を開始し、最初に見つかったサーバー (ノード) にデータを保存します。

一貫性ハッシュ原理の概略図

1. 新しいノードを追加します。新しく追加されたノードとリング上の反時計回り方向の最初のノード間のデータのみが影響を受けます (追加されたノードの時計回り方向の最初のノードの情報は、追加されたノードに移行する必要があります)。

2. ノードの削除: 元々削除されたノードとリング上の反時計回り方向の最初のノード間のデータのみが影響を受けます (削除されたノードの情報は時計回り方向の最初のノードに移行する必要があります)。したがって、コンシステント ハッシュは、負荷分散におけるノードの追加と削除によって発生するハッシュ値の変動の問題を効果的に解決できます。

サーバー追加時の一貫性ハッシュ図

仮想ノード: 仮想ノードを導入する理由は、サーバー (ノード) の数が少ない場合 (たとえば、サーバーが 3 台しかない場合)、ハッシュ (キー) によって計算されたノードのハッシュ値がリング上に均等に分散されず (スパース)、各ノードに負荷が不均衡になる問題が依然として発生するためです。仮想ノードは実際のノードのレプリカと見なすことができ、本質的には実際のノードと同じです (ただしキーが異なります)。仮想ノード導入後、実際のサーバ(ノード)の数を一定の割合(例えば200倍)で拡張し、そのハッシュ(キー)値を計算してリング上に均等に分散します。負荷分散を実行すると、仮想ノードに該当するハッシュ値は、実際には実際のノードに該当します。全ての実ノードが同じ割合で仮想ノードに複製されるため、ノード数が少ない場合にリング上でハッシュ値を均等に分散させる問題が解決されます。

仮想ノードが一貫性​​のあるハッシュ結果に与える影響

上図からわかるように、ノード数が 10 で、実際のノードごとの仮想ノード数が実際のノード数の 100 ~ 200 倍の場合でも、結果は非常にバランスが取れています。

2. 一貫性ハッシュアルゴリズムの実装:

記事「Consistent Hashing」では、Consistent Hashing の Java 実装について非常に簡潔に説明しています。

  1. java.util.Collectionをインポートします
  2. java.util.SortedMapをインポートします
  3. java.util.TreeMapをインポートします
  4.  
  5. 公共 クラスConsistentHash<T> {
  6.  
  7.  プライベート 最終的なハッシュ関数ハッシュ関数;
  8.  プライベート ファイナル レプリカの数int ;
  9.  プライベート 最終的なSortedMap<Integer, T> 円 =新しいTreeMap<Integer, T>();
  10.  
  11.  パブリックConsistentHash(HashFunction hashFunction, int numberOfReplicas,
  12. コレクション<T>ノード) {
  13.    これは.hashFunction = hashFunction です。
  14.     this .numberOfReplicas = numberOfReplicas;
  15.  
  16.     ( T ノード: ノード) {
  17. ノードを追加します。
  18. }
  19. }
  20.  
  21.  公共  void add(Tノード) {
  22.     ( int i = 0 ; i < レプリカ数; i++) {
  23. ノードをハッシュ関数でハッシュします。
  24. }
  25. }
  26.  
  27.  公共  void削除(T ノード) {
  28.     ( int i = 0 ; i < レプリカ数; i++) {
  29. 円を削除します(hashFunction.hash(node.toString() + i));
  30. }
  31. }
  32.  
  33.  パブリックT get(オブジェクトキー) {
  34.     (circle.isEmpty())の場合{
  35.      戻る ヌル;
  36. }
  37.     intハッシュ = hashFunction.hash(キー);
  38.    もし(!circle.containsKey(ハッシュ)) {
  39. SortedMap<Integer, T> tailMap = circle.tailMap(hash);
  40. ハッシュ = tailMap.isEmpty() ?circle.firstKey() : tailMap.firstKey();
  41. }
  42.    戻り値:circle.get(hash);
  43. }
  44.  
  45. }

<<:  階乗関連のアルゴリズムとその C++ 実装

>>:  Java でアルゴリズムを実装する場合は、再帰に注意してください。

ブログ    
ブログ    

推薦する

機械学習が金融業界にもたらす破壊的変化

過去 10 年間で、金融業界ではこれまでにない最先端のテクノロジーが数多く導入されました。この変化は...

北京大学、バイトダンス等は増分学習を用いたスーパーピクセルセグメンテーションモデルLNSNetを提案した

オンライン学習によって引き起こされる壊滅的な忘却問題を解決するために、北京大学などの研究機関は、勾配...

...

Taとのチャットを手助けするロボットをカスタマイズする

[[427589]]自動チャットの例これは 200 万件のチャット記録に基づいてトレーニングされてい...

...

イアン・マッシンガム:AWSはモノのインターネットと人工知能への投資を継続

[51CTO.com からのオリジナル記事] 先進的なクラウドサービスプロバイダーとして、AWS は...

130 の大学が人工知能専攻を追加。次の「陥没穴」専攻になるのでしょうか?

大学の専攻の盛衰は、時代の発展と技術の進歩を最もよく物語る証拠でもあります。今日のいわゆる「落とし穴...

機械学習はインビザラインの患者が完璧な笑顔を手に入れるのを助けている

モバイル コンピューティングのトレンドにより、企業はスマートフォンから情報にアクセスし、タスクを完了...

因果推論と正規化がリストに載っています。権威ある専門家が過去 50 年間で最も重要な統計的アイデアをレビューします。

統計は私たちの日常生活のいたるところに存在し、すべての人や物事は統計を使って説明できるようです。人類...

人間の心臓細胞から作られたロボット魚は本物の魚よりも速く泳ぐ。ハーバード大学の新しい研究がサイエンス誌に掲載される。

心臓ペースメーカーの正確なメカニズムはわかっていませんが、この物理的プロセスを再現する「心臓」を私た...

絶対確実な協働ロボット

人間とロボットが協力して協働ロボットを作る[[321860]]協働ロボットは人間と対話し、協働するよ...

...

中国語からSQLへの自動変換精度92%、このKaggleマスターが世界記録を更新

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

...