現在の位置: ホーム> 最新記事一覧> PHPは一貫したハッシュを実装します:分散荷重バランスのためのベストプラクティス

PHPは一貫したハッシュを実装します:分散荷重バランスのためのベストプラクティス

gitbox 2025-08-07

一貫したハッシュアルゴリズムとは何ですか

一貫したハッシュは、分散システムで使用されるデータ割り当てアルゴリズムであり、ロードバランス、キャッシュ、その他のシナリオでよく使用されます。仮想ハッシュリングにノードをマッピングすることにより、動的拡張と縮小時のサーバーノードの影響を最小限に抑えます。

一貫性ハッシュの基本原則

一貫したハッシュアルゴリズムの中心的なアイデアは、すべての参加ノードをハッシュ関数を介してリング空間にマッピングすることであり、データ項目は同じハッシュ関数を使用してこの空間にマッピングされます。データは、時計回りの方向に最初のノードに割り当てられます。

ハッシュ関数

一貫したハッシュでは、ハッシュ関数を使用して、ノードをハッシュ値、通常は32ビットまたは64ビット整数にマッピングします。 CRC32、MD5、SHA1などの一般的な機能。

ノードと仮想ノード

各物理サーバーノードは、複数の仮想ノードに対応して、よりバランスの取れた負荷割り当てを実現できます。仮想ノードは、実際のノードの不均一な分布の問題を軽減し、全体的な分布の均一性を改善できます。

データマッピングメカニズム

データを保存する必要がある場合、ハッシュ値はそのキー値に基づいて計算され、その後、そのハッシュ値以上のリングの最初のノードが見つかります。見つからない場合は、最初のノードに戻ります。この方法では、ノードの数の変化によって引き起こされる大規模なデータ移行を回避できます。

PHPを使用した一貫したハッシュ

以下は、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実装の例を通じて一貫したハッシュの基本的な使用法を習得するのに役立ちます。大規模な分散システムを設計する場合、一貫したハッシュアルゴリズムを理解して適用すると、システムのスケーラビリティと安定性が大幅に向上する可能性があります。