2-2-1コンシステントハッシュ問題と解決策

序文、分散およびクラスター

分散およびクラスター化された概念

分散とクラスターは同じではありません。分散はクラスターである必要がありますが、クラスターは必ずしも分散されているとは限りません(クラスターは複数のインスタンスの作業であり、分散システムが分割された後は複数の例になります。クラスターは必ずしも分散されているとは限りません。 、複製されたクラスターは分割されないが複製されるため)

ここに画像の説明を挿入

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

1.1。コンシステントハッシュアルゴリズムのハッシュ遡及的トレーサビリティ

セキュリティ暗号化の分野におけるMD5、SHA、その他の暗号化アルゴリズムなどのハッシュアルゴリズム、およびデータの保存と検索におけるハッシュテーブル。これらはすべてハッシュアルゴリズムを適用します。

なぜハッシュを使用する必要があるのですか?
ハッシュアルゴリズムは、データの保存と検索の分野でより一般的に使用されています。最も古典的なのはハッシュテーブルです。クエリの効率は非常に高いです。
ハッシュアルゴリズムの設計が優れている場合は、データハッシュテーブルのクエリ時間の複雑さはO(1)に近くなる可能性があります

1.1.1ケース
  • ケース:データセット1、5、7、6、3、4、8を提供し、このデータセットを保存してから、乱数nを指定します。nがデータセットに存在するかどうかを判断してください。

  • 順次検索

    list:List [1,5,7,6,3,4,8]
    //ループ判定によって実現
    for(int element:list){ if(element == n){ 等しい場合、nがに存在することを意味しますデータセット}}上記の方法は、逐次探索法と呼ばれている。この方法は、より原始的であまり効率的であり、ループによって完成されます



  • 分検索

    ソート後は、順次検索方式よりも効率的ですが、特に効率は良くありません。

  • 直接アドレッシング
    ここに画像の説明を挿入

    配列を定義します。配列の長さはデータセットの長さと同じです。長さは9で、データ1は添え字1の位置に格納され、3は添え字3の要素位置に格納されます。 、 等々。
    このとき、5が存在するかどうかを確認したいのですが、list.get(5)array [5]が空かどうかを判断するだけで済みます。空の場合は、データセットに5が存在しないことを意味します。空でない場合は、データセットに5が含まれていることを意味します。その中で、1回の検索で目標が達成され、時間計算量はO(1)です。この方法は「直接アドレス指定方法」と呼ばれます。データと配列の添え字を直接バインドし、検索時にarray [n]がデータを直接取得します。

    長所:高速、1回の検索で結果を見つける
    短所:
    1)上記の方法によると、1,5,7,6,3,4,8,12306などのスペースの浪費。最大値は12306です。 、次のようなものを定義する必要があります。長さは12307の配列ですが、保存されるデータはわずかであり、他の場所のスペースは無駄になります
    。2)次のようなデータ:1,5,7,6,3,4 、8,1,2,1,2,1、2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2最大値は12、これは13スペース未満で、あまり多くのコンテンツを保存できません

  • ジッパー方式

    ここで、別の設計では、データが3、5、7、12306、合計4つのデータである場合、5などの任意のスペースを開き、特定のデータが格納されている場所で、データを実行できます。モジュラスを見つける(空間位置の数は5)、モジュラス剰余に従って保存場所の添え字を決定します.3%5 = 3の場合、添え字が3の位置に3のデータを配置できます12306% 5 = 1、12306のデータを添え字1の位置に格納します

ここに画像の説明を挿入

上記のデータのモジュラス(データ%空間位置)はハッシュアルゴリズムですが、これは通常よりも単純なハッシュアルゴリズムであり、ハッシュアルゴリズムを構築するこの方法は、余りを分割して残す方法と呼ばれます。

データが1、6、7、8の場合、これら4つのデータを上の配列に格納します

ここに画像の説明を挿入
ジッパー方式:データ長を定義し、より多くのコンテンツを格納する方法、ハッシュ値を計算し、配列要素の格納場所にリンクリストを配置する方法

ここに画像の説明を挿入
ハッシュアルゴリズムの設計が優れている場合、クエリ効率はO(1)に近くなり、ハッシュアルゴリズムの設計が低い場合、クエリ効率は非常に低くなります。

ここに画像の説明を挿入
したがって、ハッシュテーブルのクエリ効率はハッシュアルゴリズムに依存します。ハッシュアルゴリズムはデータを均等に分散できるため、スペースを節約し
、クエリ効率向上させることができます。ハッシュアルゴリズムの研究は非常に深い知識であり、より複雑です。長い間、ハッシュテーブル内のハッシュアルゴリズム
も更新されており、多くの数学者もそれを研究しています。
剰余法を除算して残す3%5
ハッシュアルゴリズムを線形に構築する
直接アドレス指定法もハッシュを構築する方法ですが、より単純な式:H(key)= key than
H(key)= a * key + b(a 、bは定数です)
ハッシュコードは実際にはハッシュアルゴリズムを介して取得されます

