一貫したハッシュは、分散システムで使用されるデータ割り当てアルゴリズムであり、ロードバランス、キャッシュ、その他のシナリオでよく使用されます。仮想ハッシュリングにノードをマッピングすることにより、動的拡張と縮小時のサーバーノードの影響を最小限に抑えます。
一貫したハッシュアルゴリズムの中心的なアイデアは、すべての参加ノードをハッシュ関数を介してリング空間にマッピングすることであり、データ項目は同じハッシュ関数を使用してこの空間にマッピングされます。データは、時計回りの方向に最初のノードに割り当てられます。
一貫したハッシュでは、ハッシュ関数を使用して、ノードをハッシュ値、通常は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実装の例を通じて一貫したハッシュの基本的な使用法を習得するのに役立ちます。大規模な分散システムを設計する場合、一貫したハッシュアルゴリズムを理解して適用すると、システムのスケーラビリティと安定性が大幅に向上する可能性があります。