Como compartilhar ativos entre vários servidores web?

16

Tenho vários servidores Web Linux conectados a um balanceador de carga e gosto de compartilhar ativos (como fotos, vídeos e outras coisas) entre esses servidores. Qual é a melhor maneira de fazer isso?

Atualmente, eu montei em um servidor de arquivos todos os servidores da Web, mas estou preocupado com a queda do tráfego. Como posso evitar que isso aconteça?

Desde já, obrigado.

getmizanur
fonte
É aqui que coisas como o Cassandra (bancos de dados NoSQL) são úteis.
Alexis Wilke
Considerou usar o verniz para melhorar o desempenho no tráfego pesado? pt.wikipedia.org/wiki/Varnish_%28software%29
Thorbjørn Ravn Andersen

Respostas:

12

Existem várias maneiras de fazer isso com base nas suas necessidades.

  • Use um servidor de arquivos central montado com o NFS FX nos servidores da Web
  • O mesmo que acima, mas redundante; portanto, se um desce, o outro assume
  • Use algum tipo de ferramenta de sincronização (rsync, por exemplo) e hospede os arquivos localmente nos servidores da web. Em seguida, configure um cronjob para sincronizar os arquivos entre os servidores em um intervalo específico.
  • Use um CDN como Amazon S3, Akamai etc.

Os dois primeiros são melhores se você tiver muitos arquivos novos chegando. A terceira seria a solução ideal se você não adicionar ou alterar arquivos com tanta frequência, pois os usuários receberão 404 em conteúdo estático ainda não sincronizado.

A última opção pode ser ideal de várias maneiras, mas também pode ser a mais cara das 4. Você também precisa reescrever seus sites para dar suporte a isso.

Frederik Nielsen
fonte
O grande problema com o rsync é que você provavelmente obterá um 404 se fizer o upload de novos dados e o rsync não ocorrerá muito rapidamente ... Também um sistema como o Cassandra (ponto 4) é gratuito, embora, obviamente, tenha 10 servidores não seja livre ... então, talvez eu deveria dizer sem custo adicional (embora ele precisa de um pouco de programação para fazer tudo funcionar.)
Alexis Wilke
@AlexisWilke - Você está certo sobre o rsync, e eu também mencionei isso na resposta. Eu esclarei isso na resposta agora.
Frederik Nielsen
Re: # 3, o 'tempo morto' entre o novo ativo implantado e o novo sincronizado pode ser minimizado se você usar um observador do sistema de arquivos (como o vigia do Facebook ) e uma ferramenta de sincronização rápida (como o csync2 ). Não, o atraso nunca será reduzido a zero, mas é muito mínimo e pode ser mais fácil de implantar do que as outras alternativas.
pepoluan
2

Outra ótima maneira de diminuir a carga nos servidores da Web e executar o balanceamento de carga é com o squid (ou seja, o squid3). Configure-o como um proxy reverso com armazenamento em cache. Ele armazenará em cache conteúdo estático, como imagens, etc., no HDD (padrão) ou na RAM (mais rápido e melhor), se você definir dessa maneira. É capaz de rodar robin para outros servidores squid, bem como se algum nó em particular estiver sobrecarregado.

Aihngel Tech
fonte
11
Acho que esse tipo de cache falha se você deseja um site muito dinâmico. Porque, com forte dinamismo, você ainda precisa acessar o servidor de back-end principal para muitos dados. Acho que o usuário está pensando em dividir o trabalho de back-end.
Alexis Wilke
11
Sua resposta está correta sobre potencialmente reduzir a carga, mas não responde à pergunta sobre o compartilhamento de arquivos de ativos entre vários servidores.
@AlexisWilke faz (falha) se você não tiver o squid configurado corretamente. Ajuste como ele armazena em cache (ou se ele armazena em cache) nas configurações, mas você pode achar que nenhuma página é totalmente dinâmica. Sempre há algo que você pode armazenar em cache. Além disso, Andre, ele ajuda bastante no compartilhamento de ativos, como o título descreve, mas no compartilhamento de arquivos nem tanto. A questão era como impedir que os sites caíssem sob carga pesada. Lula é excelente em fazer isso.
Aihngel Tech
1

