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