まず、一貫性のハッシュが何であるかを見て、ここのブログをお勧めします:
http://blog.csdn.net/cywosp/article/details/23397179/
分散アプリケーションでは、膨張・収縮は、アプリケーションが潜在的な影響を最小限に抑えるために、この時間は一貫性を使用する必要があるので、予期せぬ大規模な大変動が起こらないことができ、基本的に利用可能である間の半自動化されたプロセスであり、ロード・バランシングおよびサブライブラリーのサブテーブル、ハッシュルーティングアルゴリズムのハッシュアルゴリズムは、分散シナリオの役割において非常に重要です。
一貫性のハッシュアルゴリズムは、紙コンシステントハッシュ法とランダム木、より広くキャッシュシステムの現在では、早ければ1997年のように提案されました。
1つの基本的なシナリオ
たとえば、N個のキャッシュサーバ(以下、キャッシュと呼ばれる)は、その後、どのようにN個のキャッシュ上にマッピングされたターゲット・オブジェクトは、おそらく次のような一般的な方法を用いてハッシュ値オブジェクトを計算し、その後均一Nにマッピングされキャッシュ;
ハッシュ(オブジェクト)%N
すべてが正常に動作し、その後、以下の2つのケースを検討します。
キャッシュメートルのオブジェクトにマッピングされたすべてが失敗するように、キャッシュサーバオフダウン1メートル、(実際には、この場合に考慮されなければならない)、どのようにこの時間はNであるキャッシュ、キャッシュから削除メートルをキャッシュする必要があります-1局は、マッピング式は、ハッシュ(オブジェクト)%(N-1)となります。
アクセスに2増加は、キャッシュを追加する必要があり、この時間は、N + 1キャッシュテーブルで、マッピング式は、ハッシュ(オブジェクト)%(N + 1)となります。
どのような1と2意味ですか?これは、ほとんどすべての突然のキャッシュが無効であることを意味します。サーバーの場合、これは災害があり、意志を直接バックエンドサーバーに向けたアクセスの洪水。
再び、あなたは明らかに上記のハッシュアルゴリズムを行うことができない、より多くのライブを行うためにノードを再度追加する必要があり、成長しているため、ハードウェアの能力に、3番目の質問を検討します。
一貫性のハッシュである。このような状況行いを変更する方法はあります...
2ハッシュアルゴリズムと単調性
次のように定義される単調ハッシュアルゴリズム(単調性)の尺度:
単調性は何かが適切なバッファに割り当てられている場合、新しいハッシュがシステムに追加されることで、そこにバッファリングされていることを意味します。ハッシュ結果は、オリジナルのコンテンツがマップに新しいバッファに割り当てることができ、他のバッファの古いバッファセットにマップされないことを保証することができるはずです。
容易に分かるように、上記の単純なアルゴリズムハッシュハッシュ(オブジェクト)%のNの単調性要件を満たすことは困難です。
原則3一貫したハッシュアルゴリズム
一貫性のハッシュアルゴリズムは、簡単に言えば、ハッシュ、削除時に/キャッシュを追加することです、それは可能な限り小さくすることができマッピング関係が単調要件を満たすために可能な限り、存在して変更するための鍵となっています。
ここでは5つの簡単な手順は、一貫性のハッシュアルゴリズムの基本的な原則について話従うことです。
3.1ハッシュ環状空間
一般的に32の値にマッピングされたアルゴリズムのキー値、すなわち、0 32-1 ^ 2までの空間力の値をハッシュすると考えられる。我々は想像することができる第一空間(0)尾(2 ^以下、図1に示すように、リングと接触している32-1)。
一貫性のハッシュアルゴリズムは、紙コンシステントハッシュ法とランダム木、より広くキャッシュシステムの現在では、早ければ1997年のように提案されました。
1つの基本的なシナリオ
たとえば、N個のキャッシュサーバ(以下、キャッシュと呼ばれる)は、その後、どのようにN個のキャッシュ上にマッピングされたターゲット・オブジェクトは、おそらく次のような一般的な方法を用いてハッシュ値オブジェクトを計算し、その後均一Nにマッピングされキャッシュ;
ハッシュ(オブジェクト)%N
すべてが正常に動作し、その後、以下の2つのケースを検討します。
キャッシュメートルのオブジェクトにマッピングされたすべてが失敗するように、キャッシュサーバオフダウン1メートル、(実際には、この場合に考慮されなければならない)、どのようにこの時間はNであるキャッシュ、キャッシュから削除メートルをキャッシュする必要があります-1局は、マッピング式は、ハッシュ(オブジェクト)%(N-1)となります。
アクセスに2増加は、キャッシュを追加する必要があり、この時間は、N + 1キャッシュテーブルで、マッピング式は、ハッシュ(オブジェクト)%(N + 1)となります。
どのような1と2意味ですか?これは、ほとんどすべての突然のキャッシュが無効であることを意味します。サーバーの場合、これは災害があり、意志を直接バックエンドサーバーに向けたアクセスの洪水。
再び、あなたは明らかに上記のハッシュアルゴリズムを行うことができない、より多くのライブを行うためにノードを再度追加する必要があり、成長しているため、ハードウェアの能力に、3番目の質問を検討します。
一貫性のハッシュである。このような状況行いを変更する方法はあります...
2ハッシュアルゴリズムと単調性
次のように定義される単調ハッシュアルゴリズム(単調性)の尺度:
単調性は何かが適切なバッファに割り当てられている場合、新しいハッシュがシステムに追加されることで、そこにバッファリングされていることを意味します。ハッシュ結果は、オリジナルのコンテンツがマップに新しいバッファに割り当てることができ、他のバッファの古いバッファセットにマップされないことを保証することができるはずです。
容易に分かるように、上記の単純なアルゴリズムハッシュハッシュ(オブジェクト)%のNの単調性要件を満たすことは困難です。
原則3一貫したハッシュアルゴリズム
一貫性のハッシュアルゴリズムは、簡単に言えば、ハッシュ、削除時に/キャッシュを追加することです、それは可能な限り小さくすることができマッピング関係が単調要件を満たすために可能な限り、存在して変更するための鍵となっています。
ここでは5つの簡単な手順は、一貫性のハッシュアルゴリズムの基本的な原則について話従うことです。
3.1ハッシュ環状空間
一般的に32の値にマッピングされたアルゴリズムのキー値、すなわち、0 32-1 ^ 2までの空間力の値をハッシュすると考えられる。我々は想像することができる第一空間(0)尾(2 ^以下、図1に示すように、リングと接触している32-1)。
環状空間ハッシュ図。
スペースをハッシュする3.2オブジェクトマップ
次に、図に示すように、リング上のハッシュ関数のハッシュキー値の分布によって算出物体1〜object4、4つのオブジェクトを考慮する。
ハッシュ(物体1)= KEY1。
... ...
ハッシュ(object4)= KEY4。
オブジェクト24の図のキー値分布
スペースをハッシュする3.3キャッシュマップ
一貫性のある基本的な考え方は同じハッシュ値空間にマッピングされているオブジェクトやキャッシュにあるハッシュ化し、同じハッシュアルゴリズムを使用して。
これは、図3に示され、マッピング結果、電流は、B、およびC 3セットをキャッシュを持っていると仮定し、それらは対応するハッシュ値に配置されたハッシュ空間です。
ハッシュ(キャッシュA)=鍵A。
... ...
ハッシュ(キャッシュC)=鍵C。
物体の3及び図キャッシュキー値分布
ここでは、キャッシュのウェイのハッシュ計算によって、一般的な方法は、ハッシュ入力として、キャッシュ・マシンのIPアドレスまたはマシン名を使用することができます。
3.4オブジェクトがキャッシュにマップ
今キャッシュとオブジェクトが値空間をハッシュすると同じハッシュアルゴリズムによってマップされている、考慮すべき次のことは、上記をキャッシュするオブジェクトをマップする方法です。
オブジェクトのキー値から出発し、時計方向、キャッシュが満たされるまで場合は、この環状空間に、そのオブジェクトをキャッシュオブジェクトとハッシュ値が固定されているので、キャッシュに格納されているので、キャッシュが結合していますそれは、ユニークで決定されます。これは、マッピングオブジェクトの方法を見つけ、それをキャッシュしないのですか?!
上記の例はまだ(図3参照)を継続し、次いで、上記の方法によれば、対象物体1は、キャッシュAに格納され、対応するキャッシュCにオブジェクト2およびオブジェクト3; object4キャッシュBに相当します。
3.5キャッシュの変化を調べ
そして、最大の問題のハッシュ法の残りの部分によってもたらさリコールは、キャッシュは、キャッシュが失敗したときに変更し、バックエンドサーバーに大きな影響を引き起こすために、対象と単調ではないが、今の分析一貫したハッシュを分析する必要がありますアルゴリズム。
3.5.1削除キャッシュ
想定キャッシュBハングを考慮し、オブジェクトは、次の(キャッシュC)キャッシュとの間で横断されるまで、上記のマッピング方法によれば、この時間は方向反時計回りにのみキャッシュBに影響され、すなわち、それがマッピングされていますB.上でこれらのオブジェクトをキャッシュします
このように、キャッシュCに再マッピングされ、オブジェクトobject4を変更のみが必要;図2参照。
図4キャッシュBキャッシュマッピングされ除去された後
3.5.2追加キャッシュ
それは、オブジェクトとオブジェクト2オブジェクト3の間にキャッシュDにマッピングされ、新しいキャッシュ・Dケースを追加そのハッシュ環状空間を想定して考えます。(また、元のオブジェクト・キャッシュ・Cの部分にマッピングされている)(キャッシュB)との間のオブジェクトの次の反時計回りのトラバースされるまでキャッシュにのみDキャッシュの影響を受けることになる。この時点で、これらのオブジェクトは、Dキャッシュに再マッピングしますそれはすることができます。
したがって、キャッシュDに再マッピングされ、対象オブジェクト2を変更のみが必要;図2参照。
図5は、マッピング関係キャッシュDの後に追加されます
4仮想ノード
別のインジケータ考慮ハッシュアルゴリズムは、以下のように定義されたバランス(バランス)、です。
バランス
バランスは、バッファ空間のすべてが利用されていてもよいように、可能なバッファの全てに分配することができるハッシュ結果を指します。
オブジェクトが均一に、上記の例のように、キャッシュ、AのキャッシュとキャッシュCの配置、4つのオブジェクトのみの場合にマッピングされない場合、ハッシュアルゴリズムは、より少ないキャッシュ場合、バランスを保証していません、唯一の物体1店舗をキャッシュし、キャッシュCはオブジェクト2、オブジェクト3及びobject4に格納されている;の偏在を。
为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。
仍以仅部署 cache A 和 cache C 的情况为例,在图 4 中我们已经看到, cache 分布并不均匀。现在我们引入虚拟节点,并设置“复制个数”为 2 ,这就意味着一共会存在 4 个“虚拟节点”, cache A1, cache A2 代表了cache A ; cache C1, cache C2 代表了 cache C ;假设一种比较理想的情况,参见图 6 。
图 6 引入“虚拟节点”后的映射关系
此时,对象到“虚拟节点”的映射关系为:
objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;
因此对象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache C 上;平衡性有了很大提高。
引入“虚拟节点”后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所在 cache 时的映射关系如图 7 所示。
图 7 查询对象所在 cache
“虚拟节点”的 hash 计算可以采用对应节点的 IP 地址加数字后缀的方式。例如假设 cache A 的 IP 地址为202.168.14.241 。
引入“虚拟节点”前,计算 cache A 的 hash 值:
Hash(“202.168.14.241”);
引入“虚拟节点”后,计算“虚拟节”点 cache A1 和 cache A2 的 hash 值:
Hash(“202.168.14.241#1”); // cache A1
Hash(“202.168.14.241#2”); // cache A2
使用一致性hash的应用
Couchbase
Apache Cassandra
Akka
参考:
https://en.wikipedia.org/wiki/Consistent_hashing
https://community.oracle.com/blogs/tomwhite/2007/11/27/consistent-hashing
https://xing393939.github.io/tech/2016/02/26/distributed_solution.html