Como geralmente a necessidade de mais servidores vem dos recursos necessários para executar sites / aps dinâmicos, considere hospedar ativos estáticos em outro subdomínio / domínio. (como static.seudominio.com)

Você pode usar outro servidor / servidores para hospedá-los. A hospedagem de arquivos estáticos não utiliza muitos recursos, portanto, você precisará de consideravelmente menos servidores para o seu conteúdo estático. Você também liberará alguns recursos nos servidores para o seu conteúdo dinâmico.

Dependendo do seu balanceador de carga, você também poderá fazer isso no mesmo domínio, decidindo qual servidor usar para qual solicitação, mas se você usar um domínio separado, poderá colocar seus ativos estáticos em uma CDN com bastante facilidade, se a necessidade deve surgir!

Josef
fonte
1

Uma solução para esse desafio que empreguei é ter a principal cópia de leitura / gravação dos arquivos em uma unidade NFS compartilhada, mas também manter a cópia somente leitura em cada servidor da Web, para que uma falha do host NFS coloque o acesso a arquivos no modo somente leitura, em vez de perdê-los completamente.

  • Arquivos ao vivo no host central, compartilhados com os hosts da web via montagem NFS
  • rsync é executado a cada 15 minutos para manter a cópia somente leitura em cada host da web.
  • Um check_linkscript bash é executado a cada minuto para garantir que a montagem do NFS ainda esteja lá e, caso contrário, troque um link simbólico para a cópia somente leitura.

Mais detalhes são encontrados neste artigo desde quando eu configurei este sistema pela primeira vez.

De cabeça para baixo:

  • As leituras de arquivos estão altamente disponíveis
  • Nenhuma condição de corrida para gravação de arquivo
  • Novos arquivos estão instantaneamente disponíveis para todos os hosts da web.

Desvantagens:

  • um pouco complexo.
  • o número de cópias somente leitura é escalonado com o número de hosts da web, que pode ser excessivo se você tiver muito mais que dois.
  • Gravações de arquivo não estão altamente disponíveis.
  • Potencial de até 1 minuto de tempo de inatividade antes de mudar para a cópia somente leitura.
Adam Franco
fonte
0

Você pode considerar um banco de dados NoSQL. Eles são projetados para trabalhar em clusters, fornecer consistência eventual. Mas tenha cuidado, eles não são ÁCIDOS.

Aqui está uma introdução que o ajudará a decidir que tipo de banco de dados NoSQL você pode desejar para seu propósito.

Aqui está uma lista de recursos relacionados ao NoSQL disponível.

Azzy
fonte
4
Como esta resposta ajuda no problema de sincronização de arquivos?
titus
@titus No NoSQL, quando houver uma gravação em um dos nós, ele será replicado em outros nós no cluster. Cassandra níveis de consistência de gravação pode ajudar na tomada claro
Azzy
então o caminho a seguir é armazenar todos os arquivos no NoSQL db?
titus
@titus você pode, mas os bancos de dados NoSQL podem fazer muito mais do que armazenar arquivos, tudo depende de suas necessidades.
Azzy
2
A OP pediu uma solução para um problema específico " vários servidores Web Linux conectados a um balanceador de carga ... compartilham ativos (como fotos, vídeos e outras coisas) entre esses servidores " . Sua resposta é muito genérica, você pode sugerir e explicar ferramentas específicas (e de preferência suas configurações) para resolver o problema?
Kdbanman
0

Por que você não tenta uma solução DFS, eles oferecem alto nível de redundância e o volume pode ser compartilhado entre quantos você desejar. O Gluster é o meu favorito e é muito fácil de instalar e configurar em qualquer distribuição Linux famosa

Arash mo
fonte