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

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

サーバー負荷分散を行う際には、ラウンドロビン、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 でアルゴリズムを実装する場合は、再帰に注意してください。

ブログ    
ブログ    
ブログ    

推薦する

ChatterBotライブラリを使用してチャットボットを作成する

[[437576]]さまざまな機械学習アルゴリズムを実装して応答性の高い会話を生成する Chatte...

プログラマーがアルゴリズムを本当に習得したら、どれほど強くなるでしょうか?

2020 = 1024 + 996... 2020 はプログラマーにとってあまり「フレンドリー」に...

2021年の産業用ロボットの6つの主要トレンド

産業情報ウェブサイトReportlinkerが2020年11月に発表したレポートによると、産業用ロボ...

マインドコントロールが現実に:話したり手を動かさずに、ただ横たわっているだけでゲームをプレイできる

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

Google の社内機械学習プロジェクト「Project Ninja」の秘密を解明します。

すべての製品に人工知能を統合したい場合は、強力な機械学習チームを育成する必要があります。 Googl...

Splunk は 2018 年の人工知能と機械学習の 3 つのトレンドを予測しています

調査会社ガートナーは、「人工知能(AI)と高度な機械学習技術は、広く注目されている新興技術であり、企...

Kaggle マスターはどのような言語、フレームワーク、モデルを使用していますか?詳細な統計はこちら

統計ウェブサイト: https://mlcontests.com/ 著者はいくつかの重要な結論に達し...

機械学習決定木アルゴリズム学習ノート

基本概念決定木は分類アルゴリズムです。データ型: 数値と名目値。構築アルゴリズムは名目データに対して...

AIビデオ分析が業務を強化できる4つの方法

私たちが知っている食品の消費とレストラン体験の変革は、1921 年にカンザス州ウィチタでアメリカ初の...

最高裁判所は顔認識に関する新たな規制を発表:顔情報の収集には「個別の同意」が必要

[[414466]] 7月28日、最高人民法院は「顔認識技術を用いた個人情報処理に関する民事訴訟にお...

プログラマーは30歳で転職すべきでしょうか?曲がるならどちらの方向がいいでしょうか?

最近、皆さんは次のような H5 に悩まされていると思います。広告ポスター500枚の予算は2,000元...

医療の発展は自動化に向かっており、手術ロボットは急速に発展している。

社会の継続的な発展に伴い、わが国の医療・ヘルスケア産業は徐々に変化を迎え、医療機器のインテリジェント...