ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: nginx и несколько memcached серве ров



Поймите, менять алгоритм вычисления сервера нельзя. Сдвиг битов и наложение маски с последующим взятием остатка деления делает модуль, который пишет в memcached. Т.е. мне нужно полностью повторить его действия, чтобы знать откуда брать данные. Cache::Memcached пишет, nginx - читает. Алгоритм должен быть одинаков с обоих сторон.

Больше волнуют побочные действия всего этого творчества. Не завалится ли nginx дергая модуль String::CRC32 для каждого урла и вычиляя эту нехитрую формулу. Perl в nginx до сих пор в эксперементальном виде потому и волнительно.

25 октября 2009 г. 23:05 пользователь Deomid Ryabkov <myself@xxxxxxxxxxx> написал:
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@xxxxxxxxxxx <mailto:myself@xxxxxxxxxxx>> написал:


   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@xxxxxxxxxxx <mailto:myself@xxxxxxxxxxx>
   rojer@xxxxxxxxxxxx <mailto:rojer@xxxxxxxxxxxx>
   ICQ: 8025844




--
Deomid "rojer" Ryabkov
myself@xxxxxxxxxxx
rojer@xxxxxxxxxxxx
ICQ: 8025844




 




Copyright © Lexa Software, 1996-2009.