一貫性のハッシュアルゴリズムを理解します

シーン解析

分散キャッシュ設計の柔軟性では、最も重要な目標は、サーバ全体のクラスタがキャッシュされている必要がありますように、データをアクセスすることも可能である、新しく追加されたキャッシュサーバです。サーバークラスタの管理のためのどのサーバークラスタへのクライアントアクセスかどうかを判断し、重要なルーティングアルゴリズム、。


残りのハッシュ

単純なルーティングアルゴリズムを使用することができ、残りのハッシュ

キャッシュデータのキーに加えて、サーバーの数、および残りのハッシュ値は、サーバのインデックス番号のリストです。

アイデアは、以下のことを実現するための簡単なコードです。

class RemainderHash {

    private List<String> serverNodes;
    private int serverNodeSize; public RemainderHash(List<String> serverNodes) { this.serverNodes = serverNodes; this.serverNodeSize = serverNodes.size(); } public String getServerNode(String key) { return serverNodes.get(hash(key)); } public int hash(String key) { return Math.abs(key.hashCode() % serverNodeSize); } } 

このアルゴリズムは、キャッシュされたデータは、バランスのとれた全体のサーバークラスタで配布されていることを保証します。
4拡張ユニット3からサーバ場合には、膨張前と後の繰り返しのキャッシュヒット率は、(膨張前及び後、依然として同じキャッシュサーバ上の同じデータ)のみ24.99パーセントであり、拡張ステーション101、膨張前及び後バッファ100サーバ場合唯一の0.71パーセントの繰り返しヒット率。このテストコードでのバランスと繰り返しヒット率

ハッシュアルゴリズム残りは実際の生産のニーズを満たすことができないように。


イデオロギー的一貫性ハッシュアルゴリズム

これらの問題を解決するために、より多くの人気アルゴリズムは、一貫性のあるハッシュアルゴリズムがあることにより、一貫性Hashのデータ構造のリングを実装するkeyマップ・キャッシュ・サーバーに。

アルゴリズムの具体的なプロセスである:
①第2の長さコンストラクト32積分リング(以下、整合性ハッシュ環)、
②ノード名は、ハッシュ値(範囲で分布[0,2によれば32 -1])キャッシュ(バランスがリング上に配置されていることを確認するためにn個のサーバノード)、サーバノードハッシュリング上に配置された
キーデータキャッシュの③ハッシュ値(また、分布範囲は[0、2 32リングハッシュに-1])サーバーのデータが置かれるべきであるキャッシュ・サーバ・ノード、最寄りのハッシュキー値から時計回りを探します。

ハッシュ一貫概略図.PNG

図では、円は正方形で、ノードサーバの開始を示すキーデータキャッシュの開始を表し、矢印付き点線はデータキャッシュがどのサーバに置かなければならない示します。図から分かるように、新しいサーバーの後、ショートおよびNode2ノード4(時計回り)データ間の唯一の影響を受けるキャッシュデータ配信。

しかしながら、上述した問題のアルゴリズムがある:ノード4のみノード3、元のノード1とノード2は、つまり、影響を受けていない拡張、サーバごとに異なる負荷後、テーブル内のキャッシュデータの平衡分布に到達しなかった影響新しいノードを追加しますサーバー上の効果。

