우리는 데이터베이스 테이블 또는 하위 하위 라이브러리 캐시를 배포하고있는 경우, 필연적으로 문제가 발생합니다 :
데이터가 균등하게 각 노드에 분산, 최소를 만들려고하는 방법을 때 빼기 노드 데이터에 영향을 미쳤다.
해시 모듈
무작위로 많은 문제를 가져올 것, 말을하지 두었다. 일반적으로 가장 쉬운 해결책은 생각하는 것입니다 hash 取模
의.
키에 따라 전달 될 수 index = hash(key) % N
스토리지 노드를 계산이 필요. 해시 함수는 해시 매핑 방식에 캐릭터는 양의 정수이고, N은 노드의 개수이다.
이러한 충족하기 위해 데이터의 균일 한 분포하지만, 내결함성 및 확장 성 알고리즘은 가난하다.
추가하거나 노드를 제거 할 때 예를 들어, 모든 키가 너무 분명도 좋은 내결함성 및 확장 성이 있어야 분포를 만날 수있는 알고리즘을 필요로하는 높은 비용을 계산해야합니다.
일관된 해시 알고리즘
해쉬 알고리즘은 모든 해시 값과 일치의 범위에서, 환을 구성한다 0 ~ 2^32-1
. 도는 다음과 같습니다 :
같은 IP 노드의 키와 같은이 반지가있을 수 있습니다 해시, 고유성 필드 호스트 이름으로 각 노드 후 hash(key)
, 해시 후 다음
상기 데이터 요구가이를 이용하여 대응 노드에 위치하도록 한 후 hash 函数
키 링에 매핑 될 것이다.
따라서, 시계 방향에 따라 K1에 배치 될 수있다 N1节点
, K2 타겟팅 N3节点
, K3 타겟 N2节点
.
결함 허용
그런 다음 N1가 다운 가정 :
여전히 시계 방향 (K2)에있어서, K3와 동일한 만 N3에 다시 매핑 K1 남아있다. 그것은 단지 데이터 Shaoshao 섹션에 영향을 미칠 것입니다 아래 노드가가는 때, 좋은 내결함성을 보장합니다.
확장 성
때 새로운 노드는 :
N2 및 N3는 노드 N4 사이에 추가 한 후 데이터는이 또한 좋은 확장 성을 보장하므로 만 K3, 나머지 데이터가 변경되지 않은 것이 발견 인상한다.
가상 노드
지금까지이 알고리즘은 약간의 문제는 여전히 :
当节点较少时会出现数据分布不均匀的情况:
这样会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。
为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点:
计算时可以在 IP 后加上编号来生成哈希值。
这样只需要在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。
号外
最近在总结一些 Java 相关的知识点,感兴趣的朋友可以一起维护。