1.2コンシステントハッシュアルゴリズムの負荷分散アプリケーションシナリオ

分散クラスターアーキテクチャシーンに
適用するハッシュアルゴリズムハッシュアルゴリズムは、分散クラスターアーキテクチャ⽐Redis、Hadoop、elasticsearch、Mysql
サブライブラリサブテーブル、Nginx負荷分散などの多くの製品に適用する分散クラスターです。
メジャーアプリケーションシナリオは2つに要約されています

1.2.1リクエストの負荷分散(nginxのip_hash戦略と同様)

ここに画像の説明を挿入

NginxのIP_hash戦略は、クライアントのIPを変更せずに、クライアントから送信されたリクエストを常に同じターゲットサーバーにルーティングして、セッションのスティッキ性を実現し、
セッション共有の問題に対処することを回避
できます。IP_hashストラテジーがない場合、スティッキーセッションを実装するにはどうすればよいですか?
クライアントIPまたはセッション
IDと特定のターゲットサーバー間のマッピング関係を格納するためのマッピングテーブルを維持できます<ip、tomcat1>
短所
1)次に、多くのクライアントの場合、マッピングテーブルが非常に大きくなり、メモリスペースが浪費されます。
2)クライアントがオンラインとオフラインになり、ターゲットサーバーがオンラインとオフラインになると、マッピングテーブルが再保守され、マッピングテーブルの保守コストが非常に高くなります。

1.2.2、Nginxのip_hash戦略C言語ソースコードコアパーツブラウジング
1.2.3コンシステントハッシュアルゴリズムの分散ストレージアプリケーションシナリオ

ハッシュアルゴリズムを使用する場合、多くの簡単なことで、IPアドレスまたはセッションIDのハッシュ値を⾏、ハッシュ値、サービス
番号インテーク⾏モジュロ演算に計算できます。結果の値は、現在のリクエストをサーバーにルーティングする必要がありますこのようにし
て、同じクライアントIPから送信された要求を同じターゲットサーバーにルーティングして、セッションのスティッキ性を実現できます。

分散メモリデータベースRedisを例にとる
と、クラスターにはredis1、redis2、redis3の3つのRedisサーバーがあります。次に、データを保存する場合、<key1、value1>データはどのサーバーに保存されますか?キー
hash(key1)%3 = indexのハッシュ処理、残りのインデックスを使用して、ストレージ用に特定のサーバーノードをロックします

2、手書きアルゴリズム

2.1、通常のハッシュアルゴリズムの問​​題

ここに画像の説明を挿入

2.2、コンシステントハッシュアルゴリズムの原理

ハッシュリング

ここに画像の説明を挿入

2.3コンシステントハッシュアルゴリズムの収縮と拡張の分析

ここに画像の説明を挿入
ここに画像の説明を挿入

2.4。コンシステントハッシュアルゴリズム+仮想ノードスキーム

1)前述のように、各サーバーは一定期間の責任を負い、コンシステントハッシュアルゴリズムはノードの増減のためにリングスペース内の
データのごく一部を再配置するだけでよく、フォールトトレランスとスケーラビリティが優れています。 。
ただし、サービスノードが少なすぎる場合、コンシステントハッシュアルゴリズムにより、ノードの分散が不均一になるため、データスキューの問題が発生する可能性があります。たとえば
システムにはサーバー2つしかなく、リングの分散は次のとおりです。ノード2は非常に小さなセグメントのみを担当でき、多数のクライアント
要求がノード1に発生します。これがデータ(要求)スキュー問題
2)この種のデータスキュー問題を解決するために、コンシステントハッシュアルゴリズムは仮想ノードメカニズムを導入します。つまり、サービスノードごとに複数の
ハッシュが計算され、各計算結果の位置がこのサービスノードに配置されます。仮想ノードと呼ばれます。
特定の方法は、サーバーのIP名またはホスト名の後に番号を追加することで実現できます。⽐サーバーの各セクションで計算されるように、仮想3
ポイントは、それぞれ「ノード1 ip#1」、「ノード1 ip#2」、「ノード1のip# 3 」、「ノード2」を計算します。 ip#1、「
ノード2のip#2 」、「ノード2のip#3」のハッシュ値は6つの仮想ノードを形成します。クライアントが仮想ノードに
ルーティングされると、実際にはその仮想ノードにルーティングされます。 node。仮想ノードに対応する実ノード

ここに画像の説明を挿入

2.5。手書きによるハッシュアルゴリズムの通常のハッシュアルゴリズムの実現

ここに画像の説明を挿入

2.6。手書きによるハッシュアルゴリズムのコンシステントハッシュアルゴリズムの実装

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

2.7。手書きによるハッシュアルゴリズムのコンシステントハッシュアルゴリズムの実装と仮想ノードスキームの実装

3、Nginx構成のコンシステントハッシュ負荷分散戦略

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42082278/article/details/112512777