上記溶液の負荷の不均衡の問題が仮想層の使用である:仮想各物理サーバの仮想キャッシュサーバ、リング上に配置された仮想ハッシュのキャッシュサーバハッシュ値の組として、仮想サーバハッシュ最初のキー値によってキャッシュデータを見つけます。ノード、およびそれに対応する物理サーバ、仮想サーバのノードを見つけます。
仮想ノードを使用した後、以下の:(ソース内のサーバーノードのキャッシュデータ分布図:シンプルコンシステント・ハッシュ法のマジックで

一貫性のハッシュアルゴリズムは、仮想ノードの概略.PNGを使用しています

リングに加えしたがって、新しい物理サーバーノードを追加する場合、仮想ノード(数をnと仮定される)の集合であり、これらのダミーは影響を受けN仮想ノードN仮想ノードに影響を与え、別の物理サーバに対応しますそして最後に、新しいサーバーを追加すると、負荷分散の目的を達成するために、すべてのクラスタサーバの負荷の元の部品を共有することになります。(各物理ノードに対応する複数の仮想ノード、物理ノード間の負荷よりバランスのとれた、あまりにも多くのパフォーマンスに影響を与えることができる。実際には、150の経験値)。


一貫性ハッシュアルゴリズム

public class ConsistentHash<T> { /** * 哈希函数 */ private final HashFunction hashFunction; /** * 每台物理服务器节点虚拟出虚拟节点个数 */ private final int numberOfReplicas; /** * Hash环 * <p> * 该Map中仅存放虚拟服务器节点,并不存放实际的缓存数据!!! * 该Map中key为虚拟服务器节点对应在环中的位置 * <p> * 使用TreeMap的原因: * TreeMap的内部使用红黑树(平衡查找树), * 因而在确定了一个缓存数据key的hash值在该环中的位置后, * 可以很快查找到该缓存数据应该放置的物理服务器 */ private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>(); /** * 构造器 * * @param hashFunction 哈希函数 * @param numberOfReplicas 每台物理服务器节点虚拟出虚拟节点个数 * @param nodes 物理服务器节点 */ public ConsistentHash(HashFunction hashFunction, int numberOfReplicas, Collection<T> nodes) { this.hashFunction = hashFunction; this.numberOfReplicas = numberOfReplicas; //将物理服务器放在环上 for (T node : nodes) { add(node); } } /** * 添加物理服务器节点 * <p> * 实现:将该物理服务器节点放在环中的numberOfReplicas个位置处, * (添加一个物理服务器节点,就要添加numberOfReplicas个虚拟节点) * * @param node 要添加的物理服务器节点 */ public void add(T node) { for (int i = 0; i < numberOfReplicas; i++) { circle.put(hashFunction.hash(node.toString() + i), node); } } /** * 移除物理服务器节点 * <p> * 实现:因为该物理服务器节点放在了环中的多个位置,所以在删除时都要删除 * (移除一个物理服务器节点,就要将该服务器节点对应的numberOfReplicas个虚拟节点移除) * * @param node 要移除的物理服务器节点 */ public void remove(T node) { for (int i = 0; i < numberOfReplicas; i++) { circle.remove(hashFunction.hash(node.toString() + i)); } } /** * 根据缓存数据的key获取物理服务器节点 * * @param key 缓存数据的key * @return 该缓存数据所在的物理服务器节点 */ public T get(Object key) { if (circle.isEmpty()) { return null; } int hash = hashFunction.hash(key); //如果缓存数据的key的哈希值没有落在虚拟服务器节点上, //则 if (!circle.containsKey(hash)) { //获取map中key值大于该缓存数据的key的哈希值的子map SortedMap<Integer, T> tailMap = circle.tailMap(hash); //如果该子map不为空,则返回该子map的第一个元素(因为该map是排序好的,第一个即是最小的元素) //如果该子map为空,说明该缓存数据的key的哈希值超出了哈希环中最后的那个虚拟服务器节点对应的位置(顺时针), // 则将该缓存数据放在哈希环中第一个虚拟服务器节点中(顺时针) hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); } return circle.get(hash); } } class HashFunction { int hash(Object key) { return key.hashCode(); } } 

上記のコードでは、ハッシュアルゴリズムは、ハッシュアルゴリズムが重要であるため、オブジェクトのハッシュコードの大部分は()メソッドは、得られたハッシュ値のバランスのとれた分布ではなく、向上させることができ、例えば、より頻繁に一定の範囲内で、これらのハッシュ値であります小さな整数。

人気のハッシュアルゴリズムはMD5、SHA-1およびSHA-2が、MD5の衝突が多く、そのため、MD5は、ハッシュアルゴリズムプログラムのアプリケーションとして数年前に推奨されていない、それを交換しているが含ま安全をハッシュアルゴリズム

// TODOハッシュアルゴリズムの分類

それでは、どのように整合性ハッシュは、それを使うのか?一般的に、唯一の経験の一貫性のハッシュアルゴリズムは、かなりの書き込みしようとしているよりも、誰か他の人のライブラリに依存しています。例えば、支持分散キャッシュコンポーネントのクライアントのほとんどは、一貫性のあるハッシュをサポートしています。それだけで、クライアントが何もしない、キャッシュデータに加えて、一貫性のあるハッシュアルゴリズム、キャッシュサーバを実現するために必要であることは注目に値します。


参照

①「大規模なWebサイトの技術フレームワーク-コア・プリンシプルとケーススタディ」:(テキスト記述部)
一貫したハッシュ :(コードコンセンサスアルゴリズム)
ハッシュアルゴリズムが要約されている
シンプルコンシステント・ハッシュ法のマジックで



著者:maxwellyue
リンクします。https://www.jianshu.com/p/05ad6637e66b
出典:ジェーン・ブック
著者によって予約ジェーンブックの著作権、いかなる形で再現され、承認を得るために、作者に連絡して、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/xiaoshen666/p/11258597.html