Friday, May 22, 2009

Повышение надежности системы

Повышение надежности предыдущей схемы (используя nginx).

В предыдущей схему существует один потенциально ненадежный элемент backend сервер. При его сбое система через некоторое время утрачивает возможность отрабатывать запросы, так как время кэширования на memcahed заканчивается и все запросы начинают идти на этот сервер. В результате система не может выдать никакого контента пока он не будет перезапущен. Чтобы этого избежать можно дать возможность frontend возвращать данные с просроченным сроком давности, реализовать это на уровне memcached усложняет способ работы с ним:
  • по умолчанию, если закончилось время хранения контент удаляется;
  • и при смене поведения усложняется алгоритм работы с ним из frontend.
В результате наиболее простым методом, если используется в качестве frontend nginx, можно разрешить ему при сбоях использовать собственный кэш (опция proxy_cache_use_stale). Пример:

proxy_cache_path /var/tmp/nginx/cache levels=1:2 keys_zone=one:10m inactive=20m max_size=500m;

server {
listen 80;

location / {
if ( $args = "" ){

set $memcached_key "$uri";
memcached_pass 127.0.0.1:11211;
error_page 404 502 503 504 = @backend;
add_header "Content-Type" "text/html; charset=UTF-8";
add_header "Cache-Control" "max-age=15";
}

proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_buffers 8 32k;

proxy_cache_key "$scheme://$host$uri$is_args$args:";
proxy_cache one;
proxy_cache_min_uses 1;
proxy_cache_valid 200 30s;
proxy_cache_use_stale error timeout http_500 http_502 http_503;

}

location @backend {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_buffers 8 32k;

proxy_cache_key "$scheme://$host$uri$is_args$args:";
proxy_cache one;
proxy_cache_min_uses 1;
proxy_cache_valid 200 30s;
proxy_cache_use_stale error timeout http_500 http_502 http_503;
}
...............
В данном случае frontend не обязательно слабое звено - его можно продублировать с меньшими затратами по сравнению с дублированием backend + slaveDB.

No comments: