分散アルゴリズムに関連し、Redis を使用して 1 億から 2 億のデータ キャッシュを解決します。

インタビューの質問: 1 億から 2 億のデータをキャッシュする必要があります。ストレージ ケースはどのように設計すればよいですか?

回答: 単一マシンを使用することは 100% 不可能です。分散ストレージでなければなりません。Redis を使用して実装するにはどうすればよいですか?

一般に、業界には 3 つのソリューションがあります。

ハッシュ剰余パーティション

ここに画像の説明を挿入します
2 億レコードは 2 億 k です。v. 単一のマシンでは実行できず、複数のマシンに分散する必要があります。クラスタを形成する 3 台のマシンがあると仮定します。ユーザーによる各読み取りおよび書き込み操作は次の式に基づきます。 hash(key)%N マシン数. 、ハッシュ値を計算し、それを使用してデータがどのノードにマップされるかを定義します。
利点: シンプル、粗雑、直接的かつ効果的 データを見積もり、一定期間のデータ サポートを確保するために 3、8、または 10 などのノードを計画するだけで済みます。ハッシュ アルゴリズムを使用して要件の特定の部分を同じサーバーに配置すると、各サーバーがリクエストの固定部分を処理し (そしてこれらのリクエストの情報を維持し)、負荷分散 + 分割統治の役割を果たします。

デメリット: 当初計画していた欠点は、拡張・縮小の手間が増える 拡張・縮小に関わらず、データ変更のたびにノード変更が発生し、マッピング関係を再計算する必要がある サーバー数が固定されている場合は問題ない弾性ホールの溶解が必要な場合、または障害が発生した場合、元の弾性率の式が変更され、ハッシュ (キー)/3 が変更されます。このとき、アドレスに対する剰余演算の結果は大きく変化し、計算式に従って求めたサーバーも制御不能になります。

あるredisマシンがダウンしており、マシン数の変更によりハッシュの余りが再シャッフルされ、全データが再シャッフルされます。

ハッシュアルゴリズムのパーティショニング

