O blog da AWS

Implementação do Moodle em alta disponibilidade na AWS

Por Alex Luna, SA, WWPS México

 

O Moodle é um Sistema de Gestão de Aprendizagem (LMS) de código aberto amplamente adotado e usado por uma série de instituições educacionais em todo o mundo, muitas das quais enfrentam desafios de escalabilidade e desempenho devido ao aumento do número de usuários, especialmente em períodos de alta frequência e pico de demanda, como como inscrições ou estação de teste.

Este artigo mostra como implantar uma solução Moodle altamente disponível, tolerante a falhas e escalável de maneira distribuída. Ele também emprega um modelo AWS CloudFormation que facilita a implantação e a configuração dos recursos necessários para dar suporte à solução em questão.

O Moodle é frequentemente implementado sob um modelo de arquitetura monolítica, ou seja, tanto o banco de dados quanto o servidor web e o servidor de aplicativos são instalados no mesmo servidor ou, na melhor das hipóteses, o banco de dados em uma instância e o servidor web em outra, levando a desafios de disponibilidade e escalabilidade.

Uma maneira de resolver esses problemas é o dimensionamento vertical, ou seja, aumentar a capacidade dos recursos (RAM, CPU e armazenamento) na mesma instância. Isso leva a janelas de manutenção para escalar ou migrar para um servidor com recursos mais altos.

A abordagem acima é complicada, demorada e dispendiosa; e envolve superestimar ao tentar satisfazer a simultaneidade ou subestimar ao tentar economizar custos. Sendo uma solução temporária para escalabilidade, ainda pendente do problema de alta disponibilidade e tolerância a falhas.

 

Visão rápida da solução

Abaixo está uma solução para implementar uma arquitetura distribuída, econômica, autoescalável e tolerante a falhas para o Moodle, baseada na arquitetura de referência Moodle Hosting on AWS.

A solução consiste em um conjunto de arquivos YAML que implantam recursos, por meio do AWS CloudFormation, em uma conta da AWS, automaticamente, para que você só precise fornecer determinados parâmetros. Modelos individuais implantarão o Moodle usando serviços como:  Amazon Virtual Private Cloud (Amazon VPC)Amazon Elastic Compute Cloud (Amazon EC2)Auto ScalingElastic Load Balancer (Application) Load Balancer)Amazon Relational Database Service (Amazon RDS)Amazon ElastiCacheAmazon Elastic File System (Amazon EFS)Amazon CloudFrontAmazon Route 53Amazon Certificate Manager (Amazon ACM). Esta solução pode ser excessiva para determinadas implementações do Moodle dependendo do caso de uso, de modo que os modelos podem ser executados individualmente, se necessário.

 

Procedimento

Implantar modelo CloudFormation

O modelo exibe o arquivo 00-master.yaml, que invoca outros arquivos yaml individuais contendo a configuração dos diferentes serviços envolvidos na solução.

Criar a stack

  1. Faça login no Console da AWS.
  2. Selecione a região em que deseja implantar a solução.
  3. Clique no link “Executar stack” na tabela abaixo que corresponde à região em questão.]

 

Código da região da AWS Nome Executar
1 us-east-1 Leste dos EUA (N. Virginia) Executar stack
2 us-east-2 Leste dos EUA (Ohio) Executar stack
3 us-west-2 Oeste dos EUA (Oregon) Executar stack
4 eu-oeste-1 UE (Irlanda) Executar stack
5 eu-central-1 UE (Frankfurt) Executar stack
6 ap-sudeste AP (Sydney) Executar stack

 

  1. Clicar em “Próximo” irá levá-lo para a próxima página.

 

 

