詳細な一貫性のあるハッシュ

まず、使用Redisのクラスタ

我々はRedisのを使用する場合、読み取りと書き込みのパフォーマンスのRedisの向上、Redisの高可用性を確保するために、コピーする最も簡単な方法は、我々はマスターマスターまたはマスター・スレーブのフォーム、またはデータのRedisのクラスタセットアップで組成物からのショットを呼び出します。データベースに似た別の読み取りおよび書き込みは、プライマリコピーから分離してお読みください。以下:
ここに画像を挿入説明
またデータベース、単一のテーブルと同様のデータニーズが大量のデータとき場合(標準はRedisのサーバー容量に応じて、異なっていてもよい)、我々はまた、缶Redisのサブライブラリーサブテーブルの500Wより大きくする場合同様の操作は、サブライブラリーのサブテーブルです。

私たちはソーシャルネットワーキングサイトを持っていると仮定し、あなたは、キーと値のペアとして形式で格納されたリソースRedisの店の写真を使用する必要があり、キーは絵の名前で、ファイルパス画像サーバの値、私たちは、ファイルは、ファイル名に基づいてファイルサーバーを見つける必要がありますデータの量にパスがライブラリは、我々が合意されたルールに従って分割され、2000W程度で、ランダム割り当て規則は、我々は、各データの500W程度含む、およびマスター・スレーブレプリケーション図以下、8台のキャッシュサーバーを展開できることです:
ここに画像を挿入説明
ルールはランダムであるように、私たちのすべては、いずれかのデータでありそうな、我々は、ユーザー名はルールがランダムであるので、我々はわからない、「a.png」画像として保存されている見つける人物として、Redisのを設定しています特にRedisのサーバーれているので、私たちは(すべてのRedisのサーバーを介して、あるもの)、クエリのことができるようにするために1,2,3,4,4クエリに必要な、これは明らかに私たちが望む結果ではない、そこにあります、と思うかもしれジュニアパートナーについてのランダムなルールがない見つける、あなたは同様のデータベースを使用することができます ライブラリサブテーブルのルール:ハッシュ値によると、モジュロ、カテゴリによって、共通のルール特定のフィールド値に従って、などが出てくることができます!さて、私たちのテーマに応じて、我々は、ハッシュ方法を使用します。

第二に、ハッシュが使用Redisのクラスタ

:実行するサブライブラリーは、特定のサーバを対象とすることができたときに一つは次のように図であり、我々はハッシュ方法を使用する場合は、その各々の絵を想像することができる
ここに画像を挿入説明
のので、私たちが探していると仮定すると、「a.png」で、上の図を式があるので、(ライブラリから除外)4台のサーバはhash(a.png) % 4 = 2、それがすべてのサーバを経由しないように、大幅にパフォーマンスを向上させる、第2のサーバを配置見られるように!

第三に、ハッシュ問題の使用

上記の方法は、パフォーマンスを向上させるためにも、我々はもはや必要では全体のRedisサーバを横断します!しかし、ハッシュアルゴリズムを使用してキャッシュは、主にサーバーの数、すべてのキャッシュの場所を変更しなければならないの変化に反映され、いくつかの欠点があるでしょう!

4つのキャッシュ・サーバ・キャッシュは、私たちの需要を満たすことができないならば、どのように我々はそれを行う必要があり、想像してみ?非常に単純な、リスト上の増加のキャッシュサーバではないよりもさらにいくつかの!仮定:私たちは、キャッシュサーバを追加して、キャッシュサーバの数は4の5セットとなります。オリジナルのように、hash(a.png) % 4 = 2方程式がなりhash(a.png) % 5 = ?、結果は想像することができ、これは確かに結果2を持っていないときに、サーバの数、すべてのキャッシュの場所の変更を変更しなければならないということです!サーバの数が変更されたとき、それは、バックエンドデータベースにデータを要求したときに、アプリケーションが(「のいずれかに覚えてキャッシュからデータを取得することができないときに、他の言葉では、一定時間内にすべてのキャッシュは、無効であるキャッシュなだれ」右?)!

同様に、4つのキャッシュが急にキャッシュすることはできません、キャッシュサーバに障害が発生していることを仮定して、我々は障害のあるマシンを削除する必要がありますが、あなたはキャッシュサーバを削除した場合、キャッシュは4からサーバーの数になります3セットは、また、問題の上に表示されます!

だから、私たちはこれを防ぐための方法を考えますが、理由はモジュロ法を使用してキャッシュが、この状況は、これらの問題を解決するために、回避することはできません上記のハッシュアルゴリズム自体、ハッシュアルゴリズムの一貫性(一貫性の必要がありますハッシュアルゴリズム)が誕生しました!

第四に、一貫性ハッシュアルゴリズムの謎

一貫性ハッシュアルゴリズムは、今説明しただけで、剰余法はモジュロサーバーの数、および一貫性のペア2ハッシュアルゴリズム実行され、剰余を使用することですそれはどういう意味、剰余を、?手短に言えば、このようなハッシュ関数の想定値として仮想リングに全体ハッシュアルゴリズムハッシュ値空間の一貫性、Hは空間0~2である 32-1(すなわち、ハッシュ値は、32ビットの符号なしです:シェーピング)、などの全体ハッシュリングは、以下
ここに画像を挿入説明
、空間全体を時計回り組織右に0,0ポイントは1を表す第一の環状上記正点を表す、というように、2,3,4,5- 、6 ......まで2^32-1、つまり0左側の代表点の第一点2^32-10および2^32-1ゼロ方向に重ね、我々はこの製2^32点はハッシュなる環状リングと呼ばれています。

