Introdução
No início de 2020, muitas escolas já disponibilizavam parte das suas disciplinas em formato EAD. Com o surto pandêmico, muitas escolas tiveram que se adaptar rapidamente para minimizar os impactos na educação de seus alunos, passando a prover cem por cento do conteúdo e avaliações, no formato a distância.
Em abril, recebi o contato de uma escola de Brasília, que possui aproximadamente 3000 alunos, para avaliar a estrutura do AVA e propor soluções para ampliação e melhoria do ambiente. Até então, a utilização era bastante tímida, com poucos acessos simultâneos.
Cenário Inicial
O ambiente era composto por apenas um servidor, que executava todos os serviços. Em geral, para ambientes de pequeno porte, essa arquitetura funciona muito bem. No entanto, quando o número de acessos aumenta, surgem problemas de desempenho e torna-se bastante difícil fazer ajustes para uma melhor performance. Na ocasião, várias intervenções foram feitas, inclusive aumentando bastante os recursos do servidor e mesmo assim os problemas persistiram.
Antes de iniciar os trabalhos, alguns testes de Benchmark foram feitos para registro e comparação posterior. A principal ferramenta para isso foi o plugin Moodle Benchmark, que é capaz de testar a velocidade do servidor, processadores, discos, banco de dados e carregamento de página. Neste caso, a ferramenta gera uma pontuação que, quanto menor, melhor.
Tivemos a pontuação inicial de 947.
Solução Proposta
A primeira proposta seria a separação dos serviços em dois servidores, um para a aplicação e outro para o banco de dados. Isso tornaria bem mais simples distribuir os recursos entre o sistema operacional e os serviços executados em cada máquina.
Neste caso, a escola dispunha de uma ótima infraestrutura em data center, o que nos possibilitou criar um ambiente mais robusto e resiliente a falhas.
Na solução, propus um ambiente com um Banco de Dados, um servidor NFS, um servidor Redis para cache e gerenciamento de sessão e dois Web Servers, o que nos proporcionaria um ambiente escalável. Para o balanceamento das requisições dos clientes, utilizamos uma solução proprietária provida pelo Data Center mas poderíamos facilmente montar nosso próprio balanceador com o NGINX, por exemplo. Abordarei a construção de um balanceador desse tipo em outro post.
A configuração dos servidores utilizados foi a seguinte:
Web Servers (Apache) 2x | Banco da dados (Postgres) | Servidor de sessão (Redis) | Servidor de arquivos (NFS) |
---|---|---|---|
120GB de disco | 500GB de disco | 120GB de disco | 500GB de disco |
16GB de memória | 64GB de memória | 2GB de memória | 8GB de memória |
8 vCPUs | 16 vCPUs | 4 vCPUs | 8 vCPUs |
O sistema operacional utilizado foi o Debian 10. Além disso, o banco de dados foi migrado de MySQL para PostgreSQL porque este, em geral, oferece ao Moodle uma melhor performance quando possuímos tabelas muito grandes. Além disso, MySQL possui sérios problemas quando o tráfego é grande e requer muitas escritas simultâneas. Um bom artigo que explica mais essas questões pode ser encontrado aqui.
O servidor NFS é a solução mais simples para o compartilhamento do moodledata entre os servidores de aplicação. No entanto ele pode trazer muita dor de cabeça se mal configurado ou utilizado para armazenamento de cache e gerenciamento de sessão. Esse problema é facilmente contornado adicionando um servidor Redis na nossa solução. O Redis é uma solução bem simples, que consome poucos recursos e é capaz de evitar overhead de banco de dados ou de discos.
Após todas as instalações e configurações, obtivemos uma pontuação de 125 no Benchmark Moodle.
Nos próximos posts abordaremos todas as instalações e configurações necessárias para montarmos o ambiente descrito acima.
- Instalação dos servidores de aplicação Apache + PHP.
- Instalação do servidor de arquivos NFS.
- Instalação do servidor de banco de dados PostgreSQL.
- Instalação do servidor gerenciador de sessão Redis.
- Backup e migração do Moodle.