일관된 해싱은 분산 시스템에 사용되는 데이터 할당 알고리즘이며 종종로드 밸런싱, 캐싱 및 기타 시나리오에 사용됩니다. 가상 해시 링에 노드를 매핑하여 동적 확장 및 수축시 서버 노드의 영향을 최소화합니다.
일관된 해싱 알고리즘의 핵심 아이디어는 해시 함수를 통해 모든 참여 노드를 링 공간에 매핑하는 것입니다. 또한 동일한 해시 함수를 사용하여 데이터 항목 도이 공간에 매핑됩니다. 데이터는 시계 방향으로 첫 번째 노드에 할당됩니다.
일관된 해시에서 해시 함수는 노드를 해시 값, 일반적으로 32 비트 또는 64 비트 정수로 매핑하는 데 사용됩니다. CRC32, MD5, SHA1 등과 같은 일반적인 기능
각 물리적 서버 노드는 여러 가상 노드에 해당하여보다 균형 잡힌 부하 할당을 달성 할 수 있습니다. 가상 노드는 실제 노드의 고르지 않은 분포 문제를 완화하고 전반적인 분포 균일 성을 향상시킬 수 있습니다.
데이터를 저장 해야하는 경우 해시 값은 키 값에 따라 계산 된 다음 해시 값과 같은 링의 첫 번째 노드가 발견됩니다. 찾을 수없는 경우 첫 번째 노드에 다시지도를 맵핑하십시오. 이 방법은 노드 수의 변경으로 인한 대규모 데이터 마이그레이션을 피할 수 있습니다.
다음은 PHP로 작성된 일관된 해시 구현의 예입니다. 추가, 노드 삭제 및 데이터에 해당하는 노드를 얻는 방법을 보여주는 방법은 다음과 같습니다.
class ConsistentHash
{
private $nodes = array();
private $position = array();
public function addNode($node)
{
$this->nodes[$node] = true;
$this->updatePosition();
}
public function removeNode($node)
{
unset($this->nodes[$node]);
$this->updatePosition();
}
public function getNode($key)
{
if (empty($this->nodes)) {
return null;
}
$pos = $this->hash($key);
foreach ($this->position as $node => $position) {
if ($pos <= $position) {
return $node;
}
}
return reset($this->position);
}
private function updatePosition()
{
$positions = array();
foreach ($this->nodes as $node => $value) {
for ($i = 0; $i < 3; $i++) {
$positions[$node . '_' . $i] = $this->hash($node . '_' . $i);
}
}
asort($positions);
$this->position = $positions;
}
private function hash($str)
{
return crc32($str);
}
}
// 사용의 예
$hash = new ConsistentHash();
$hash->addNode('Server1');
$hash->addNode('Server2');
$hash->addNode('Server3');
$server = $hash->getNode('data123');
echo $server; // 출력이있을 수 있습니다 Server1
위의 코드는 간단한 일관된 해시 클래스를 구축하여 노드 추가, 노드 제거 및 키를 기반으로 할당 된 노드를 얻는 기능을 제공합니다. 가상 노드 메커니즘을 도입함으로써 균형 잡힌 부하 할당이 효과적으로 달성됩니다.
일관된 해싱은 효율적이고 안정적인 분산로드 밸런싱 솔루션이며, 특히 노드가 자주 변경되는 시스템 시나리오에 적합합니다. 이 기사는 개발자가 이론적 설명 및 PHP 구현 예를 통해 일관된 해싱의 기본 사용을 마스터하는 데 도움이됩니다. 대규모 분산 시스템을 설계 할 때 일관된 해싱 알고리즘을 이해하고 적용하면 시스템의 확장 성과 안정성을 크게 향상시킬 수 있습니다.