Especificar detalhes da stack

  1. Geral
    • Defina um nome para a stack.
    • Um par de chaves deve ser fornecido para acessar as instâncias Bastion e web.
    • Se você tiver um domínio, você deve especificar.
    • Se o Route 53 for usado, escolha false
  2. Redes
    • Insira o número e selecione as zonas de disponibilidade nas quais os recursos devem ser implantados.
    • Por padrão, o segmento de rede 10.0.0.0/16 será usado para criar a VPC, observe que não deve haver outra VPC com o mesmo segmento de rede ou a stack falhará. Em caso afirmativo, especifique outro segmento de rede ou selecione outra região.
    • Até 6 segmentos de rede podem ser configurados para cada sub-rede, Público, Web e Dados, esses segmentos correspondem às Zonas de disponibilidade selecionadas na etapa anterior.
  3. Camada do Sistema de Arquivos
    • Selecionar “GeneralPurpose” é suficiente.
    • Se desejar, a criptografia pode ser usada, para este exemplo não é usada.
    • O tamanho da instância pode ser ajustado de acordo com a necessidade específica.
  4. Camada de Banco de Dados
    • Ajuste o tipo de instância apropriado.
    • Se você quiser, você pode usar criptografia, para este exemplo, não é necessário.
    • Capture o usuário primário e o nome do banco de dados Moodle.
  5. Camada de cache
    • Você deve deixar o parâmetro de cache de sessão falso durante a instalação inicial e configurar o cache de sessão após a conclusão da instalação. Importante Isso ocorre porque a instalação do Moodle falhará se o cache da sessão memcached estiver habilitado durante a configuração inicial.
    • Selecione false no Cache de Sessão.
    • Selecione true no Application Cache.
    • Selecione o tamanho de instância desejado para cada nó de cache.
    • Especifique se o CloudFront será usado. Isso depende se você deseja usar uma CDN.
    • Capture o ARN do certificado criado nos pré-requisitos.
  6. Camada Bastion
    • Especifique o tipo de instância, uma instância pequena é recomendada, por exemplo t2.micro.
  7. Camada da Web
    • Capturar o ARN do certificado criado nos pré-requisitos
    • Indique o tipo de instância para servidores Web.
    • Deixe Min e Max em 1 porque o assistente de instalação do Moodle pode causar um pico que faz com que instâncias desnecessárias sejam iniciadas nesta fase.
  8. Clique em Avançar.

Configuração do Moodle

Depois que os recursos do modelo do CloudFormation tiverem sido criados, a instalação do Moodle será continuada.

 

Instalação do Moodle

  1. O resultado da stack é um DNSName na aba Saída.

 

 

  1. Clique no URL da chave DNSName para ir para a tela de instalação, o DNS será redirecionado para o domínio indicado nos parâmetros da stack

 

 

  1. Clique em “Continuar”.
  2. Moodle irá exibir todas as extensões php instaladas. Clique em “Continuar”.
  3. O Moodle será então atualizado, quando terminar ele exibirá a mensagem “A instalação deve ser concluída a partir do endereço IP original, desculpe.“, que é um bug documentado pelo Moodle quando implantado no cluster, para corrigi-lo executando a etapa 6, caso contrário, pule para a etapa 7.
  4. Atualize o IP no banco de dados.
    • Defina o valor de “Capacidade desejada” e “Capacidade mínima” do Auto Scaling Group do Bastion host como 1, para que uma instância de bastion host seja criada e, a partir daí, você possa atualizar o IP no banco de dados. A criação do bastion host começará automaticamente.

 

 

    • Acesse o console do AWS Secrets Manager, em Valor secreto, clique em “Recuperar valor secreto” para obter a senha do banco de dados, copie o Secret Value da senha da Secret Key.

 

 

    • Obtenha o endpoint do banco de dados no console do RDS, selecione o nó “Writer”.

 

 

    • Selecione a seção “Interfaces de rede” do console do EC2 e copie o IP privado do Balancer.
    • Conecte-se ao Bastion host usando o DNS público do host. Abra um terminal SSH e digite o seguinte comando.
$ ssh -i “<<meu_arquivo.pem>>" ec2-user@<<ip público bastion>>

    • Conectando-se a uma das instâncias da Web a partir do bastião do host, recomenda-se o uso de um SSH Agent Forwarding.
    • Uma vez dentro da instância do aplicativo, abra a conexão com o banco de dados.
$psql “dbname=moodle host=<<endpoint_no_writer_do_RDS_copiado_no_item_c>> user=moodle password=<<secret_value_do_item_b>> port=5432 sslmode=require”
    • Execute o comando de atualização
UPDATE mdl_user set lastip='<<ip_private_item_d.>>' where username='admin';

  1. Clique no botão “Continuar”. A tela deve mudar.
  2. Capture os dados necessários (Usuário, Senha, Primeiro e Sobrenome), clique em “Atualizar perfil”.
  3. Neste ponto, é provável que o erro seja exibido: “ 504 ERRO A solicitação não pôde ser satisfeita.” ou “Timeout do gateway 504”. Apenas atualize a página.
  4. Dê um nome à instalação, selecione o fuso horário e clique em “Salvar alterações”.
  5. A próxima página é opcional para registrar a instalação.

 

Configurações de cache

Até este ponto Moodle já está configurado, mas o desempenho pode ser observado lento.

