Pergunta

Eu tenho um enviorment de balanceamento de carga com mais de 10 servidores web que executam o IIS. Todos os sites estão acessando um único arquivo de armazenamento que hospeda todas as imagens. Atualmente, temos 200 GB de imagens - que armazená-los em diretórios de 1000 imagens por diretório. Agora todas as imagens estão em um único dispositivo de armazenamento (RAID 10) conectado a um único servidor que atua como o servidor de arquivos. Todos os servidores web estão conectados ao servidor de arquivos na mesma LAN. Eu estou olhando para melhorar a arquitetura de modo que teríamos nenhum ponto único de falha. Estou pensando em duas alternativas:

  1. replicar o arquivo de armazenamento para todos os servidores web para que eles todo o acesso aos dados localmente
  2. replicar o arquivo de armazenamento para outro armazenamento para que se algo acontecer com o armazenamento atual que seria capaz de mudar para ele.

Obviamente, as principais operações realizadas no armazenamento de arquivos são lidos, mas também há um monte de operações de gravação. O que você acha que é o método preferido? Qualquer outra idéia?

Atualmente, estou descartando o uso de CDN, uma vez que vai exigir uma mudança de arquitetura do aplicativo que não podemos fazer agora.

Nenhuma solução correta

Outras dicas

certas coisas que eu normalmente considerar antes de ir para a mudança arco é

  1. Quais são as questões de arco atual
  2. O que estou fazendo de errado com o arco atual. (Se isso tivesse trabalhado por um tempo, pequenos ajustes normalmente resolver um monte de problemas)
  3. será que vai permitir-me a crescer facilmente (aqui sempre haverá um limite superior). Com base no passado crescimento de dados, você pode efetivamente planejar.
  4. confiabilidade
  5. fácil manutenção / monitor / solução de problemas
  6. custo

200GB não é um monte de dados, e você pode ir para alguma solução cultivado em casa ou usar algo como um NAS, o que lhe permitirá expandir mais tarde. E ter uma réplica hot swappable do mesmo.

A replicação para o armazenamento de todos os servidores web é uma configuração muito caro, e como você disse, há uma série de operações de gravação, ele terá uma grande sobrecarga em replicar para todos os servidores (que só vai aumentar com o número de servidores e crescente de dados). E há também a questão dos dados obsoletos sendo servido por um dos outros nós. Para além de que solução de problemas problemas de replicação vai ser uma bagunça com 10 e nós de crescimento. A menos que a pesquisa / leitura / gravação de arquivos é muito tempo crítico, replicando para todos os servidores web não é uma boa idéia. Usuários (de web) dificilmente vai notar a diferença de 100ms - 200ms em loadtime.

Há alguns empresa soluções para esse tipo de coisa. Mas eu não tenho dúvida de que eles são caros. O NAS não escala bem. E você tem um único ponto de falha que não é bom.

Existem algumas maneiras que você pode escrever código para ajudar com isso. Você pode armazenar em cache as imagens nos servidores web a primeira vez que são solicitadas, isso vai reduzir a carga sobre o servidor de imagem.

Você pode obter um escravo mestre configurar, de modo que você tem um servidor de imagem principal, mas outros servidores que copiam a partir deste. Você poderia carregar equilibrar estes, e colocar alguma lógica em seu código para que, se um escravo não tem uma cópia de uma imagem, você verificar o mestre. Você também pode atribuir estes em ordem de prioridade de modo que se o mestre não está disponível o primeiro escravo, em seguida, se torna o mestre.

Uma vez que você tem tão poucos dados em seu armazenamento, faz sentido comprar vários grandes HDs ou usar o espaço livre em seus servidores web para manter cópias. Ele vai derrubar a pressão sobre o seu sistema de armazenamento de backend e quando ele falhar, você ainda pode entregar conteúdo para seus usuários. Ainda melhor, se você precisa de escala (mais downloads), você pode simplesmente adicionar um novo servidor e o estresse em seu backend não vai mudar, muito.

Se eu tivesse que fazer isso, eu usaria rsync ou uníssono para copiar os arquivos de imagem no exato mesmo espaço nos servidores da web, quando decorram de o dispositivo de armazenamento (desta forma, você pode trocar a cópia com um sistema de arquivos de rede montar qualquer momento).

Executar rsync de vez em quando (por exemplo, depois de qualquer carregamento ou uma vez no meio da noite, você vai saber melhor que tamanhos você se encaixa melhor).

Uma solução mais versátil seria usar um protocolo P2P como Bittorreent. Dessa forma, você poderia publicar todas as alterações no backend de armazenamento para os servidores web e eles otimizar as atualizações automatcially.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top