私たちは、データベーステーブルまたはサブサブライブラリーを行っているときにキャッシュを配布され、必然的に問題が発生します。
どのようにデータが均等に各ノードに分散し、そして時に減算ノードデータ最小値が影響を受けるようにしようさ。
ハッシュ・モジュロ
ランダムに配置された問題の多くをもたらすだろう、と言うではありません。通常、最も簡単な解決策は考えることですhash 取模
の。
キーに従って渡されるindex = hash(key) % N
ストレージノードを計算するために、この必要性。ハッシュ関数は、ハッシュマッピング方法に文字列が正の整数であり、Nはノードの数です。
そのような満たすために、データの均一な分布が、フォールトトレランスとスケーラビリティアルゴリズムが劣ります。
ノードを追加または削除する場合たとえば、すべてのキーはとても明らか分布を満たすためのアルゴリズムを必要と高いコストが、また、良好な耐障害性と拡張性を持っている必要があり、再計算する必要があります。
一貫性のハッシュアルゴリズム
ハッシュアルゴリズムは、すべてのハッシュ値と一致して、その範囲内に、環を構成します0 ~ 2^32-1
。図は次のとおりです。
ハッシュへの各ノードの後、このリングは、このようなIPノードのキーとして、一意のフィールドのホスト名かもしれhash(key)
ハッシュた後、次の、:
データニーズが同じものを使用して、対応するノード上に位置するようにした後、hash 函数
キーリングにマッピングされます。
これにより、時計回りの方向に応じてK1に配置することができN1节点
、K2標的N3节点
、K3ターゲットN2节点
。
フォールトトレランス
そして、N1がダウンしていることを前提としています。
依然としてN3に再マッピングされるだけK1、時計回りの方向に応じて、K2、及び同じままK3。これは、データだけShaoshaoセクションに影響しますダウンノードが行くとき、優れた耐障害性を保証します。
スケーラビリティ
ときに新しいノード:
これはまた、良好なスケーラビリティを確保してN2とN3との間のノードN4を追加し、そのデータは、唯一のK3は、残りのデータが変更されていないという印象の下にあります。
仮想ノード
これまでのところ、このアルゴリズムは、まだ少し問題です。
当节点较少时会出现数据分布不均匀的情况:
这样会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。
为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点:
计算时可以在 IP 后加上编号来生成哈希值。
这样只需要在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。
号外
最近在总结一些 Java 相关的知识点,感兴趣的朋友可以一起维护。