Configurar o cache de aplicativos

  1. Faça login no Moodle com o nome de usuário e senha previamente configurados.
  2. Acesse o console do ElastiCache e clique no cluster “moodleapplication”.
  3. Copie o “Ponto de extremidade de configuração”.

 

 

  1. Clique em “Administração do Site”.
  2. Clique na guia “Plugins”, procure a seção “Caching” e clique em “Configuration”.
  3. Na seção “Armazenamentos de cache instalados de administração de cache”, clique em “Adicionar instância” na linha Memcached.

 

 

  1. Capture um valor para “Storage name” e cole o endpoint obtido do console do ElastiCache na caixa de texto “Servers”.

 

 

  1. Clique em “Save Changes”.
  2. Navegue até a parte inferior da página e clique em “Edit Mappings”.
  3. Na página “Cache Administration” no parâmetro “Application” selecione o armazenamento de cache adicionado na etapa anterior e clique em “Salvar alterações”.

 

 

  1. A partir deste ponto, o aplicativo deve responder rapidamente.
  2. Opcionalmente, o cache de sessão pode ser configurado repetindo as etapas nesta seção. É recomendável que você crie um cluster especificamente para o cache de sessão.

 

Recursos implantados e notas de instalação do Moodle

Application Load Balancer

Um Application Load Balancer distribui o tráfego de entrada para o aplicativo em várias instâncias do EC2 em várias zonas de disponibilidade. A alta disponibilidade é obtida agrupando vários servidores Moodle acessados a partir de um balanceador de carga.

Autoscaling da Amazon

O Amazon EC2 Auto Scaling permite controlar o número de instâncias do EC2 ativas a qualquer momento, e você pode aumentá-las ou diminuí-las usando métricas definidas pelo usuário para atender à demanda. O modelo define que, se a utilização média da CPU exceder 75% por 3 minutos, uma instância será adicionada e excluída se a média cair abaixo de 25% por 3 minutos

Amazon Elastic File System (EFS)

É um serviço de armazenamento de arquivos simples e escalável que pode ser montado em instâncias do EC2. Enquanto a instalação do Moodle sobre EFS torna as tarefas de gerenciamento, como atualização, instalação de patches mais fáceis, o Moodle não funciona bem em execução no armazenamento compartilhado. O Moodle recomenda que a pasta dirroot seja configurada localmente. Portanto, o modelo usa uma combinação de EBS (Elastic Block Store) e EFS. Cada servidor web dentro do cluster Moodle usa a seguinte estrutura de diretórios:

$cfg->DirRoot = '/var/www/moodle/html' #Armazenado no volume raiz do EBS
$cfg->DataRoot = '/var/www/moodle/data' #Armazenado no sistema de arquivos EFS compartilhado
$cfg->cacheDir = '/var/www/moodle/cache' #Armazenado no sistema de arquivos EFS compartilhado
$cfg->TempDir = '/var/www/moodle/temp' #Armazenado no sistema de arquivos EFS compartilhado
$cfg->LocalCacheDir = '/var/www/moodle/local' #Armazenado no volume raiz do EBS

De acordo com a documentação do Moodle, quando ele é implantado como uma solução em cluster, o diretório dirroot deve sempre ser mantido no modo de leitura para o processo Apache, caso contrário, ao instalar ou desinstalar plugins ou plugins, os nós perderão a sincronização. Isso significa que os plug-ins não podem ser instalados em um cluster de servidor a partir da página do painel de administração. O Moodle recomenda instalar manualmente os plugins em cada servidor durante as janelas de manutenção programadas. Uma alternativa é configurar a instalação de plugins como scripts, a outra é instalar os plugins em uma instância, gerar uma AMI a partir dela e atualizar a configuração Launch para que as próximas instâncias sejam geradas a partir dela.

Cache

O cache afeta significativamente o desempenho do Moodle. O modelo configura várias formas de cache, incluindo OpCache, CloudFront e ElastiCache

OpCache

Acelere a execução do PHP armazenando scripts pré-compilados na memória. Os benefícios do OpCache são desempenho aprimorado e menor uso de memória. O modelo configura o OpCache dessa maneira.

Amazon ElastiCache

O Amazon ElastiCache para Memcached é um serviço de armazenamento de chave-valor compatível com Memcached que pode ser usado para armazenamento em cache ou dados. O Moodle recomenda não usar o mesmo servidor memcached para sessões e MUC. Então, o modelo configura 2 cluster do ElastiCache, um para cache de sessão e outro para cache de aplicativos.

Cache de sessão

A recomendação do Moodle é usar um servidor memcached compartilhado para armazenar sessões. Para mais informações consulte este link.

Cache de aplicativos

O modelo também implanta um cluster do ElastiCache para cache de aplicativos, que deve ser configurado após a instalação. Esse cache aumentará significativamente o desempenho da solução.

Limpeza de Recursos

Para excluir os recursos (se necessário) criados neste exercício, você deve acessar o console do CloudFormation, selecionar a stack usada e clicar em “Excluir”.

 

Conclusão

O uso de serviços e práticas recomendadas da AWS permite implantar uma arquitetura de solução para o Moodle que ofereça alta disponibilidade, resiliência e escalabilidade sob demanda, de forma econômica, otimizando recursos e custos.

 


Sobre o autor

Alex Luna é Arquiteto de Soluções na AWS México