Re: nginx и несколько memcached серверов
Andrey Zloy
andrey.zloy at gmail.com
Sun Oct 25 23:44:28 MSK 2009
Поймите, менять алгоритм вычисления сервера нельзя. Сдвиг битов и наложение
маски с последующим взятием остатка деления делает модуль, который пишет в
memcached. Т.е. мне нужно полностью повторить его действия, чтобы знать
откуда брать данные. Cache::Memcached пишет, nginx - читает. Алгоритм должен
быть одинаков с обоих сторон.
Больше волнуют побочные действия всего этого творчества. Не завалится ли
nginx дергая модуль String::CRC32 для каждого урла и вычиляя эту нехитрую
формулу. Perl в nginx до сих пор в эксперементальном виде потому и
волнительно.
25 октября 2009 г. 23:05 пользователь Deomid Ryabkov
<myself at rojer.pp.ru>написал:
> Andrey Zloy wrote:
>
>> Сдвиг на 16 бит потому что это алгоритм из Cache::Memcached. думаю что они
>> сдвигают биты для получения меньшего числа. Ведь нет смысла делить огромное
>> число, если нужен лишь остаток от деления.
>>
> наоборот, если цель - получить осттаок от деления, то нет смысла сдвигать.
> и уж тем более нет смысла накладывать маску 0x7fff.
> сдвигать есть смысл только в том случае, если в нижних битах по какой-то
> причине недостаточно энтропии.
> может, конечно, я чего-то не понимаю, пусто тогда другие участники меня
> поправят. в чём сермяжная правда использования верхних 16 бит, а не нижних?
> мой вариант: (CRC32(uri) ^ CRC32(args)) % num_servers, без предварительной
> конкатенации - xor двух crc32 ничем не хуже, чем CRC32 от конкатенации.
>
> На счет замены md5 на crc32 согласен, надо переделать. Нет смысла получать
>> такой сложный хэш, когда цель всего лишь сжать url.
>>
>> 25 октября 2009 г. 20:02 пользователь Deomid Ryabkov <myself at rojer.pp.ru<mailto:
>> myself at rojer.pp.ru>> написал:
>>
>>
>> CRC32 от MD5, зачем-то сдвинутый на 16. не нравятся младшие биты?
>> md5 вычислительно значительно дороже CRC32, может обойтись только
>> CRC32?
>>
>> Andrey Zloy wrote:
>>
>> Написали небольшой конфиг, который позволяет nginx'у
>> определять "правильный" memcached сервер.
>> Логика определения сервера взята из модуля Cache::Memcached.
>> Ключом для мемкеша служит md5 от url'а страницы.
>>
>> На продакшн конфиг пока не выкатывал. На тестовых серверах
>> работает хорошо.
>>
>> Подскажите могут ли быть подводные камни?
>> Может кто уже писал подобные решения
>>
>> http {
>> perl_set $md5_uri 'sub {
>> use Digest::MD5 qw(md5_base64);
>> my $r = shift;
>> my $uri=$r->uri;
>> my $args=$r->args;
>> if ($args){
>> $uri=$uri."?".$args;
>> }
>> return md5_base64($uri);
>> }';
>>
>> perl_set $memcached_index '
>> sub {
>> use String::CRC32;
>> my $r = shift;
>> return (((crc32($r->variable("md5_uri")) >> 16) &
>> 0x7fff) % 2); # 2 - кол-во серверов memcached
>> }
>> ';
>>
>> server {
>> listen 3666;
>> server_name 172.28.144.68;
>>
>> location / {
>> set $memcached_key $md5_uri;
>> if ($memcached_index = 0){
>> memcached_pass 172.28.144.52:11211
>> <http://172.28.144.52:11211> <http://172.28.144.52:11211>;
>> }
>>
>> if ($memcached_index = 1){
>> memcached_pass 172.28.144.53:11211
>> <http://172.28.144.53:11211> <http://172.28.144.53:11211>;
>> }
>>
>>
>> error_page 404 @fallback;
>> }
>> }
>> }
>>
>>
>>
>> -- Deomid "rojer" Ryabkov
>> myself at rojer.pp.ru <mailto:myself at rojer.pp.ru>
>> rojer at sysadmins.ru <mailto:rojer at sysadmins.ru>
>> ICQ: 8025844
>>
>>
>>
>
> --
> Deomid "rojer" Ryabkov
> myself at rojer.pp.ru
> rojer at sysadmins.ru
> ICQ: 8025844
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20091025/3a43a525/attachment.html>
More information about the nginx-ru
mailing list