4001.jpg

 上記図からA、C、Bは影響されず、Dノードのみサーバー2に固定しなおされたのが分かる。【これは分散式の中で非常に位置決めがしやすい、例えばサーバー3がファイターしたとれば、一致性ハッシュアルゴリズムに基づいてサーチする時に、Dがサーバー2にあるが、サーバー3がファイターしたばっかりの時に、サーバー2にDがないことが見られる、この時アプリケーションはデータをサーバー2にキャッシングすることになる。この時、Dはサーバー2にハッシュされる】

 次は、もう一つの情況を考慮しよう、もし我々はシステムの中にもう一台のサーバーMemcached Server4を増やした場合:

5001.jpg

 この時、Bはサーバー2へデータをサーチしに行かず、サーバー4でサーチする。もしBがこの時サーバー4に存在しない場合、データベースから取り戻したBをサーバー4にキャッシングすることになる。そしてサーバー2にあるデータは長時間アクセスされない或いは期限切れでmemcachedにクリアされる。上記を纏めると、一致性ハッシュアルゴリズムはノードの増減に対して、リングスペースにある一部のみのデータを位置づけし直せばよく、優れたフォールトトレランスと拡張性がある。

 もちろん、何事も両面性がある。

 一致性ハッシュアルゴリズムはサーバーノードが余りにも少ない時に、ノードの分布が不均等によって、データ傾斜の問題が引き起こしやすい。例えば、我々のシステムに二台のサーバーがあって、そのリング分布は下記の如く:

6001.jpg

 そうすると、この時のデータは大半サーバー1に保存され、2は1に近すぎるのでごく少ないデータしかない。このようなデータ傾斜の問題を解決するために、一致性ハッシュアルゴリズムはバーチャルノードメカニズムを導入した、即ち、各サーバーノードに対して複数のハッシュを計算する【具体的なやり方は、サーバーの名前或いはIPに基づいてノードハッシュを計算する時に、番号をつけてから、ハッシュ値を計算する】、全てに計算結果の位置に一つのサーバーノードを設置する、それをバーチャルノードと呼ぶ。そうすれば、データが再度保存される時に、サーバーがリングでの距離が大きすぎて、「データ傾斜」が発生しなくなる。

 それからMemcachedの分散式は、完全にユーザーエンドによって実現される。このような分算式はMemcachedの最も大きな特徴である。

 現在の一致性ハッシュは分散式の基準配置である。