Функция для разделения / распределения (последовательное хеширование)? - PullRequest
2 голосов
/ 30 июля 2010

Я немного подумал о создании несколько облегченной PHP-функции с согласованным хешированием для разделения загруженных файлов между различными серверами.

Очевидно, что rand () будет работать для равномерного распределения файлов между серверами, но при запросе файлов никто не будет знать, какой файл находится на каком сервере ...

Я знаю, что есть несколько обширных библиотек для создания согласованного хэширования, но мне интересно, как это работает и как я могу развернуть свою собственную, очень легкую?

Примечание: я не принимаю во внимание, что серверы будут удалены, но вместо этого в пул будут добавлены другие серверы.

Обновление:

Вот небольшая строка псевдокода:

$config['shards'] = array('192.168.1.1, 192.168.1.2');

function shard ($filename) {

    $servers = $config['shards'];

    // do lookup in some magic way to decide which server to return.

    return $appropriateserver;
}


echo shard('filename.jpg'); // returns the appropriate server to distribute the file.

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Ну, единственное, что вы могли бы сделать, это использовать crc32 ...

$crc = crc32($mykey);
$serverNo = $crc % count($servers);

Он должен быть достаточно последовательным (то есть равномерно сбалансированным) и воспроизводимым на 100% ...

1 голос
/ 07 сентября 2012

Я рекомендую использовать MurmurHash3 : он намного быстрее криптографических хеш-функций, но сохраняет подобную случайность .Скорость MurmurHash близка к CRC32 или даже лучше.Существует реализация PHP .

0 голосов
/ 28 марта 2012

окончательное решение будет:

CRC32 (ключ)% 4, когда у вас есть только 4 сервера

и когда вы хотите изменить баланс, вы можете использовать 2 различные хеш-функции во время миграции

например:

$server_hash1 = crc32($key) % 4
$result = $db->search($server_hash1, $key);

if ($result == false)
{
    $server_hash2 = crc32($key) % 8
    $result = $db->search($server_hash2, $key);
}
  • Вы должны сделать то же самое для вставки / обновления (с функцией перемещения из config1 в config2)
  • Вы можете сделать асинхронное перемещение (пакетным способом)
...