ホームページ  >  記事  >  データベース  >  Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット

Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット

WBOY
WBOY転載
2022-03-28 13:35:483956ブラウズ

この記事では、Redis に関する関連知識を提供します。主にコンシステント ハッシュとハッシュ スロットに関連する問題を紹介します。拡張が発生したり、ノードが失われたりすると、多くの問題が発生します。データ移行の問題、一貫したハッシュとハッシュ スロットを使用すると、この問題を回避できます。

Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット

推奨学習: Redis 学習チュートリアル

x 個のキャッシュ デバイスがある場合、どれにデータを配置するかを決定します。デバイスにキャッシュするときは、キー %x を使用できますが、拡張が発生したりノードが失われた場合は、キー %(x±y) が必要になります。これにより、多くのデータ移行の問題が発生します。一貫したハッシュとハッシュ スロットにより、この問題を回避できます。この問題。 。

一貫性のあるハッシュの原理

通常のハッシュはサーバー数の残りであり、一貫性のあるハッシュは特定の数 (2^32) の残りであり、数によって変化することはありません。まず、サーバーの IP またはその他の一意の識別子の残りを取得して、値を取得します。この値は、ハッシュ リング上のサーバーの位置です。次に、サーバーに配置されるオブジェクトをハッシュして、値を取得します。ハッシュを対応するサーバーに置き換えて値を見つけます。その場所にサーバーがない場合は、次の場所のサーバーが保存可能なサーバーを見つけられるかどうかを確認します。

1. リング空間

一般的に使用されるハッシュ アルゴリズムに従って、対応するキーを 2 の 32 乗ノード、つまり 0 の空間にハッシュします。 ~ (2/32)-1 デジタル空間で。これが尻尾を噛んで閉ループを形成していると想像できます。
Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット

2. サーバーをリングにハッシュする

リングが配置されたので、サーバーをリングに配置する必要があります。これはサーバーの IP アドレスに基づいて実行でき、番号とその他の一意の識別子を取得し、ハッシュしてリング上に置きます。
Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット服务器

3. データの保存と取得

データをサーバーに置く必要がある場合、最初にハッシュを計算する必要があります。データの値を取得し、余りを取り、その余りの値がリング上に対応するサーバーがある場合はそのまま置き、ない場合は逆方向に検索します。
Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット
したがって、最終的に data1 は redis1 に存在し、data2 は redis2 に存在します。データを取得するときも同様の処理を行い、キーのハッシュ値を計算し、同じルールに従って格納されているサーバーを取得します。

4. サーバーの削除と追加

Redis ノードがハングアップした場合、他のノードのデータはまだ存在しており、元のノードのデータも残ります。データは次のノードに再配布されます。
新しいサーバー RedisNeo が環境に追加されると、RedisNeo はハッシュ アルゴリズムを通じてリングにマッピングされ、時計回りの移行ルールに従って、Redis2 と RedisNeo の間の以前のハッシュ値を持つデータが RedisNeo に移行されます (以下) 図では、RedisNeo は Redis2) の隣にあり、他のオブジェクトは元の保存場所を維持しています。ノードの追加と削除の分析を通じて、コンシステント ハッシュ アルゴリズムはデータ移行を最小限に抑えながら単調性を維持します。このようなアルゴリズムは分散クラスターに非常に適しており、大量のデータ移行を回避し、サーバーへの負荷を軽減します。
Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット
したがって、redisNeo が追加された後、data3 は redisNeo に入ります。

5. バランス

これまでのところ、整合性ハッシュは完了したと考えられますが、まだ解決する必要がある問題が 1 つあり、それはバランスです。以下の図から、サーバー ノードの数が比較的少ない場合、必然的に 1 つのノードに大量のデータが集中するという問題が発生することがわかります。 [2,10] の間のハッシュ値を持つものだけがノード 10 に移動し、他のものはすべてノード 10 に移動するため、ノード 1 に対するプレッシャーは明らかに無限大です。ノード 1. このデータ スキューの問題を解決するために、コンシステント ハッシュ アルゴリズムでは仮想ノード メカニズムを導入しています。つまり、各サービス ノードに対して複数のハッシュが計算され、各計算結果の位置に 1 つのサービス ノードが配置されます。仮想ノード。具体的な方法としては、最初に各物理ノードに関連付けられた仮想ノードの数を決定し、その数を IP またはホスト名の後に追加することが考えられますが、同時に、仮想ノードのマッピングを除いて、データ配置アルゴリズムは変更されません。実際のノードに。

ハッシュ スロット

ハッシュ スロットは Redis クラスター クラスター スキームで使用されます。Redis クラスター クラスターは一貫したハッシュ スキームを使用しませんが、データ シャーディングでハッシュを使用します。スロットはデータの保存と読み取りに使用されます。 Redis クラスターは、データの保存とデータの読み取りにデータ シャードのハッシュ スロットを使用します。 Redis クラスターには合計 2^14 (16384) 個のスロットがあり、すべてのマスター ノードには 0 ~ 1000 などのスロット領域があり、スロット数は移行できます。マスターノードのスレーブノードはスロットを割り当てず、読み取り権限のみを持ちます。ただし、コードでは、redis クラスターはマスター ノード上で読み取りおよび書き込み操作を実行しますが、読み取り用のスレーブ ノードと書き込み用のマスター ノードではないことに注意してください。 Redis クラスターが初めて作成されるとき、マスター ノードによって 16384 個のスロットが均等に分散されます。
Redis キャッシュ学習一貫性のあるハッシュとハッシュ スロット
コンシステント ハッシュと比較すると、拡大および縮小する場合はハッシュ スロットを手動で割り当てる必要があり、マスター ノードを削除する場合は、そのスレーブ ノードとハッシュ スロットを他のマスターに与える必要があります。スロットは CRC-16 (キー) 384 の値に基づいて、どのスロットに属するかを決定します。

推奨される学習: Redis チュートリアル

以上がRedis キャッシュ学習一貫性のあるハッシュとハッシュ スロットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。