Melhor prática de topologia de hardware escalável de aplicativo da Web

1

Estou trabalhando com um aplicativo da Web existente desenvolvido em Ruby com um backend do MySQL, mas acho que a questão de topologia de hardware genérica será aplicada a uma grande variedade de arquiteturas de servidor.

Estou procurando um documento / recurso da Web explicando e detalhando as melhores práticas atuais relacionadas à organização do hardware em um farm de servidores para entregar um aplicativo baseado na Web com um back-end de banco de dados.

A arquitetura atual é a seguinte:

                    HTTP Server (Apache)
                           |
               Application Servers x 8 (Unicorn / Ruby-on-Rails)
                           |
                     MySQL Back-end (Master)
                            \
                             \
                          MySQL Slave (primarily for performing backups)

A arquitetura proposta precisa ser mais escalonável do que a anterior, incluindo um balanceador de carga na frente de vários servidores HTTP, dividindo os servidores de aplicativos entre os servidores HTTP, vários escravos MySQL para solicitações somente leitura do servidor (que serão controlado por alterações dentro do software aplicativo)

O principal objetivo é ter um sistema mais resiliente, usando as melhores práticas atuais, e é isso que foi sugerido até agora.

Mas, se alguém puder sugerir um recurso para as melhores práticas dentro desse tipo de ambiente, ou propor uma arquitetura que ofereça a resiliência, o desempenho e a escalabilidade que desejamos, eu ficaria muito grato:)

Dave

    
por Dave Rix 24.10.2011 / 21:39

2 respostas

3

A escalabilidade se estende além da camada de hardware e também na camada de aplicativos. A capacidade de um ambiente crescer para bigbigots depende em grande parte da capacidade do software em cada camada de lidar com falhas e manter um estado coerente em todo o ambiente. Se o banco de dados que comanda todo o seu ambiente não puder ser fragmentado, você terá introduzido um limitador de escalabilidade usando esse banco de dados. Esse tipo de coisa.

A Amazon tem alguns white papers sobre desenvolvimento para a nuvem, e vários deles são geralmente aplicáveis a qualquer infraestrutura escalável.

link

Existem alguns princípios de alto nível que você precisa ter em mente ao dimensionar:

  • Deve sobreviver à falha de qualquer componente único e fazê-lo sem intervenção humana.
  • Deve responder dinamicamente a cargas elevadas, sem intervenção humana.

Não use apenas um balanceador de carga, use um trio de balanceadores de carga que apresentam como um único LB, de modo que, se algum deles falhar, os outros possam pegar a carga.

Os servidores da Web / de aplicativos devem ter o estado do usuário disponível em todos os nós, portanto, se um usuário for enviado para outro servidor da Web / aplicativo, sua sessão será preservada. Melhor caso, todo estado pode ser servido de todos os servidores.

Deve haver roteadores redundantes em sua rede, para que você possa desativar um deles sem interromper todo o tráfego. O HSRP é um protocolo para permitir isso.

O plano do seu banco de dados deve incluir o quanto você dimensionará o único servidor de banco de dados antes de começar a fragmentar e iniciar o desenvolvimento com o sharding em mente quando chegar perto desse ponto.

As camadas de cache (memcached) podem ser necessárias em seu ambiente por motivos de desempenho.

Quando você ficar grande o suficiente, precisará planejar como hospedará seu ambiente a partir de vários locais separados (como Oeste dos EUA e Leste dos EUA ou Oeste dos EUA e Europa) via Anycast ou GeoIP. Mover dados entre locais separados será um desafio, e você precisa começar a desenvolver essa suposição assim que chegar perto de precisar de locais separados.

O Ruby em si tem alguns problemas de dimensionamento, concentrando-se em sua capacidade (ou não) de aproveitar vários processadores em servidores. As capacidades estão lá, mas novas, não tão bem compreendidas na comunidade de desenvolvimento (ou assim eu entendo). Quando o Ruby amadurecer, alguns desses problemas desaparecerão.

    
por 24.10.2011 / 22:06
0

Obrigado pela grande explicação; a questão da escalabilidade pode ser reduzida no caso de bancos de dados relacionais por meio do balanceador de carga do banco de dados . Ele pode escalar linearmente e suportar muito mais usuários simultâneos em uma fração do tempo de resposta, tudo sem qualquer alteração em seu aplicativo, portanto, eles são bastante adequados para aplicativos baseados na Web ou na Web.

    
por 02.11.2011 / 07:47