ハッシュのハッシュを使用して、または各サーバの次のステップは、具体的には、各マシンは、それが、4つの上方に想定されるハッシュリング上にその位置を決定することができるように、ハッシュキーとしてサーバのIPホスト名を選択することができます以下のようにハッシュ空間位置ループ内のIPアドレスを使用してサーバ後
ここに画像を挿入説明
のデータを配置する適切なサーバにアクセスするために、次のアルゴリズムを使用して、次へ:同じハッシュ関数のハッシュ値が算出さ用いて鍵データを、リング上のデータの位置を決定します、遭遇した最初のサーバのサーバを対象とする「歩行」、に沿ってリングの位置から時計回りに!

例えば、我々は、オブジェクトA、オブジェクトB、オブジェクトC 、オブジェクトD 次のように4つのデータオブジェクトは、ハッシュ後、リング上の空間位置である:
ここに画像を挿入説明
ハッシュアルゴリズムの一貫性、データAがノードAに対して設定され、 Bは、ノードBに対して設定され、Cは、ノードCへとして設定され、Dは、ノードDへとして設定されています

五、フォールトトレランス一貫性のハッシュアルゴリズムおよびスケーラビリティ

残念ながら、今、ノードCがダウンして、この時間は、A、B、Dが影響を受けていないオブジェクトを見ることができる、唯一のCがノードDに再配置されているオブジェクトと仮定 サーバが利用できなくなった場合、一般的に、整合性ハッシュアルゴリズム、データはサーバの前にリング空間反時計方向に走行遭遇する(すなわち、最初のサーバにのみ影響を受けるサーバーであります:)データと、他のは、以下のように、影響を受けていない
ここに画像を挿入説明
私たちは別の場合を考える、追加のサーバ、ノードXと、システムに以下のように:
ここに画像を挿入説明
この場合、オブジェクトのオブジェクトA、B、Dが影響されません新しいノードXに移転するだけで、オブジェクトCの必要性!一般的に、一貫性ハッシュアルゴリズムは、追加のサーバ場合、データはサーバのみのリングスペース前に新しいサーバーに影響される(すなわち、反時計回り方向に走行遭遇する最初のサーバー)他のデータとの間でのデータは影響を受けません。

要約すると、整合性ハッシュアルゴリズムノードを増減することは、リング再配置データ空間のごく一部であり、良好な耐障害性と拡張性を有しています。

六、ハッシュデータは、傾斜リングを発行します

一貫性ハッシュアルゴリズムときにあまりにも簡単にそのようなシステムでは、2つだけのサーバ、環の分布などの不均一な傾きに起因するノードデータセグメント(キャッシュされたオブジェクトが特定のキャッシュサーバに集中する)の問題、以降のノードにサービスを提供次のように:
ここに画像を挿入説明
この濃度では、必然的にノードAに大量のデータにつながる、とごく少量のノードBの上に配置されます 各サービスノードのハッシュを複数算出する。このデータスキューの問題は、一貫したハッシュアルゴリズムを導入し、仮想ノードの機構に対処するために、計算結果の各々は、ロケーション・サービス・ノード内に配置された仮想ノードと呼ばれます。具体的な実践は、達成するために、サーバのIPまたはホスト名の後ろの数を増やすことができます。

上記の例の場合は、3つ次に「ノードA#1」、「計算することができ、各仮想サーバ・ノードのために計算することができる 、ノードA#2」、「ノードA#3」、「ノードB#1」 、それぞれ「ノードB#2「」ノードB #3 『 こうして6つの仮想ノードを構成するハッシュ値:
ここに画像を挿入説明
データ不変測位アルゴリズム一方、実際のノード、例えば対象の複数の仮想ノードマッピングステップ』#1ノード「」#2ノード『』データ#3「3つの仮想ノードがノードA上に位置するノード。これは、ノードデータスキューの問題がどこから来たサービスを解決するだろう。実際の応用では、通常、仮想ノードの数がそれほど小さくても、サービス・ノードは、データの比較的均一な分布を行うことができ、32以上に設定されています。

セブンは、一貫性がここに反映され

K:キーサービスデータ、N:クラスタマシンの数

  • 伝統的な方法:K%nは、ここで、nの変化は、ほとんど大部分のキー(すべてではない)の、変更前のノードのマシンに落ちることはありません。それは、つまり重要な用語のほとんどのために、追加または削除ノード、変更はノードを所有しているにつながる、とオリジナルともはや一致している、それがキャッシュで行われている場合、それはいわゆる雪崩を引き起こし、データベースに至るまで直接リクエストを引き起こします。

キー:キーの合計数、nは業務データ:クラスタマシンの数

  • キーをすることができるようにする整合性ハッシュ仮想ノードとして、均一にランダムな nに分配されます。
  • Nが増加すると、元のマシンは、それぞれ、すべてのノードがほぼ同じ数のキーを占めるように、機械を増加させるために、キーの新しい部分に来るとき各ノードは、マシンの新しい増加ではなく、ほぼ完全に再割り当て破壊されて上記モジュロに、一部出ていることを、ここで注意してください。
  • 時間を短縮し、N、ノード撃墜すると、彼はマシンにも同様に生き分け、鍵の所有していただろうここでも、ここでの再配布を中断されていません。私は、キーに保存されているマシンがハングアップしていない、との変化は移行されませんが、追加のキーと、前にいくつかのマシンがハングアップ保存されているものを共有しています。

要約すると、一貫性のあるハッシュConsistent Hashingいわゆる一貫性が重要な用語です。非一貫性のあるハッシュ、剰余道、クラスタノードの変更、キーの変更も続きます。一貫したハッシングは、クラスタノードの変更は、キーの偉大な状況は、次の変更を追跡するつもりはありません。比較すると、それは同じに近いです。

公開された158元の記事 ウォンの賞賛119 ビュー810 000 +

おすすめ

転載: blog.csdn.net/u013474436/article/details/104622354