<div>Поймите, менять алгоритм вычисления сервера нельзя. Сдвиг битов и наложение маски с последующим взятием остатка деления делает модуль, который пишет в memcached. Т.е. мне нужно полностью повторить его действия, чтобы знать откуда брать данные. Cache::Memcached пишет, nginx - читает. Алгоритм должен быть одинаков с обоих сторон.<br>
</div><div><br></div><div>Больше волнуют побочные действия всего этого творчества. Не завалится ли nginx дергая модуль String::CRC32 для каждого урла и вычиляя эту нехитрую формулу. Perl в nginx до сих пор в эксперементальном виде потому и волнительно.</div>
<br><div class="gmail_quote">25 октября 2009 г. 23:05 пользователь Deomid Ryabkov <span dir="ltr">&lt;<a href="mailto:myself@rojer.pp.ru">myself@rojer.pp.ru</a>&gt;</span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">Andrey Zloy wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Сдвиг на 16 бит потому что это алгоритм из Cache::Memcached. думаю что они сдвигают биты для получения меньшего числа. Ведь нет смысла делить огромное число, если нужен лишь остаток от деления.<br>
</blockquote></div>
наоборот, если цель - получить осттаок от деления, то нет смысла сдвигать. и уж тем более нет смысла накладывать маску 0x7fff.<br>
сдвигать есть смысл только в том случае, если в нижних битах по какой-то причине недостаточно энтропии.<br>
может, конечно, я чего-то не понимаю, пусто тогда другие участники меня поправят. в чём сермяжная правда использования верхних 16 бит, а не нижних?<br>
мой вариант: (CRC32(uri) ^ CRC32(args)) % num_servers, без предварительной конкатенации - xor двух crc32 ничем не хуже, чем CRC32 от конкатенации.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
На счет замены md5 на crc32 согласен, надо переделать. Нет смысла получать такой сложный хэш, когда цель всего лишь сжать url.<br>
<br></div>
25 октября 2009 г. 20:02 пользователь Deomid Ryabkov &lt;<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a> &lt;mailto:<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a>&gt;&gt; написал:<div>
<div class="h5"><br>
<br>
    CRC32 от MD5, зачем-то сдвинутый на 16. не нравятся младшие биты?<br>
    md5 вычислительно значительно дороже CRC32, может обойтись только<br>
    CRC32?<br>
<br>
    Andrey Zloy wrote:<br>
<br>
        Написали небольшой конфиг, который позволяет nginx&#39;у<br>
        определять &quot;правильный&quot; memcached сервер.<br>
        Логика определения сервера взята из модуля Cache::Memcached.<br>
        Ключом для мемкеша служит md5 от url&#39;а страницы.<br>
<br>
        На продакшн конфиг пока не выкатывал. На тестовых серверах<br>
        работает хорошо.<br>
<br>
        Подскажите могут ли быть подводные камни?<br>
        Может кто уже писал подобные решения<br>
<br>
        http {<br>
              perl_set $md5_uri &#39;sub {<br>
            use Digest::MD5 qw(md5_base64);<br>
            my $r = shift;<br>
            my $uri=$r-&gt;uri;<br>
            my $args=$r-&gt;args;<br>
            if ($args){<br>
              $uri=$uri.&quot;?&quot;.$args;<br>
            }<br>
             return md5_base64($uri);<br>
           }&#39;;<br>
<br>
            perl_set $memcached_index &#39;<br>
            sub {<br>
              use String::CRC32;<br>
              my $r = shift;<br>
              return (((crc32($r-&gt;variable(&quot;md5_uri&quot;)) &gt;&gt; 16) &amp;<br>
        0x7fff) % 2); # 2 - кол-во серверов memcached<br>
           }<br>
          &#39;;<br>
<br>
          server {<br>
            listen 3666;<br>
            server_name 172.28.144.68;<br>
<br>
            location / {<br>
             set $memcached_key $md5_uri;<br>
             if ($memcached_index = 0){<br>
                memcached_pass <a href="http://172.28.144.52:11211" target="_blank">172.28.144.52:11211</a><br></div></div>
        &lt;<a href="http://172.28.144.52:11211" target="_blank">http://172.28.144.52:11211</a>&gt; &lt;<a href="http://172.28.144.52:11211" target="_blank">http://172.28.144.52:11211</a>&gt;;               }<div class="im">
<br>
             if ($memcached_index = 1){<br>
                memcached_pass <a href="http://172.28.144.53:11211" target="_blank">172.28.144.53:11211</a><br></div>
        &lt;<a href="http://172.28.144.53:11211" target="_blank">http://172.28.144.53:11211</a>&gt; &lt;<a href="http://172.28.144.53:11211" target="_blank">http://172.28.144.53:11211</a>&gt;;               }<div class="im">
<br>
<br>
             error_page 404 @fallback;<br>
           }<br>
         }<br>
        }<br>
<br>
<br>
<br>
    --     Deomid &quot;rojer&quot; Ryabkov<br></div>
    <a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a> &lt;mailto:<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a>&gt;<br>
    <a href="mailto:rojer@sysadmins.ru" target="_blank">rojer@sysadmins.ru</a> &lt;mailto:<a href="mailto:rojer@sysadmins.ru" target="_blank">rojer@sysadmins.ru</a>&gt;<br>
    ICQ: 8025844<br>
<br>
<br>
</blockquote><div><div class="h5">
<br>
<br>
-- <br>
Deomid &quot;rojer&quot; Ryabkov<br>
<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a><br>
<a href="mailto:rojer@sysadmins.ru" target="_blank">rojer@sysadmins.ru</a><br>
ICQ: 8025844<br>
<br>
</div></div></blockquote></div><br>