Varnish – wiele przestrzeni do przechowywania danych
Napisał: Patryk Krawaczyński
17/11/2012 w Administracja Brak komentarzy. (artykuł nr 380, ilość słów: 386)
Z
ałóżmy, że posiadamy serwer cache, na którym jest uruchomiony serwer varnish, ale niestety jest on wyposażony w małą ilość pamięci RAM, w której nie zmieszczą się wszystkie statyczne obiekty (obrazki, pliki js, css) dla tylu domen dla ilu jest aktualnie prowadzony ruch sieciowy. Jednak serwer wyposażony jest dodatkowo w dysk SSD, który można wykorzystać jako dodatkowy storage dla cache serwera varnish.
Pierwszym krokiem jest zdefiniowanie lokalizacji naszych przestrzeni do przechowywania danych. Pierwszą będzie pamięć RAM (domyślna pamięć dla wszystkich obiektów) oraz drugą – dysk SSD /dev/sda
podmontowany pod katalogiem /data
– przeznaczony dla wszystkich plików .css
i .js
oraz żądań pochodzących z domeny xxxooo.pl. Dla systemu CentOS będzie to /etc/sysconfig/varnish
:
# Cache file location VARNISH_STORAGE_FILE=/data/varnish_storage.bin # Cache file size VARNISH_STORAGE_SIZE=1G # Backend storage specification VARNISH_STORAGE0="storage0=malloc,${VARNISH_STORAGE_SIZE}" VARNISH_STORAGE1="storage1=file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
Następnie przekazujemy definicję storage do opcji startowych daemona varnishd:
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE0} \ -s ${VARNISH_STORAGE1}"
Oraz definiujemy przestrzenie do przechowywania danych zgodnie z naszymi założeniami:
sub vcl_fetch { set beresp.storage = "storage0"; if (req.http.host ~ "xxxooo.pl") { set beresp.storage = "storage1"; } if (req.url ~ "\.(css|js)$") { set beresp.storage = "storage1"; } }
Jeśli z czasem dołożymy trochę pamięci RAM do naszego serwera, możemy pokusić się o powrót przetrzymywania wszystkich obiektów statycznych strony WWW w pamięci, ale pod warunkiem, że jest na to wolne miejsce:
if (req.url ~ "\.(css|js)$") { if (storage.storage0.free_space > 128MB) { set beresp.storage = "storage0"; } else { set beresp.storage = "storage1"; } }
Więcej informacji: Varnish Documentation