<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"><<a href="mailto:myself@rojer.pp.ru">myself@rojer.pp.ru</a>></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 <<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a> <mailto:<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a>>> написал:<div>
<div class="h5"><br>
<br>
CRC32 от MD5, зачем-то сдвинутый на 16. не нравятся младшие биты?<br>
md5 вычислительно значительно дороже CRC32, может обойтись только<br>
CRC32?<br>
<br>
Andrey Zloy wrote:<br>
<br>
Написали небольшой конфиг, который позволяет nginx'у<br>
определять "правильный" memcached сервер.<br>
Логика определения сервера взята из модуля Cache::Memcached.<br>
Ключом для мемкеша служит md5 от url'а страницы.<br>
<br>
На продакшн конфиг пока не выкатывал. На тестовых серверах<br>
работает хорошо.<br>
<br>
Подскажите могут ли быть подводные камни?<br>
Может кто уже писал подобные решения<br>
<br>
http {<br>
perl_set $md5_uri 'sub {<br>
use Digest::MD5 qw(md5_base64);<br>
my $r = shift;<br>
my $uri=$r->uri;<br>
my $args=$r->args;<br>
if ($args){<br>
$uri=$uri."?".$args;<br>
}<br>
return md5_base64($uri);<br>
}';<br>
<br>
perl_set $memcached_index '<br>
sub {<br>
use String::CRC32;<br>
my $r = shift;<br>
return (((crc32($r->variable("md5_uri")) >> 16) &<br>
0x7fff) % 2); # 2 - кол-во серверов memcached<br>
}<br>
';<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>
<<a href="http://172.28.144.52:11211" target="_blank">http://172.28.144.52:11211</a>> <<a href="http://172.28.144.52:11211" target="_blank">http://172.28.144.52:11211</a>>; }<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>
<<a href="http://172.28.144.53:11211" target="_blank">http://172.28.144.53:11211</a>> <<a href="http://172.28.144.53:11211" target="_blank">http://172.28.144.53:11211</a>>; }<div class="im">
<br>
<br>
error_page 404 @fallback;<br>
}<br>
}<br>
}<br>
<br>
<br>
<br>
-- Deomid "rojer" Ryabkov<br></div>
<a href="mailto:myself@rojer.pp.ru" target="_blank">myself@rojer.pp.ru</a> <mailto:<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> <mailto:<a href="mailto:rojer@sysadmins.ru" target="_blank">rojer@sysadmins.ru</a>><br>
ICQ: 8025844<br>
<br>
<br>
</blockquote><div><div class="h5">
<br>
<br>
-- <br>
Deomid "rojer" 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>