Cache Nginx compartilhado entre vários servidores

9

Temos 8 servidores de API REST-ish com Nginx usando FastCGI com PHP-FPM para lidar com solicitações. Atualmente, estamos usando o cache FastCGI do Nginx (diretivas como fastcgi_cache_path). Isso significa que as respostas da API são armazenadas em cache, mas há um cache separado para cada servidor.

Existe uma boa maneira de compartilhar armazenamento em cache entre todos os oito servidores?

Consideramos o uso do Redis como armazenamento compartilhado, mas os módulos disponíveis parecem exigir alterações no aplicativo. Em alguns casos, podemos desejar armazenar em cache respostas fora do nosso controle (sobre HTTP para APIs externas). Idealmente, estaria disponível um substituto para o armazenamento em cache interno do Nginx das respostas FastCGI e HTTP.

Brad
fonte
Por que você não faz o cache não na camada de front-end (Nginx), mas na camada de back-end (aplicativo PHP)?
Max Kochubey
@hangover Não vejo razão para reinventar a roda. O cache do Nginx funciona bem e rápido. Se pudermos evitar a sobrecarga de executar solicitações por meio do aplicativo, podemos manter as coisas agradáveis ​​e rapidamente. O Nginx responde a solicitações em cache para nós em menos de 5 milissegundos. O lançamento do nosso aplicativo PHP, mesmo para fornecer uma resposta em cache, provavelmente será 10 vezes mais lento que isso. O cache do Nginx está funcionando bem para nós agora, só precisamos distribuir esse cache entre muitos servidores.
27414 Brad
1
ok, você pode tentar usar o módulo Nginx SRCache de terceiros para armazenar conteúdo em cache no Memcached od Redis dedicado.
Max Kochubey
1
@ Brad Este é hacky, então não vou colocá-lo como resposta: atualmente, temos um script de execução noturna que usa rsync entre os diretórios de cache nginx em nossos servidores para manter cada um atualizado com os arquivos de cache mais recentes de todos os outros. O script termina com uma reinicialização graciosa do nginx e verificação de sucesso. Como eu disse, é hacky, mas funciona para nós em um sistema de alto rendimento.
MVChr
@mVChr Interessante. Você já tentou executar o rsync ou similar continuamente? No final, para meu uso, acabei conseguindo o Redis funcionando, mas isso não permite um cache muito grande, pois toda a coleção Redis deve estar na memória. O preenchimento rápido de 16 GB no meu aplicativo.
24414 Brad

Respostas:

1

Parece haver uma nova publicação no blog em https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ sobre esse problema. Este primeiro exemplo pode ser útil se você executar mais de dois servidores de cache nginx.

Especialmente a segunda parte da postagem parece interessante para o meu caso de uso atual, em que desejo rastrear automaticamente itens alterados nos meus caches.

Também deve funcionar com a versão de código aberto do NGINX. Basicamente, ele funciona por meio de proxy da solicitação em cascata em cada servidor NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server), que cada servidor armazena em cache no upstream relevante e, se desejado, também é possível criar um cluster de alta disponibilidade. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

Macbert
fonte