Servindo arquivos estáticos com nginx sobre NFS?

9

Eu tenho um site que está recebendo cerca de 7k solicitações por segundo em um servidor nginx. Este servidor lida com reescritas em um servidor Apache, além de servir diretamente arquivos estáticos, imagens etc. Os arquivos estáticos são a maior parte, com cerca de 5 mil solicitações.

Com uma atualização da arquitetura, penso em usar um servidor de arquivos central que exporta um diretório que contém esses arquivos estáticos via NFS. Não haverá acesso de gravação a esses arquivos; portanto, o diretório pode ser montado como somente leitura na máquina nginx. Minha principal preocupação é:

O NFS é rápido o suficiente para isso? Existe um limite para quantas solicitações o NFS pode atender? Existem algumas opções "indispensáveis" ao seguir esse caminho?

Bônus: existem outras alternativas para essa configuração além do NFS?

Obrigado!

j0nes
fonte
Sem acesso de leitura ou "apenas" acesso de leitura?
pauska
Obrigado! Somente acesso de leitura, sem acesso de gravação.
j0nes
2
7k solicitações por segundo são ~ 6.048.000.000 solicitações por dia, se você estiver executando isso em um único servidor NGINX, nós (e as empresas que usam clusters de servidores para metade da carga) adoraríamos conhecer sua configuração.
Smudge

Respostas:

2

Ao configurar um servidor NFS central, você introduz um único ponto de falha em seu design. Isso por si só deve ser um disjuntor. Caso contrário, o NFS pode ser rápido o suficiente para uma carga como essa. Os fatores críticos serão ter RAM suficiente para armazenar arquivos em cache, interconexões de baixa latência (Gig-E ou melhor) e ajuste (menos que o anterior).

Você também deve considerar o uso do rsync ou de uma ferramenta semelhante para manter cópias locais das atualizações de arquivos estáticos em cada servidor da web. Outra opção pode ser uma solução de servidor SAN ou NFS redundante (os quais serão muito mais complicados e dispendiosos do que a idéia rsync).

Chris S
fonte
2
O NFS não precisa ser um SPoF
gWaldo
@gWaldo Como exatamente você pode configurar "um servidor NFS central" e não o SPoF?
Chris S
Você faz isso percebendo que, como disse, um servidor NFS central é um SPoF e, em vez disso, escolhe implementar um cluster NFS. Eu não estou realmente em desacordo com você ....
gWaldo
Obrigado - aceitando esta solução porque acho que vou seguir a rota rsync, evitando o ponto único de falha (que deve ser minha principal preocupação).
j0nes
É bastante simples implementar um servidor NFS replicado duplo de alta disponibilidade usando GlusterFS e CTDB. Em termos de desempenho, meu cluster estava recebendo cerca de 10 mil solicitações por segundo e está funcionando muito bem. O único problema é que os servidores NFS precisarão ter muita RAM.
Alpha01
2

Eu uso cachefilesd (e um kernel Linux recente, com cachefs) para armazenar em cache arquivos NFS em um HD local. Dessa forma, toda leitura no nfs copiará o arquivo para um diretório / var / cache / fs e as próximas leituras serão entregues a partir daí, com o kernel verificando no nfs se o conteúdo ainda é válido.

Dessa forma, você pode ter um NFS central, mas sem perder o desempenho dos arquivos locais

O Cachefilesd cuidará da limpeza de arquivos antigos quando o tamanho / inodes livres atingirem um nível configurado, para que você possa fornecer dados incomuns do NFS e solicitações comuns do HD

Obviamente, também use um verniz para armazenar em cache as solicitações mais comuns e salvar o nginx / NFS de servir então.

Aqui está um pequeno arquivo de cache

higuita
fonte
1

A velocidade depende de muitos fatores:

  • Como seus servidores serão conectados ao destino NFS? Um único disco SAS de porta dupla pode utilizar 6gbit / s de velocidade de transferência. Lembre-se disso se estiver planejando usar a 1gig Ethernet (da qual é possível subtrair 20% da sobrecarga TCP).
  • Que tipo de cache o servidor NFS obterá? Você está usando um controlador de matriz de nível empresarial com muito cache? O cache de leitura é essencial nesta configuração
  • Quantos servidores acessarão o mesmo arquivo simultaneamente? O bloqueio do NFS pode doer - muito

O limite de arquivos abertos via NFS é uma limitação do sistema operacional host. O FreeBSD possui, por exemplo, muitas opções de ajuste diferentes para suportar um grande número de arquivos abertos, mas isso depende da quantidade de RAM no seu servidor.

Uma alternativa para um servidor de arquivos central é usar a sincronização / replicação entre seus servidores da web (como sugere Chris S). rsync ou DRBD pode ser uma escolha ótima e econômica.

pauska
fonte
1

Eu recomendaria contra o NFS, a menos que você coloque algum cache lá. O cache nginx é melhor que nada, mas o Varnish é melhor.

Com isso dito, se sua carga mudar para ser um conteúdo mais dinâmico do que estático, será mais importante servir os arquivos de aplicativos do disco local.

Se você inserir o NFS, verifique se possui redundância.

gWaldo
fonte
Isso pode exigir um pouco de alteração na arquitetura. Além de usar uma camada de armazenamento em cache como o Varnish, também é uma boa idéia usar uma configuração CDN de pull de origem para todos os arquivos estáticos que estarão no compartilhamento NFS. Isso aliviará a carga que atinge o back-end do NFS.
Alpha01