Sugestões sobre arquitetura de aplicações web de larga escala?

4

É uma grande questão :) Estamos rodando um site com LAMP que não é grande, 5 servidores web com balanceamento de carga LVS, 3 servidores MySQL com replicações e separação de leitura e escrita, e usamos o Memcached para caching e alguns full ferramentas de pesquisa de texto. Até agora funciona bem porque não temos um grande tráfego no momento.

Mas quando os usuários estão crescendo rapidamente, teremos que dimensionar nossa arquitetura para satisfazer as necessidades. Talvez o sistema de arquivos e banco de dados distribuídos (e a computação paralela?) Serão introduzidos, e também algumas técnicas para clustering e manutenção (como Gearman e Pshell).

Existem alguns artigos na Internet com os quais eu posso passar. Mas eu realmente preciso de algumas experiências práticas para me preparar para essa questão de maneira viável e eficiente.

    
por Mickey Shine 27.07.2009 / 04:00

3 respostas

12

Existem muitos métodos para dimensionar aplicativos da Web e a infraestrutura de suporte. Cal Henderson escreveu um bom livro sobre o assunto chamado "Construindo Web Sites Escaláveis". Foi baseado em suas experiências com o Flickr. A menos que você cresça lentamente, encontrará os mesmos tipos de problemas de crescimento que muitos outros já viram. O escalonamento é, como muitos outros assuntos, uma jornada e não um destino.

Os primeiros passos são para tornar tudo repetível, mensurável e gerenciável. Por repetitivo quero dizer usar ferramentas como FAI ou kickstart para instalar o sistema operacional e algo como fantoche ou cfengine para configurar as máquinas, uma vez que um sistema operacional básico é instalado. Por mensurável, quero dizer usar algo como cactos, críquete ou gânglios para monitorar o desempenho do seu cluster agora. Meça não apenas coisas como a média de carga, mas quanto tempo leva para processar uma página ou atender a uma solicitação. Nenhum deles parece crítico quando se inicia, mas deve avisá-lo antes que o sistema caia na carga e possa simplificar a adição de 10 ou cem máquinas de uma só vez. Baseie seus planos de crescimento em dados e não adivinha.

Gerenciável significa colocar as ferramentas no lugar para permitir que você gere e teste automaticamente a maior parte da configuração possível. Comece com o que você tem e cresça. Se você está armazenando informações da máquina em um banco de dados, ótimo. Se você não tiver uma planilha, pode exportar. Coloque sua configuração em algum tipo de controle de origem, se você não tiver já. A criação automática de configurações a partir do seu banco de dados permite que você cresça com menos estresse. Testá-los antes de serem ativados em seus servidores pode evitar que um serviço seja iniciado devido a erros de digitação ou outros erros.

Os métodos horizontais assumem que você pode repetir as coisas apropriadamente. Pense na sua aplicação. Quais áreas fazem sentido dividir? Quais áreas podem ser manipuladas por muitas máquinas em paralelo? A latência afeta seu aplicativo. Qual a probabilidade de você encontrar limites de conexão ou outros gargalos? Você está pedindo que seus servidores da Web também lidem com entrega de correio, banco de dados ou outras tarefas?

Eu trabalhei em ambientes com centenas de servidores web. As coisas devem ser divididas de maneira diferente para diferentes tipos de carga. Se você tiver grandes conjuntos de arquivos de dados que raramente mudam, particioná-los longe de "coisas" que mudam ativamente pode dar mais espaço para servir dados estáticos e dinâmicos. Diferentes ferramentas funcionam melhor para cargas diferentes. O Apache e o Lighttpd funcionam bem para algumas coisas, o Nginx funciona melhor para os outros.

Veja os proxies e caches. Tanto entre seus usuários quanto o aplicativo e entre partes do aplicativo. Eu li que você já está usando memcache, isso ajuda. Colocar um proxy reverso como perlbal ou pound entre seu balanceador de carga e os servidores da web pode fazer sentido dependendo do tráfego do seu aplicativo.

Em algum momento você pode descobrir que o MySQL master < - > (N * escravo) replicação não está mantendo-se e que você precisa particionar os bancos de dados. Particionar seus bancos de dados pode envolver a configuração de outra camada de gerenciamento de dados. Muitas pessoas usam outro banco de dados com memcache para esse gerenciamento. Em um lugar eu trabalhei nós usamos mestre < - > pares replicados mestre para a maioria dos dados e outro par com 10 escravos lidos para ponteiros para os dados.

Esta é apenas uma descrição básica de alguns dos problemas que enfrentei ao trabalhar em sites com centenas de máquinas. Não há fim de coisas que crescem de algumas máquinas para algumas centenas. Tenho certeza que o mesmo vale para o crescimento em milhares.

    
por 27.07.2009 / 11:40
3

Há muita literatura boa sobre esse tópico que saiu recentemente. Comece em alta escalabilidade , boa parte das melhores coisas é desejada a partir daí. Você pode dar uma olhada no Blog de Tecnologia do Digg para obter insights sobre como fazemos as coisas, e também pode entrar em contato com recursos como o SAGE - as pessoas nas listas do SAGE são um excelente recurso.

    
por 27.07.2009 / 07:43
1

O alto crescimento da base de usuários para a maioria dos aplicativos da web requer a necessidade de desenvolvedores usar memcache na frente dos bancos de dados. Os dados devem ser calculados e salvos no cache. Isso ajudará a reduzir o tempo que os dados de veiculação são levados para uma página a pedido do usuário.

    
por 11.01.2013 / 11:37