Pamięć podręczna Nginx współdzielona między wieloma serwerami

9

Mamy 8 serwerów interfejsu API REST z Nginx korzystających z FastCGI z PHP-FPM do obsługi żądań. Obecnie używamy buforowania FastCGI Nginx (takie jak dyrektywy fastcgi_cache_path). Oznacza to, że odpowiedzi API są buforowane, ale dla każdego serwera istnieje osobna pamięć podręczna.

Czy istnieje dobry sposób na udostępnianie pamięci podręcznej wszystkim ośmiu serwerom?

Zastanawialiśmy się nad wykorzystaniem Redis jako pamięci współdzielonej, ale dostępne moduły wydają się wymagać zmian aplikacji. W niektórych przypadkach możemy chcieć buforować odpowiedzi poza naszą kontrolą (przez HTTP do zewnętrznych interfejsów API). Idealnie byłoby dostępne zastępcze zastępowanie wbudowanego buforowania Nginx dla odpowiedzi FastCGI i HTTP.

Ćwiek
źródło
Dlaczego nie robisz buforowania nie na warstwie frontendowej (Nginx), ale na warstwie backendowej (aplikacja PHP)?
Max Kochubey,
@ Hangover Nie widzę powodu, by ponownie wynaleźć koło. Pamięć podręczna Nginx działa dobrze i szybko. Jeśli w ogóle unikniemy narzutu związanego z uruchamianiem żądań za pośrednictwem aplikacji, możemy zachować ładność i szybkość. Nginx odpowiada na buforowane żądania w ciągu mniej niż 5 milisekund. Uruchomienie naszej aplikacji PHP, nawet w celu zapewnienia buforowanej odpowiedzi, będzie prawdopodobnie 10 razy wolniejsze. Buforowanie Nginx działa teraz dla nas dobrze, musimy tylko rozdzielić tę pamięć podręczną na wiele serwerów.
Brad
1
ok, niż można spróbować użyć zewnętrznego modułu Nginx SRCache do przechowywania treści w pamięci podręcznej w dedykowanym Memcached od Redis.
Max Kochubey,
1
@Brad Jest to hacking, więc nie dam odpowiedzi: obecnie mamy skrypt uruchamiany co noc, który używa rsync między katalogami pamięci podręcznej nginx na naszych serwerach, aby na bieżąco aktualizować najnowsze pliki pamięci podręcznej wszystkich innych. Skrypt kończy się wdzięcznym restartem nginx i sprawdzeniem sukcesu. Jak powiedziałem, jest to hacking, ale działa na nas w systemie o wysokiej przepustowości.
mVChr
@mVChr Ciekawe. Czy próbowałeś ciągle uruchamiać rsync lub podobny? W końcu do mojego użytku w końcu uruchomiłem Redis, ale to nie pozwala na bardzo dużą pamięć podręczną, ponieważ cała kolekcja Redis musi być w pamięci. 16 GB szybko zapełnia się w mojej aplikacji.
Brad

Odpowiedzi:

1

Wydaje się, że na stronie https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ znajduje się raczej nowy post na blogu . Ten pierwszy przykład może być przydatny, jeśli korzystasz z więcej niż dwóch serwerów pamięci podręcznej nginx.

Szczególnie druga część postu wydaje się interesująca dla mojego obecnego przypadku użycia, w którym chcę automatycznie ponownie indeksować zmienione elementy do moich pamięci podręcznych.

Powinien także współpracować z wersją open source NGINX. Zasadniczo działa poprzez proxy żądania kaskadowo przez każdy serwer NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server), każdy serwer buforuje z odpowiedniego serwera nadrzędnego, a jeśli jest to możliwe, możliwe jest również utworzenie klastra HA. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

Macbert
źródło