**一貫したハッシュ リング:** 一貫したハッシュにはハッシュ関数があり、アルゴリズムに従ってハッシュ値を生成する必要があります。このアルゴリズムのすべての可能なハッシュ値は完全なセットを形成し、このセットはハッシュ空間になる可能性があります [ [0, 2 32-1]、これは線形空間ですが、アルゴリズムでは適切な論理制御 [0=2 32] によって端と端を接続し、論理的に円形の空間を形成します。

こちらもモジュロ方式を踏襲しており、先ほど紹介したノードモジュロ方式はノード(サーバー)の数を剰余する方式です。一貫性のあるハッシュ アルゴリズムは、モジュロ 2 32 を使用します。簡単に言うと、一貫性のあるハッシュ アルゴリズムは、ハッシュ値空間全体を仮想リングに形成します。たとえば、ハッシュ関数 H の値空間が 0-2 32-1 であると仮定します (つまり、 、ハッシュ値は 32 ビットの符号なし整数です)。ハッシュ リング全体は次のようになります。空間全体は時計回りに編成されています。リングの真上の点は 0 を表し、リングの右側の最初の点は 0 を表します。 0 点は 1 を表し、2 32-1 まで同様に続きます。つまり、0 点の左側の最初の点は 2 32-1 を表し、0 と 2 32-1 は 0 点の方向に統合されます。これは 2 32 個のポイントで構成されていると考えます。リングはハッシュ
ここに画像の説明を挿入します
リング。クラスター内の各 IP ノードをリング上の特定の位置にマッピングします。

各サーバーにハッシュを使用する: 具体的には、サーバーの IP またはホスト名をキーワード ハッシュとして選択して、各マシンがハッシュ リング上の位置を決定できるようにします。4つのノードnodeA、B、C、Dを追加し、IPアドレスのハッシュ関数(hash(ip))を計算すると、IPアドレスをハッシュ化した後のリング空間上の位置は以下のようになります。

ここに画像の説明を挿入します
kv キーと値のペアを保存する必要がある場合、最初にキーのハッシュ値 hash(key) を計算し、同じ関数 hash を使用してこのキーのハッシュ値を計算し、リング内のこのデータの位置を決定します。 、リングに沿ったこの位置から時針が「歩く」とき、最初に遭遇したサーバーが検索対象のサーバーとなり、キーと値のペアがそのノードに保存されます。

たとえば、objectA、objectB、objectC、objectD という 4 つのデータ オブジェクトがあるとすると、ハッシュ計算後のリング空間内の位置は、コンシステント ハッシュ アルゴリズムに従って、データ A はノード A に割り当てられ、データ b は次のようになります。ノードB では、c がノード C に割り当てられ、d がノード D に割り当てられます。

ここに画像の説明を挿入します

アドバンテージ

フォールトトレランス:nodec がダウンしていると仮定すると、オブジェクト A、B、D は現時点ではヒーロー コインを受け取らず、オブジェクト c のみが nodeD にリダイレクトされることがわかります。一般に、イデオロギー ハッシュ アルゴリズムでは、サーバーが利用できない場合、影響を受けるデータは、このサーバーからそのリング スペース内の前のサーバー (つまり、時計回りに歩いているときに最初に遭遇したサーバー) までのデータのみです。他の人は影響を受けません。簡単に言うと、c がクラッシュした場合、影響を受けた B と C 間の知識データは D に転送されて保存されます。

ここに画像の説明を挿入します
スケーラビリティ: データ量が増えるとノードを追加する必要がある x の位置は A と B の間にあり、影響を受けるのは A と X の間のデータです。A からデータは上がるだけで、ハッシュがフェッチされたり、すべてのデータが再シャッフルされたりすることはありません。

ここに画像の説明を挿入します

欠点がある

ハッシュリングのデータスキュー問題

一貫性のあるハッシュ アルゴリズムのサービス ノードが少なすぎると、ノードの分散が不均一になるため、データ スキュー (キャッシュされたオブジェクトのほとんどが特定のサーバーにキャッシュされる) が発生しやすくなります。たとえば、システム内に 2 つのサーバーがあります。

ここに画像の説明を挿入します

要約する

ノード数が変わった際に移行するデータを最小限に抑えるため

すべてのストレージ接地点を端と端で接続されたハッシュ リング上に配置し、ハッシュを計算すると、各ストレージ ポイントは時計回りに隣接するストレージ ポイントに格納されることがわかります。ノードが参加または離脱すると、ハッシュ リング上で時計回りにそのノードに隣接する後続のノードにのみ影響します。

利点: 追加と削除は、ハッシュ リング内の時計回りに隣接するノードにのみ影響し、他のノードには影響しません。

短所: データの分散はノードの位置に関係しており、これらのノードはハッシュ リング上で均等に分散されていないため、データを保存するときに均等に分散できません。

ハッシュスロットパーティション

1. コンシステント ハッシュ アルゴリズムのデータ スキュー問題はなぜ発生しますか? ハッシュ スロットは本質的に配列であり、データ [0,2^14-1] がハッシュ スロット空間を形成します。

2. できること: 一様分散の問題を解決するために、データとノードの間にハッシュ スロット (スロット) と呼ばれるデータとノードの関係を管理する別のレイヤーを追加します。スロットはノードに配置され、データはスロットに配置されます。スロットは粒度の問題を解決し、粒度を大きくすることでデータの移動を容易にします ハッシュはマッピングの問題を解決し、キーのハッシュ値を使用してスロットを計算するため、データの分散が容易になります。
ここに画像の説明を挿入します

3. ハッシュ スロットはいくつありますか?

クラスターには、0 ~ 16383 (0-2^14-1) の番号が付けられた 16384 個のスロットのみを含めることができます。これらのスロットはクラスター内のすべてのマスター ノードに割り当てられ、割り当て戦略の要件はありません。どの番号付きスロットをどのマスター ノードに割り当てるかを指定できます。クラスターは、ノードとスロット間の対応する関係を記録します。ノードとスロット間の関係を解決した後、ペアのハッシュ値を見つけて、16384 の余りを取得する必要があります。残りは、いくつかのキーの後に対応するスロットに収まります。スロット=CRC16(キー)%16384. スロット単位でデータを移動します スロット数が固定されているため処理が容易になり、データ移動の問題が解決されます。

Redis クラスターには 16384 のハッシュ スロットが組み込まれています。Redis は、ノードの数に応じてハッシュ スロットを異なるノードにほぼ均等にマッピングします。キーと値を Redis クラスターに配置する必要がある場合、Redis は最初に crc16 アルゴリズムを使用して、キーを計算し、結果の残りを 16384 まで計算し、各キーが特定のノードにマッピングされる 0 ~ 16484 の番号が付いたハッシュ スロットに対応するようにします。次のコードでは、キー A と B はノード 2 にあり、キー C はノード 3 にあります。

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_49750432/article/details/133275166