{"id":105,"date":"2020-06-06T18:29:17","date_gmt":"2020-06-06T21:29:17","guid":{"rendered":"https:\/\/samueljr.top\/blog\/?p=105"},"modified":"2020-06-09T15:32:25","modified_gmt":"2020-06-09T18:32:25","slug":"cluster-moodle","status":"publish","type":"post","link":"https:\/\/goon.tec.br\/blog\/index.php\/2020\/06\/06\/cluster-moodle\/","title":{"rendered":"Cluster Moodle"},"content":{"rendered":"<h3>Introdu\u00e7\u00e3o<\/h3>\n<p>No in\u00edcio de 2020, muitas escolas j\u00e1 disponibilizavam parte das suas disciplinas em formato EAD. Com o surto pand\u00eamico, muitas escolas tiveram que se adaptar rapidamente para minimizar os impactos na educa\u00e7\u00e3o de seus alunos, passando a prover cem por cento do conte\u00fado e avalia\u00e7\u00f5es, no formato a dist\u00e2ncia.<\/p>\n<p>Em abril, recebi o contato de uma escola de Bras\u00edlia, que possui aproximadamente 3000 alunos, para avaliar a estrutura do AVA e propor solu\u00e7\u00f5es para amplia\u00e7\u00e3o e melhoria do ambiente. At\u00e9 ent\u00e3o, a utiliza\u00e7\u00e3o era bastante t\u00edmida, com poucos acessos simult\u00e2neos.<!--more--><\/p>\n<h3>Cen\u00e1rio Inicial<\/h3>\n<p>O ambiente era composto por apenas um servidor, que executava todos os servi\u00e7os. Em geral, para ambientes de pequeno porte, essa arquitetura funciona muito bem. No entanto, quando o n\u00famero de acessos aumenta, surgem problemas de desempenho e torna-se bastante dif\u00edcil fazer ajustes para uma melhor performance. Na ocasi\u00e3o, v\u00e1rias interven\u00e7\u00f5es foram feitas, inclusive aumentando bastante os recursos do servidor e mesmo assim os problemas persistiram.<\/p>\n<p>Antes de iniciar os trabalhos, alguns testes de <em>Benchmark<\/em> foram feitos para registro e compara\u00e7\u00e3o\u00a0 posterior. A principal ferramenta para isso foi o plugin <a href=\"https:\/\/moodle.org\/plugins\/report_benchmark\">Moodle Benchmark<\/a>, que \u00e9 capaz de testar a velocidade do servidor, processadores, discos, banco de dados e carregamento de p\u00e1gina. Neste caso, a ferramenta gera uma pontua\u00e7\u00e3o que, quanto menor, melhor.<\/p>\n<p>Tivemos a pontua\u00e7\u00e3o inicial de 947.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-117\" src=\"https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchInicio.png\" alt=\"\" width=\"362\" height=\"48\" srcset=\"https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchInicio.png 362w, https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchInicio-300x40.png 300w\" sizes=\"(max-width: 362px) 100vw, 362px\" \/><\/p>\n<h3>Solu\u00e7\u00e3o Proposta<\/h3>\n<p>A primeira proposta seria a separa\u00e7\u00e3o dos servi\u00e7os em dois servidores, um para a aplica\u00e7\u00e3o e outro para o banco de dados. Isso tornaria bem mais simples distribuir os recursos entre o sistema operacional e os servi\u00e7os executados em cada m\u00e1quina.<\/p>\n<p>Neste caso, a escola dispunha de uma \u00f3tima infraestrutura em data center, o que nos possibilitou criar um ambiente mais robusto e resiliente a falhas.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-106 aligncenter\" src=\"https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/CenarioII.jpg\" alt=\"Ambiente Moodle\" width=\"603\" height=\"513\" \/><\/p>\n<p>Na solu\u00e7\u00e3o, propus um ambiente com um Banco de Dados, um servidor NFS, um servidor Redis para cache e gerenciamento de sess\u00e3o e dois Web Servers, o que nos proporcionaria um ambiente escal\u00e1vel. Para o balanceamento das requisi\u00e7\u00f5es dos clientes, utilizamos uma solu\u00e7\u00e3o propriet\u00e1ria provida pelo Data Center mas poder\u00edamos facilmente montar nosso pr\u00f3prio balanceador com o NGINX, por exemplo. Abordarei a constru\u00e7\u00e3o de um balanceador desse tipo em outro post.<\/p>\n<p>A configura\u00e7\u00e3o dos servidores utilizados foi a seguinte:<\/p>\n\n<table id=\"tablepress-1\" class=\"tablepress tablepress-id-1\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">Web Servers (Apache) 2x<\/th><th class=\"column-2\">Banco da dados (Postgres)<\/th><th class=\"column-3\">Servidor de sess\u00e3o (Redis)<\/th><th class=\"column-4\">Servidor de arquivos (NFS)<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">120GB de disco<\/td><td class=\"column-2\">500GB de disco<\/td><td class=\"column-3\">120GB de disco<\/td><td class=\"column-4\">500GB de disco<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">16GB de mem\u00f3ria<\/td><td class=\"column-2\">64GB de mem\u00f3ria<\/td><td class=\"column-3\">2GB de mem\u00f3ria<\/td><td class=\"column-4\">8GB de mem\u00f3ria<br \/>\n<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">8 vCPUs<\/td><td class=\"column-2\">16 vCPUs<\/td><td class=\"column-3\">4 vCPUs<\/td><td class=\"column-4\">8 vCPUs<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-1 from cache -->\n<p>O sistema operacional utilizado foi o Debian 10. Al\u00e9m disso, o banco de dados foi migrado de MySQL para PostgreSQL porque este, em geral, oferece ao Moodle uma melhor performance quando possu\u00edmos tabelas muito grandes. Al\u00e9m disso, MySQL possui s\u00e9rios problemas quando o tr\u00e1fego \u00e9 grande e requer muitas escritas simult\u00e2neas. Um bom artigo que explica mais essas quest\u00f5es pode ser encontrado <a href=\"https:\/\/docs.moodle.org\/38\/en\/Arguments_in_favour_of_PostgreSQL\">aqui<\/a>.<\/p>\n<p>O servidor NFS \u00e9 a solu\u00e7\u00e3o mais simples para o compartilhamento do moodledata entre os servidores de aplica\u00e7\u00e3o. No entanto ele pode trazer muita dor de cabe\u00e7a se mal configurado ou utilizado para armazenamento de cache e gerenciamento de sess\u00e3o. Esse problema \u00e9 facilmente contornado adicionando um servidor Redis na nossa solu\u00e7\u00e3o. O Redis \u00e9 uma solu\u00e7\u00e3o bem simples, que consome poucos recursos e \u00e9 capaz de evitar overhead de banco de dados ou de discos.<\/p>\n<p>Ap\u00f3s todas as instala\u00e7\u00f5es e configura\u00e7\u00f5es, obtivemos uma pontua\u00e7\u00e3o de 125 no <a href=\"https:\/\/moodle.org\/plugins\/report_benchmark\">Benchmark Moodle<\/a>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-118\" src=\"https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchFim.png\" alt=\"\" width=\"342\" height=\"45\" srcset=\"https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchFim.png 342w, https:\/\/goon.tec.br\/blog\/wp-content\/uploads\/2020\/06\/BenchFim-300x39.png 300w\" sizes=\"(max-width: 342px) 100vw, 342px\" \/><\/p>\n<p>Nos pr\u00f3ximos posts abordaremos todas as instala\u00e7\u00f5es e configura\u00e7\u00f5es necess\u00e1rias para montarmos o ambiente descrito acima.<\/p>\n<ul>\n<li><a href=\"https:\/\/goon.tec.br\/blog\/index.php\/2020\/06\/09\/cluster-moodle-servidor-de-aplicacao\/\">Instala\u00e7\u00e3o dos servidores de aplica\u00e7\u00e3o Apache + PHP.<\/a><\/li>\n<li>Instala\u00e7\u00e3o do servidor de arquivos NFS.<\/li>\n<li>Instala\u00e7\u00e3o do servidor de banco de dados PostgreSQL.<\/li>\n<li>Instala\u00e7\u00e3o do servidor gerenciador de sess\u00e3o Redis.<\/li>\n<li>Backup e migra\u00e7\u00e3o do Moodle.<\/li>\n<\/ul>\n<h3>Contato<\/h3>\n<p><a href=\"https:\/\/goon.tec.br\/blog\/index.php\/contato\/\">Samuel Teixeira<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o No in\u00edcio de 2020, muitas escolas j\u00e1 disponibilizavam parte das suas disciplinas em formato EAD. Com o surto pand\u00eamico, muitas escolas tiveram que se adaptar rapidamente para minimizar os impactos na educa\u00e7\u00e3o de seus alunos, passando a prover cem por cento do conte\u00fado e avalia\u00e7\u00f5es, no formato a dist\u00e2ncia. Em abril, recebi o contato [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":109,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16,3,7],"tags":[33,37,29,31,12,36,30,32,34],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/105"}],"collection":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":17,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":153,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/posts\/105\/revisions\/153"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/media\/109"}],"wp:attachment":[{"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/goon.tec.br\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}