Рубрики
Uncategorized

Введение в хэш согласованности Php Memcache

Автор оригинала: David Wong.

Хэш согласованности-это пошаговое простое понимание: серверный узел и ключевой узел развертываются в соответствии с функцией Crc32. Просто отсортируйте кольца. Например, четыре сервера, идеально распределенные в 12 369 часов в четырех местах. Затем, в соответствии со значением crc32 ключа, найдите ближайший серверный узел и вставьте его. Я надеюсь, что ваши предшественники дадут нам несколько советов.

php
    // Converting a string to an integer function
    interface hash{
        public function _hash($str);
    }

    // Distribution to a server
    interface dispatch {
        Public function lookup ($key);// Find a key
    }

class Consitent implements hash,dispatch{

    // All server nodes
    protected $nodes=array();

    public function _hash($str){
        Return sprintf ('% u', CRC32 ($str)); // keep positive
    }

    // Find which server node the key is on
    public function lookup($key){
        $point=$this->_hash($key);
        $node = current ($this - > nodes); // defaults to the first server node

        // By judging the hash value of the stored key and comparing it with the key of the stored server node, the value value of the corresponding server is returned.
        foreach ($this->nodes as $key => $value) {
            if($point<=$key){
                $node=$value;
                break;
            }
        }
        return $node;
    }

    // Add server nodes
    public function addNode($node){
        $node_key=sprintf('%u',crc32($node));
        $this - > nodes [$node_key]= $node; // sorted by key nodes
        $this->sortNode();
    }

    public function printNodes(){
        Var_dump($this - > nodes);//Print a list of all server nodes
    }

    // Sort the installation order of all servers to facilitate storage and search
    public function sortNode(){
        ksort($this->nodes,SORT_REGULAR);
    }
}

$c=new Consitent();
$c->addNode('a');
$c->addNode('b');
$c->addNode('c');
$c->printNodes();
echo $c->_hash('name');
echo $c->lookup('name');

Недостаток: Неравномерное разделение серверных узлов (только последовательно), особенно когда первый сервер хранится по умолчанию. Необходимо ввести виртуальный узел и N раз использовать метод текущего узла, чтобы после переупорядочения текущий узел отмирал и мог быть выделен для уменьшения давления на следующий узел. Обратитесь конкретно к хэш-классу согласованности PHP, написанному GitHub Niu Ren