Autor original: Adam Charnock
Link original: O Guia do Mochileiro para Balanceamento de Carga PHP
Tradução: Koda
costumava significar executar um grande servidor web ao executar um grande aplicativo web. Como seu aplicativo atrai um grande número de usuários, você terá que adicionar mais memória e processadores ao seu servidor.
Hoje, o modelo de “grande servidor” desapareceu, sendo substituído por um grande número de pequenos servidores, utilizando uma variedade de técnicas de balanceamento de carga. Esta é uma abordagem mais viável que manterá os custos de hardware no mínimo.
A vantagem de 'mais servidores pequenos' em relação ao modelo anterior de 'servidor grande' se reflete em dois aspectos:
se o servidor ficar inativo, o sistema de balanceamento de carga irá parar de fazer solicitações ao servidor inativo e, em vez disso, distribuirá a carga para outros servidores normalmente em execução . superior.
Dimensionar seu servidor é mais fácil. Tudo o que você precisa fazer é adicionar novos servidores ao sistema de balanceamento de carga. Não há necessidade de interromper sua aplicação.
Então, aproveite esta oportunidade :). A desvantagem, claro, é que ela exige um pouco mais de complexidade no desenvolvimento da sua aplicação. É isso que este artigo irá abordar.
Neste ponto você pode estar pensando: 'Mas como posso saber se estou usando balanceamento de carga? '. A resposta mais honesta, se você estiver fazendo essa pergunta, é que provavelmente você não está usando um sistema de balanceamento de carga e seu sistema não precisa levar isso em consideração. Na maioria dos casos, quando o aplicativo cresce o suficiente, o balanceamento de carga precisa ser explicitamente proposto e configurado. No entanto, ocasionalmente vejo empresas de hospedagem na Web fazendo esse balanceamento de carga para aplicativos de clientes ou fazendo isso elas mesmas, conforme descrito abaixo.
Antes de continuar, gostaria de salientar que este artigo descreve principalmente o balanceamento de carga em PHP. Posso escrever sobre balanceamento de carga de dados no futuro, mas por enquanto você terá que esperar.
Observe que continuo mencionando "aplicativos da web" em vez de sites. Isso serve para distinguir que 'aplicativos da web' são sites complexos que geralmente envolvem programação e bancos de dados do lado do servidor, em vez de sites que exibem apenas conteúdo estático simples.
1. Arquivos PHP A primeira pergunta é: se você possui um grande número de servidores pequenos, como você carrega seus arquivos php para todos os servidores? Existe o seguinte método para sua referência:
carregue todos os arquivos para cada servidor separadamente. O problema com este método é: imagine que você tem 20 servidores, então isso facilmente levará a erros durante o processo de upload e o tempo de atualização será muito. rápido É possível ter diferentes versões de arquivos em diferentes servidores.
Use 'rsync' (ou software semelhante). Essa ferramenta pode sincronizar arquivos em um diretório local e diretórios em vários hosts remotos.
Use software de controle de versão (como o subversion). Este é meu método favorito. Isso me permite manter meu código muito bem e, quando publicar meu aplicativo, posso executar o comando svn update em cada servidor para sincronizá-lo. Essa abordagem também facilita a troca de servidores para uma versão anterior do código.
Use um servidor de arquivos (você pode achar que o NFS é ótimo para isso). Essa abordagem é usar um servidor de arquivos para hospedar seu aplicativo da web. Neste momento, você precisará gastar mais dinheiro para restaurá-lo.
O método que você escolher depende de suas necessidades e das habilidades que você possui. Se você usa um sistema de controle de versão, talvez queira planejar uma maneira de atualizar o código em todos os servidores executando um comando de atualização ao mesmo tempo. No entanto, se você usar um servidor de arquivos, precisará implementar algum mecanismo de recuperação de falhas para evitar falhas de solicitação no caso de o servidor ficar inativo.
2. Upload de arquivos Quando há apenas um servidor, o upload de arquivos não é um problema. Mas quando temos vários servidores, como os arquivos enviados devem ser armazenados? O problema de upload de arquivos é semelhante ao armazenamento de arquivos PHP entre servidores. Aqui estão várias soluções possíveis:
Armazene o arquivo em um banco de dados. A maioria dos dados permite que dados binários sejam armazenados. Quando você solicita um download de arquivo, os dados de acesso exibem os dados binários e o nome e tipo de arquivo correspondente para o usuário. Você deve considerar como o banco de dados armazenará seus arquivos antes de usar esta solução. O problema com essa abordagem é que se o servidor de banco de dados ficar inativo, os arquivos ficarão indisponíveis.
Armazene os arquivos carregados em um servidor de arquivos Como na introdução anterior, você precisa instalar um servidor de arquivos para ser compartilhado por todos os servidores web. No entanto, se o servidor de arquivos estiver inativo, poderão ocorrer interrupções no download do arquivo de imagem.
Projete seu próprio mecanismo de upload para transferir arquivos para cada servidor. Essa abordagem não tem as desvantagens de um único servidor de arquivos ou solução de banco de dados, mas aumentará a complexidade do seu código. Por exemplo, se o servidor cair durante o upload para vários servidores, o que você fará?
Usar um banco de dados para armazenar arquivos carregados, mas projetar um mecanismo de cache de arquivos é uma boa solução. Quando o servidor recebe uma solicitação de download de arquivo, ele primeiro verifica se o arquivo existe no sistema de cache. Se for encontrado, ele o baixa do sistema de cache, caso contrário, ele o lê do banco de dados e o armazena em cache no sistema de arquivos.
3. Sessões
Se você estiver familiarizado com o tratamento de sessões do PHP, provavelmente saberá que, por padrão, ele armazena dados de sessão em arquivos temporários no servidor. Além disso, este arquivo está apenas no servidor onde você o solicitou, mas as solicitações subsequentes poderão ser processadas por outro servidor, o que irá gerar uma nova sessão no outro servidor. Isso faz com que as sessões sejam frequentemente não reconhecidas, como os usuários logados sempre sendo solicitados a fazer login novamente.
Minha solução recomendada é restabelecer o mecanismo de processamento de sessão integrado do PHP para armazenar dados de sessão no banco de dados ou implementar seu próprio mecanismo para garantir que a solicitação de um usuário seja enviada ao mesmo servidor.
4. Configuração
Embora este tópico não esteja relacionado especificamente ao PHP, sinto que é necessário mencioná-lo. Ao executar servidores em cluster, é uma boa ideia ter alguma forma de manter os arquivos de configuração sincronizados entre os servidores. Se os arquivos de configuração forem inconsistentes, isso poderá resultar em um comportamento intermitente muito estranho que pode ser difícil de solucionar.
Recomendo gerenciá-los individualmente usando um sistema de controle de versão. Dessa forma, você pode armazenar diferentes arquivos de configuração php para diferentes instalações de projetos e também manter todos os arquivos de configuração do servidor sincronizados.
5. Registro
Assim como os problemas de configuração, o log não está relacionado apenas ao PHP. Mas ainda é muito importante manter o funcionamento saudável do seu servidor. Sem um sistema de registro adequado, como você saberia se seu código PHP começa a gerar erros (você sempre desativa a configuração display_errors quando o sistema está ativo, não é?)
Existem algumas maneiras de implementar o registro:
Faça logon a cada servidor. Esta é a maneira mais fácil. Cada máquina grava apenas um arquivo. A vantagem é que é simples e pode exigir muito pouca configuração. Entretanto, à medida que o número de servidores aumenta, o monitoramento dos arquivos de log em cada servidor torna-se muito difícil.
Registrando em um compartilhamento Essa abordagem ainda possui os arquivos de log em cada servidor, mas eles são armazenados em um servidor de arquivos central por meio do mecanismo de compartilhamento, o que facilita o monitoramento dos logs. O problema com esta solução é que, se o servidor de arquivos não estiver disponível, um simples problema de gravação de log acabará por causar o travamento de todo o aplicativo.
Registrando em um servidor de registro Você pode usar um software de registro como o syslog para gravar todos os registros em um servidor central. Embora este método exija mais configuração, ele também fornece a solução mais robusta.
phpv acrescentou: Outro ponto importante é o gerenciamento do banco de dados, que pode envolver muito conteúdo, portanto o autor não escreveu.