Cache Nginx condivisa tra più server


9

Abbiamo 8 server API REST-ish con Nginx che utilizzano FastCGI con PHP-FPM per gestire le richieste. Attualmente stiamo utilizzando la memorizzazione nella cache FastCGI di Nginx (direttive simili fastcgi_cache_path). Ciò significa che le risposte API sono memorizzate nella cache, ma esiste una cache separata per ciascun server.

C'è un buon modo per condividere la memoria cache tra tutti gli otto server?

Abbiamo considerato l'utilizzo di Redis come memoria condivisa, ma i moduli disponibili sembrano richiedere modifiche alle applicazioni. In alcuni casi, potremmo voler memorizzare nella cache le risposte al di fuori del nostro controllo (da HTTP ad API esterne). Idealmente, sarebbe disponibile una sostituzione drop-in per la memorizzazione nella cache integrata di Nginx delle risposte FastCGI e HTTP.


Perché non si esegue la memorizzazione nella cache non sul livello front-end (Nginx), ma sul livello back-end (applicazione PHP)?
Max Kochubey,

@hangover Non vedo alcun motivo per reinventare la ruota. La cache di Nginx funziona bene e velocemente. Se riusciamo a evitare il sovraccarico delle richieste in esecuzione attraverso l'applicazione, possiamo mantenere le cose belle e veloci. Nginx risponde alle richieste memorizzate nella cache per noi in meno di 5 millisecondi. Il lancio della nostra applicazione PHP, anche per fornire una risposta memorizzata nella cache, probabilmente 10 volte più lento di così. La cache di Nginx ora funziona bene per noi, dobbiamo solo distribuire quella cache tra molti server.
Brad

1
ok, allora puoi provare a usare il modulo Nginx SRCache di terze parti per archiviare il contenuto memorizzato nella cache in Memcached od Redis dedicato.
Max Kochubey,

1
@Brad Questo è hacky, quindi non lo inserirò come risposta: al momento abbiamo uno script notturno che utilizza rsync tra le directory della cache nginx sui nostri server per tenerle aggiornate con gli ultimi file cache di tutti gli altri. Lo script termina con un grazioso riavvio di nginx e un controllo di successo. Come ho detto, è confuso, ma funziona per noi su un sistema ad alto rendimento.
mVChr

@mVChr Interessante. Hai provato a eseguire rsync o simili continuamente? Alla fine per il mio uso, alla fine ho fatto funzionare Redis ma questo non consente una cache molto grande poiché l'intera raccolta Redis deve essere in memoria. 16 GB si riempie velocemente sulla mia applicazione.
Brad

Risposte:


1

Sembra esserci un post di blog piuttosto nuovo su https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ su questo problema. Questo primo esempio potrebbe essere utile se si eseguono più di due server cache nginx.

Soprattutto la seconda parte del post sembra interessante per il mio caso d'uso attuale, in cui desidero ripetere automaticamente la scansione degli elementi modificati nella cache.

Dovrebbe funzionare anche con la versione open source di NGINX. Fondamentalmente funziona eseguendo il proxy della richiesta in cascata attraverso ciascun server NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server) ogni server viene memorizzato nella cache dal relativo upstream e, se lo si desidera, è possibile creare anche un cluster HA. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.