{"id":2614,"date":"2015-03-14T23:26:08","date_gmt":"2015-03-15T02:26:08","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=2614"},"modified":"2015-03-14T23:26:08","modified_gmt":"2015-03-15T02:26:08","slug":"cluster-para-servidores-web-com-debian-7-1-corosync-pacemaker-drbd","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=2614","title":{"rendered":"CLUSTER PARA SERVIDORES WEB COM DEBIAN 7.1 COROSYNC PACEMAKER DRBD"},"content":{"rendered":"<h1>INTRODU\u00c7\u00c3O<\/h1>\n<p>&nbsp;<\/p>\n<div>Os <em>Servidores Web<\/em> s\u00e3o componentes essenciais em uma rede, onde disponibilizam uma infinidade de servi\u00e7os, no entanto, s\u00e3o dispositivos eletr\u00f4nicos e est\u00e3o sujeitos a falhas, tanto f\u00edsicas quanto l\u00f3gicas.<\/p>\n<p>Os respons\u00e1veis pelo gerenciamento dos servidores utilizam uma gama de recursos para aumentar e garantir a disponibilidade de acesso aos servi\u00e7os disponibilizados, como Nobreaks, conex\u00f5es de rede redundantes, entre outras solu\u00e7\u00f5es, mas uma falha pode causar enormes preju\u00edzos e perda da credibilidade de qualquer setor.<\/p>\n<p>Os fabricantes dos equipamentos dedicam uma aten\u00e7\u00e3o especial no desenvolvimento de componentes com prote\u00e7\u00e3o e que possuam o m\u00ednimo de pontos cr\u00edticos de falhas. Desta forma, \u00e9 comum encontrarmos em servidores Web conex\u00f5es redundantes, que se alternam em caso de falhas de conex\u00e3o, sistemas que registram em dois ou mais discos o mesmo arquivo e fontes de energia que se alternam entre falhas el\u00e9tricas.<\/p>\n<p>A arquitetura da rede de computadores possui premissas de configura\u00e7\u00e3o para reduzir os pontos cr\u00edticos de falhas, componentes espec\u00edficos como Nobreaks e geradores \u00e0 combust\u00edvel, que visam garantir energia el\u00e9trica suficiente para manter operante os Servidores Web e componentes de rede necess\u00e1rios.<\/p>\n<p>Dominar as t\u00e9cnicas de toler\u00e2ncia de falhas torna-se essencial aos desenvolvedores e projetistas para disponibilizar um servi\u00e7o de qualidade e que possa se recuperar de forma eficiente. O custo-benef\u00edcio \u00e9 outro ponto importante que deve ser levado em considera\u00e7\u00e3o, pois o investimento em tecnologia de preven\u00e7\u00e3o de falhas \u00e9 muito bem visto e possui um mercado mundial em crescimento, onde alguns servi\u00e7os de larga escala est\u00e3o hospedados em mainframes de alto custo, mas garantem alta disponibilidade.<\/p>\n<p>O conceito de <em>Alta Disponibilidade<\/em> n\u00e3o se restringe apenas \u00e0 arquitetura da rede, mas sim a todo e qualquer tipo de falha de disponibilidade como parte f\u00edsica, servidores, discos e rede. Visando garantir Alta Disponibilidade a servi\u00e7os cr\u00edticos, surgem sistemas alternativos com hardware acess\u00edvel, chamado de <em>Cluster<\/em>, que \u00e9 um agregado de computadores interligados em rede que possui alta escalabilidade e custo m\u00ednimo.<\/p>\n<\/div>\n<p><!--more--><\/p>\n<h1>ARQUITETURA DO CLUSTER DE ALTA DISPONIBILIDADE<\/h1>\n<p>&nbsp;<\/p>\n<div>Um <em>Cluster<\/em> \u00e9 formado por um conjunto de computadores interligados atrav\u00e9s de uma rede, as m\u00e1quinas membros deste cluster s\u00e3o denominadas n\u00f3 ou node. \u00c9 importante utilizar uma infraestrutura de rede que facilite a inclus\u00e3o, altera\u00e7\u00e3o e exclus\u00e3o de m\u00e1quinas.<\/p>\n<p>Na maioria das vezes, o cluster \u00e9 formado de computadores convencionais e se apresenta de forma transparente ao usu\u00e1rio, como sendo um \u00fanico computador de grande porte, \u00e9 v\u00e1lido frisar que \u00e9 poss\u00edvel a utiliza\u00e7\u00e3o de m\u00e1quinas mais robustas para constru\u00e7\u00e3o de Clusters.<\/p>\n<p>N\u00e3o \u00e9 necess\u00e1rio que as m\u00e1quinas sejam id\u00eanticas, mas sim o Sistema Operacional, para que os softwares que gerenciam as trocas de mensagens e sincronismo dos dados funcionem de forma correta.<\/p>\n<p>De acordo com Zem (2005), existem hoje alguns tipos de cluster, mas alguns se destacam pela aplica\u00e7\u00e3o e custo benef\u00edcio:<\/p>\n<ul>\n<li><strong>Cluster de Alto Desempenho<\/strong>: denominado, tamb\u00e9m, de Alta Performance (High Performance Computing &#8211; HPC), sua caracter\u00edstica \u00e9 o grande volume de processamento de dados em computadores convencionais, que garante baixo custo na constru\u00e7\u00e3o, e com processamento na ordem de gigaflops. Os servidores deste cluster trabalham com a tecnologia de paralelismo, dividindo o processamento com as outras m\u00e1quinas, buscando a otimiza\u00e7\u00e3o e desempenho de um supercomputador.<\/li>\n<li><strong>Cluster de Alta Disponibilidade<\/strong>: (High Availability &#8211; HA) s\u00e3o caracterizados por se manterem em pleno funcionamento por um longo per\u00edodo de tempo, utilizando redund\u00e2ncia para manter um servi\u00e7o ativo e se proteger de falhas, geralmente s\u00e3o computadores convencionais que disponibilizam o mesmo recurso em todas as m\u00e1quinas da rede, configuradas com prioridades diferentes, onde existe um servidor ativo e os outros ociosos.<\/li>\n<li><strong>Cluster de Balanceamento de Carga<\/strong>: (Horizontal Scaling &#8211; HS) s\u00e3o caracterizados por dividirem, de forma equilibrada, as tarefas entre os membros do cluster, onde cada n\u00f3 atenda a uma requisi\u00e7\u00e3o e n\u00e3o, necessariamente, que divida uma tarefa com outras m\u00e1quinas.<\/li>\n<\/ul>\n<p>\u00c9 importante salientar, que \u00e9 poss\u00edvel a combina\u00e7\u00e3o de mais de uma metodologia de constru\u00e7\u00e3o de clusters, onde uma implementa\u00e7\u00e3o de Alta Disponibilidade para garantir acesso aos servi\u00e7os de vendas online, possa ser incrementada com a utiliza\u00e7\u00e3o de um cluster de Balanceamento de Carga para atender o aumento nos acessos ao servi\u00e7o.<\/p>\n<p>As caracter\u00edsticas marcantes dos clusters s\u00e3o a facilidade de gerenciamento dos n\u00f3s, onde podemos adicionar, dar manuten\u00e7\u00e3o e remover um n\u00f3 do cluster sem que afete seu funcionamento, recupera\u00e7\u00e3o de falhas de forma otimizada. Podemos obter resultados t\u00e3o satisfat\u00f3rios no uso de um cluster quanto em servidores sofisticados com um custo muito menor. A implementa\u00e7\u00e3o pode ser utilizada para aplica\u00e7\u00f5es sofisticadas e, tamb\u00e9m, para aplica\u00e7\u00f5es dom\u00e9sticas.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h1>OS SOFTWARES COROSYNC, PACEMAKER E DISTRIBUTED REPLICATED BLOCK DEVICE (DRBD)<\/h1>\n<p>&nbsp;<\/p>\n<div>Os softwares livres <em>Corosync Cluster Engine<\/em>, <em>Pacemaker<\/em> e <em>DRBD<\/em> s\u00e3o instalados e configurados no Sistema Operacional <em>Debian 7.1<\/em> para criar e gerenciar o cluster de forma adequada.<\/p>\n<p>Explicado por Dake (2008), o Corosync Cluster Engine foi formalizado na confer\u00eancia Ottawa <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a> Symposium e foi uma redu\u00e7\u00e3o do OpenAIS, sendo um sistema de comunica\u00e7\u00e3o de grupo para a implementa\u00e7\u00e3o de alta disponibilidade dentro de servidores Linux.<\/p>\n<p>Grupo de processos utilizam um modelo de comunica\u00e7\u00e3o fechado, com sincronia, tendo a capacidade de recuperar e receber notifica\u00e7\u00f5es de altera\u00e7\u00e3o de informa\u00e7\u00f5es de n\u00f3s conectados.<\/p>\n<p>A API (Application Programming Interface) interna do Corosync fornece os servi\u00e7os atrav\u00e9s de uma implementa\u00e7\u00e3o de um Totem &#8211; Single Ring Ordering and Membership Protocol &#8211; fornecendo o modelo virtual para troca de mensagens e membros do cluster, que confiabiliza a cria\u00e7\u00e3o de r\u00e9plicas de estado, rein\u00edcio da aplica\u00e7\u00e3o em caso de falhas e sistema de quorum, que notifica sempre que a aplica\u00e7\u00e3o ou m\u00e1quina venha a falhar.<\/p>\n<p>Assim, o Corosync \u00e9 considerado a evolu\u00e7\u00e3o do Software Heartbeat, que possui recursos adicionais e mais suporte. Este software instalado e configurado cria o cluster preparado para ter v\u00e1rias funcionalidades, utiliza o tunelamento SSH para seu funcionamento e n\u00e3o mais o comando ping do Heartbeat.<\/p>\n<p>O software Pacemaker, segundo Haas (2012), \u00e9 um gerenciador de recursos de Cluster ou Cluster Resource Manager (CRM), sua fun\u00e7\u00e3o \u00e9 oferecer uma interface para que o administrador possa gerenciar o Cluster. Possui muitas funcionalidades como capacidade de replicar as informa\u00e7\u00f5es do Cluster entre os n\u00f3s de maneira transparente e eficiente.<\/p>\n<p>Depois de iniciado, o Pacemaker elege um n\u00f3 coordenador designado entre os n\u00f3s dispon\u00edveis e inicia as opera\u00e7\u00f5es de cluster, desta forma, todas as tarefas de configura\u00e7\u00e3o precisam ser executadas em um n\u00f3 somente e j\u00e1 s\u00e3o replicadas para todo o cluster automaticamente.<\/p>\n<p>Atrav\u00e9s da linha de comando do Pacemaker, \u00e9 poss\u00edvel criar tipos b\u00e1sicos e avan\u00e7ados de regras, n\u00f3s de failover (\u00e9 a capacidade de determinado servi\u00e7o ser migrado automaticamente para um outro servidor), failback (\u00e9 o processo de restaura\u00e7\u00e3o de um servi\u00e7o que se encontra em um estado de failover), monitoramento, migra\u00e7\u00e3o e muitos outros recursos de Open Cluster Framework (OCF).<\/p>\n<p>As configura\u00e7\u00f5es do Pacamaker s\u00e3o armazenadas em um arquivo XML, que \u00e9 excelente para as m\u00e1quinas e terr\u00edvel para humanos, assim foram desenvolvidas algumas interfaces amig\u00e1veis para configura\u00e7\u00e3o adequada ocultando o XML.<\/p>\n<p>O Software LCMC &#8211; <em>Linux Cluster Management<\/em> Console \u00e9 uma interface gr\u00e1fica constru\u00edda em JAVA, que aborda uma forma nova de representar o estado e rela\u00e7\u00f5es entre os servi\u00e7os de um cluster. Utiliza SSH para instalar, configurar e gerenciar os clusters a partir de um terminal que contenha a interface gr\u00e1fica instalada.<\/p>\n<p><em>Distributed Replicated Block Device (DRBD)<\/em> segundo Pla (2006), nada mais \u00e9 que um m\u00f3dulo para espelhamento de armazenamento distribu\u00eddos, geralmente utilizado em clusters de alta disponibilidade &#8211; HA, isto \u00e9 feito espelhando as parti\u00e7\u00f5es do disco r\u00edgido via rede. O DRBD funciona como um sistema RAID baseado em rede.<\/p>\n<p>O DRBD cria em todos os n\u00f3s, um dispositivo virtual inacess\u00edvel diretamente e toda a escrita \u00e9 realizada no nodo prim\u00e1rio, que ir\u00e1 transferir os dados para a parti\u00e7\u00e3o e propag\u00e1-los para os restantes dos n\u00f3s secund\u00e1rios.<\/p>\n<p>Se o n\u00f3 prim\u00e1rio falhar, \u00e9 realizada uma troca do n\u00f3 secund\u00e1rio para prim\u00e1rio e os dados s\u00e3o acessados normalmente e replicados aos outros n\u00f3s, mas se o n\u00f3 que falhou retornar, o DRBD, mediante as configura\u00e7\u00f5es, devolver\u00e1 ou n\u00e3o o modo prim\u00e1rio ao n\u00f3 original, que ficar\u00e1 como secund\u00e1rio at\u00e9 o servi\u00e7o ser encerrado nessa m\u00e1quina.<\/p>\n<p>Vale lembrar que DRBD n\u00e3o trabalha ao n\u00edvel do sistema de arquivos, mas sim ao n\u00edvel de blocos do disco r\u00edgido.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h1>IMPLEMENTA\u00c7\u00c3O<\/h1>\n<p>&nbsp;<\/p>\n<div>A implementa\u00e7\u00e3o do <em>cluster<\/em> foi realizada inicialmente em m\u00e1quinas virtuais, para testes, visando f\u00e1cil locomo\u00e7\u00e3o, ambiente f\u00edsico reduzido e clonagem dos n\u00f3s \u00e9 feita de forma r\u00e1pida e confi\u00e1vel.<\/p>\n<p>A m\u00e1quina f\u00edsica hospedeira das virtuais utiliza processador Intel i3, com 4GB de mem\u00f3ria RAM e HD de 1TB, cada m\u00e1quina virtual possui 512MB de mem\u00f3ria RAM, HD de 8GB e 02 placas de rede, salientando que na instala\u00e7\u00e3o do <em>Debian 7.1<\/em> utilizaremos uma parti\u00e7\u00e3o do HD para alocar o diret\u00f3rio <em>\/var<\/em>, a qual ser\u00e1 replicada no final das configura\u00e7\u00f5es.<\/p>\n<p>As configura\u00e7\u00f5es das m\u00e1quinas s\u00e3o mostradas abaixo:<\/p>\n<ul>\n<li>M\u00e1quina 01: Debian 7.1, hostname no01, IP eth0 10.0.2.15\/24 (recebido via DHCP da m\u00e1quina hospedeira que faz o NAT para acesso a internet) IP eth1192.168.0.1\/24 (rede interna), dom\u00ednio: dominio.com.br.<\/li>\n<li>M\u00e1quina 02: Debian 7.1, hostname no02, IP eth0 10.0.2.15\/24 (recebido via DHCP da m\u00e1quina hospedeira que faz o NAT para acesso a internet) IP eth1192.168.0.2\/24 (rede interna), dom\u00ednio: dominio.com.br.<\/li>\n<li>M\u00e1quina 03: Debian 7.1, hostname no03, IP eth0 10.0.2.15\/24 (recebido via DHCP da m\u00e1quina hospedeira que faz o NAT para acesso a internet) IP eth1192.168.0.3\/24 (rede interna), dom\u00ednio: dominio.com.br.<\/li>\n<\/ul>\n<p>Os ajustes realizados nos n\u00f3s foram feitos em apenas um n\u00f3 e copiados via SSH para os outros n\u00f3s, garantindo a n\u00e3o ocorr\u00eancia erros de configura\u00e7\u00f5es diferentes. Atualiza\u00e7\u00e3o de reposit\u00f3rios de pacotes no arquivos &#8220;sources.list&#8221; e atualiza\u00e7\u00e3o com o comando:<\/p>\n<p><strong># aptitude update &amp;&amp; aptitude -y dist-upgrade<\/strong><\/p>\n<p>Ajuste no arquivo <em>\/etc\/hosts<\/em>, onde foram acrescentados os n\u00f3s do cluster:<\/p>\n<div class=\"codigo\">192.168.0.1\u00a0\u00a0 no01.dominio.com.br\u00a0\u00a0 no01<br \/>\n192.168.0.2\u00a0\u00a0 no02.dominio.com.br\u00a0\u00a0 no02<br \/>\n192.168.0.3\u00a0\u00a0 no03.dominio.com.br\u00a0\u00a0 no03<\/div>\n<p>Assim, passamos para a instala\u00e7\u00e3o dos pacotes essenciais ao cluster:<\/p>\n<p><strong># aptitude install -y corosync pacemaker ssh openssh-server<\/strong><\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h1>CONFIGURA\u00c7\u00d5ES<\/h1>\n<p>&nbsp;<\/p>\n<div>\n<h1>SSH COM TROCA DE CHAVES<\/h1>\n<p>Com o servidor SSH instalado, vamos gerar as chaves de SSH, em todos os n\u00f3s, para efetuarmos a conex\u00e3o via troca de chaves:<\/p>\n<p><strong># ssh-keygen -t rsa<\/strong><\/p>\n<p>Agora temos que copiar as chaves do no01 para os n\u00f3s no02 e no03, e assim por diante, at\u00e9 que todos os n\u00f3s possuam todas as chaves dos outros n\u00f3s. Na m\u00e1quina no01, podemos executar o seguinte comando:<\/p>\n<p><strong># ssh-copy-id 192.168.0.2<\/strong><br \/>\n<strong># ssh-copy-id 192.168.0.3<\/strong><\/p>\n<p>Nas demais m\u00e1quinas, devemos executar o comando trocando os n\u00fameros dos endere\u00e7os IPs dos respectivos n\u00f3s. Desta forma, j\u00e1 temos comunica\u00e7\u00e3o SSH entre todas os n\u00f3s do cluster.<\/p>\n<h1>CONFIGURA\u00c7\u00c3O DO COROSYNC<\/h1>\n<p>Ainda na m\u00e1quina no01, iremos gerar a chave de autentica\u00e7\u00e3o para o Corosync com o seguinte comando:<\/p>\n<p><strong># corosync -keygen<\/strong><\/p>\n<p>Assim que geradas as chaves na m\u00e1quina no01 para o Corosync, iremos copi\u00e1-las para as m\u00e1quinas no02 e no03 com o comando:<\/p>\n<p><strong># scp \/etc\/corosync\/authkey 192.168.0.2:\/etc\/corosync\/authkey<\/strong><br \/>\n<strong># scp \/etc\/corosync\/authkey 192.168.0.3:\/etc\/corosync\/authkey<\/strong><\/p>\n<p>Iremos configurar o Corosync para que fique ativo na inicializa\u00e7\u00e3o:<\/p>\n<p><strong># sed -i &#8216;s\/START=no\/START=yes\/g&#8217; \/etc\/default\/corosync<\/strong><\/p>\n<p>Fazer backup do arquivo de configura\u00e7\u00e3o:<\/p>\n<p><strong># cp -a \/etc\/corosync\/corosync.conf{,.bkp}<\/strong><\/p>\n<p>Agora faremos a edi\u00e7\u00e3o do arquivo de configura\u00e7\u00e3o <em>\/etc\/corosync\/corosync.conf<\/em> utilizando o editor nano, aproveitaremos os dados j\u00e1 inseridos no arquivo, alterando somente onde precisamos para nossa configura\u00e7\u00e3o:<\/p>\n<p><strong># nano \/etc\/corosync\/corosync.conf<\/strong><\/p>\n<div class=\"codigo\">bindnetaddr: 192.168.0.0<br \/>\nto_syslog: no<\/div>\n<p>Vamos copiar o arquivo alterado para o no02 e para o no03:<\/p>\n<p><strong># scp \/etc\/corosync\/corosync.conf 192.168.0.2:\/etc\/corosync\/<\/strong><br \/>\n<strong># scp \/etc\/corosync\/corosync.conf 192.168.0.3:\/etc\/corosync\/<\/strong><\/p>\n<p>Vamos reiniciar o corosync em todos os n\u00f3s:<\/p>\n<p><strong># service corosync restart<\/strong><\/p>\n<h1>CONFIGURA\u00c7\u00c3O DO PACEMAKER<\/h1>\n<p>Com a configura\u00e7\u00e3o do Corosync terminada e o servi\u00e7o iniciado corretamente, j\u00e1 podemos utilizar o Pacemaker para disponibilizar os servi\u00e7os do cluster, agora vamos testar se o cluster est\u00e1 funcionando.<\/p>\n<p>Para o Pacemaker ser configurado, utilizaremos a linha de comando <strong>crm<\/strong>.<\/p>\n<p><strong># crm_mon &#8211;one-shot -V<\/strong><\/p>\n<p>Desta forma, teremos o retorno dos n\u00f3s ativos: <samp>Online [no01 no02 no03]<\/samp><\/p>\n<p>Agora no no01, vamos desabilitar o stonith para que ele n\u00e3o fique gerando erros, com o comando:<\/p>\n<p><strong># crm configure property stonith-enabled=false<\/strong><\/p>\n<p>Podemos verificar se nosso cluster n\u00e3o tem nenhum problema da seguinte forma:<\/p>\n<p><strong># crm_verify -L<\/strong><\/p>\n<p>Caso n\u00e3o encontre erros, ele n\u00e3o retorna nada.<\/p>\n<p>Agora vamos desabilitar o quorum para n\u00e3o recebermos erros durante a configura\u00e7\u00e3o dos recursos, podemos executar em algum dos n\u00f3s pois o cluster j\u00e1 est\u00e1 ativo e funcionando, pois as configura\u00e7\u00f5es ser\u00e3o replicadas para os outros n\u00f3s:<\/p>\n<p><strong># crm configure property no-quorum-policy=ignore<\/strong><\/p>\n<p>Para ser poss\u00edvel a movimenta\u00e7\u00e3o de servi\u00e7os entre os n\u00f3s do cluster, sem a necessidade de alterarmos o endere\u00e7o IP do servi\u00e7o, o endere\u00e7o IP associado ao servi\u00e7o dever\u00e1 ser configurado como um recurso do cluster para que ele possa ser movido livremente entre os n\u00f3s do cluster junto com o servi\u00e7o.<\/p>\n<p>Iremos criar um recurso do tipo endere\u00e7o IP 192.168.0.100 usando o RA IPaddr2, este IP ser\u00e1 o endere\u00e7o do Cluster, isto \u00e9, poderemos acessar o cluster e seus servi\u00e7os atrav\u00e9s desse endere\u00e7o, para configurar este recurso utilizaremos o comando:<\/p>\n<p><strong># crm configure primitive IPdoApache ocf:heartbeat:IPaddr2 params ip=&#8221;192.168.0.100&#8243; cidr_netmask=&#8221;24&#8243; nic=eth1 op monitor interval=10s<\/strong><\/p>\n<p>Para verificar o servi\u00e7o, utilizaremos:<\/p>\n<p><strong># crm_mon -1<\/strong><\/p>\n<p>Teremos um retorno do tipo:<\/p>\n<p><samp>IPdoApache (ocf::heartbeat:IPaddr2): Started no01 <\/samp><\/p>\n<p>Iremos definir em qual servidor o recurso deve ser alocado, com isso o Pacemaker j\u00e1 fez isso automaticamente elegendo um dos n\u00f3s como padr\u00e3o. Consultaremos o endere\u00e7o IP configurado no servidor no01:<\/p>\n<p><strong># ip addr show dev eth1<\/strong><\/p>\n<p>Note que no retorno, temos a configura\u00e7\u00e3o da interface eth1 com IP 192.168.0.1\/24 e 192.168.0.100\/24 como configura\u00e7\u00e3o secund\u00e1ria.<\/p>\n<p><samp>inet 192.168.0.1\/24 brd 192.168.0.255 scope global eth1<br \/>\ninet 192.168.0.100\/24 brd 192.168.0.255 scope global secondary eth1 <\/samp><\/p>\n<p>Iremos fazer os testes desligando o servidor no01, onde est\u00e1 o nosso recurso alocado, com o comando:<\/p>\n<p><strong># shutdown -h now<\/strong><\/p>\n<p>Testando a configura\u00e7\u00e3o no no02:<\/p>\n<p><strong># crm_mon -1<\/strong><\/p>\n<p>Teremos os seguintes retornos:<\/p>\n<p><samp>2 Nodes configured, 2 expected votes<br \/>\n1 Resources configured.<br \/>\n============<br \/>\nOnline: [ no02 no03]<br \/>\nOFFLINE: [ no01 ]<br \/>\nIPdoApache (ocf::heartbeat:IPaddr2): Started no02 <\/samp><\/p>\n<p>Neste momento, o Pacemaker j\u00e1 notou que a conex\u00e3o com o no01 foi perdida por algum motivo e j\u00e1 passou o servi\u00e7o para o no02. Lembrando que o no02 assumiu o servi\u00e7o por decis\u00e3o do Pacemaker e poderia ser o no03, mas isso podemos definir o n\u00edvel de prioridade dos n\u00f3s.<\/p>\n<p>Mas antes, vamos religar a m\u00e1quina do no01 e refazer o teste de comportamento:<\/p>\n<p><strong># crm_mon -1<\/strong><br \/>\n<samp>2 Nodes configured, 2 expected votes<br \/>\n1 Resources configured.<br \/>\nOnline: [ no01 no02 no03]<br \/>\nIPdoApache (ocf::heartbeat:IPaddr2): Started no02 <\/samp><\/p>\n<p>Note que o servi\u00e7o continua alocado no no02 e o Pacemaker poderia voltar o servi\u00e7o para o no01, no entanto, as prioridades de servi\u00e7o est\u00e3o no mesmo n\u00edvel, ent\u00e3o s\u00f3 voltar\u00e1 ao no01 quando o servi\u00e7o for desalocado do no02 por desligamento ou parada do servi\u00e7o.<\/p>\n<h1>CONFIGURA\u00c7\u00c3O DE RECURSO PARA MONITORAMENTO<\/h1>\n<p>Vamos come\u00e7ar o monitoramento com a instala\u00e7\u00e3o do Apache em todos os n\u00f3s do cluster, com o seguinte comando:<\/p>\n<p><strong># aptitude -y isntall apache2<\/strong><\/p>\n<p>Depois do Apache instalado, as requisi\u00e7\u00f5es de protocolo HTTP via navegador de internet j\u00e1 funcionam com a resposta de &#8220;It works!&#8221; na tela do navegador. Antes de fazer os testes, vamos alterar o teor do arquivo &#8220;index.html&#8221; que fica no local <em>\/var\/www<\/em> de cada n\u00f3 do cluster.<\/p>\n<p>Para isso, usaremos o editor nano:<\/p>\n<p><strong># nano \/var\/www\/index.html<\/strong><\/p>\n<p>O conte\u00fado do arquivo deve ser configurado para a seguinte forma, apenas trocando &#8220;It works&#8221; para &#8220;No 01&#8221; e nos outros n\u00f3s, o n\u00famero espec\u00edfico de cada n\u00f3:<\/p>\n<div class=\"codigo\">&lt;html&gt;<br \/>\n&lt;body&gt;<br \/>\n&lt;h1&gt;No 01&lt;\/h1&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/div>\n<p>Para fins de testes, podemos ter em nossa rede, um terminal com qualquer Sistema Operacional que contenha interface gr\u00e1fica para facilitar as opera\u00e7\u00f5es. Assim podemos utilizar o navegador e acessar os n\u00f3s digitando <strong>http:\/\/192.168.0.1<\/strong> para o no01,<strong>http:\/\/192.168.0.2<\/strong> para o no02, <strong>http:\/\/192.168.0.3<\/strong> para o no03 e sucessivamente para mais n\u00f3s, caso existam.<\/p>\n<p>Com estas altera\u00e7\u00f5es, teremos visivelmente as respostas de requisi\u00e7\u00e3o de cada servidor Apache, e podemos identificar qual \u00e9 o servidor ativo no momento. Agora vamos configurar um recurso do Cluster para monitorar o Apache2:<\/p>\n<p><strong># crm configure primitive RecursoApache lsb:apache2<\/strong><\/p>\n<p>Consultando, outra vez os recursos do Cluster:<\/p>\n<p><strong># crm_mon -1<\/strong><br \/>\n<samp>Online: [ nodo1 nodo2 no03]<br \/>\nIPdoApache (ocf::heartbeat:IPaddr2): Started no02<br \/>\nRecursoApache (lsb:apache2): Started no01 <\/samp><\/p>\n<p>Percebam que os recursos est\u00e3o no servidor no02 e no01, isto \u00e9, separados, o recurso de monitoramento do Apache2 est\u00e1 iniciado em no01 e monitoramento do IP do cluster em no02, assim para facilitar a movimenta\u00e7\u00e3o e o gerenciamento de recursos associados a um servi\u00e7o, podemos agrupar todos esses recursos em um \u00fanico grupo, onde podemos definir o local de prioridade alta, m\u00e9dia e baixa, sendo que todos os recursos ser\u00e3o movidos para a localiza\u00e7\u00e3o que desejamos e n\u00e3o mais decidido pelo Pacemaker.<\/p>\n<p>Vamos utilizar o comando:<\/p>\n<p><strong># crm configure group GrupodoServidor RecursoApache IPdoApache<\/strong><\/p>\n<p>Novamente, vamos consultar os recursos:<\/p>\n<p><strong># crm_mon -1<\/strong><\/p>\n<p>Teremos o retorno da seguinte forma:<\/p>\n<p><samp>Resource Group: GrupodoServidor<br \/>\nRecursoApache (lsb:apache2): Started no01<br \/>\nIPdoApache (ocf::heartbeat:IPaddr2): Started no01 <\/samp><\/p>\n<p>Podemos perceber que os recursos est\u00e3o agora alocados somente no servidor no01 e o grupo se encarrega de mant\u00ea-los unidos, assim podemos definir a prioridade dos n\u00f3s do cluster. Neste modelo de configura\u00e7\u00e3o n\u00e3o havia necessidade de definir prioridades de n\u00f3s no cluster, pois todas as m\u00e1quinas s\u00e3o iguais em mem\u00f3ria RAM, CPU e espa\u00e7o em disco, mas em m\u00e1quinas reais nem sempre conseguiremos montar um Cluster com m\u00e1quinas id\u00eanticas, pois alguma que seja adicionada posteriormente, pode ter melhorias e evolu\u00e7\u00f5es de hardware.<\/p>\n<p>Um exemplo seria um cluster formado com tr\u00eas n\u00f3s de computadores convencionais, onde cada um deles \u00e9 diferente do outro, sendo o n\u00f3 01 um computador de \u00faltima gera\u00e7\u00e3o com mem\u00f3ria RAM e CPU muito r\u00e1pidos, n\u00f3 02 um computador intermedi\u00e1rio com a metade dos recursos de hardware do n\u00f3 01 e o n\u00f3 03 um computador bem simples com a metade dos recursos de hardware do n\u00f3 02.<\/p>\n<p>Assim ficaria interessante se manipul\u00e1ssemos os recursos do cluster para que se aloquem no n\u00f3 que possua o melhor hardware, fazendo que as requisi\u00e7\u00f5es sejam resolvidas mais r\u00e1pidas, como n\u00f3 01 &#8211; 100, n\u00f3 02 &#8211; 80 e n\u00f3 03 &#8211; 60, sendo que a prioridade 100 \u00e9 mais alta e 0 a mais baixa.<\/p>\n<p>Caso o n\u00f3 01 venha a falhar, caracterizando failover, quem assumiria seria o n\u00f3 02 (intermedi\u00e1rio em hardware), somente se o n\u00f3 02 falhar \u00e9 que o n\u00f3 03 seria ativado, ainda que o hardware seja bem obsoleto, as requisi\u00e7\u00f5es seriam resolvidas e ter\u00edamos a caracteriza\u00e7\u00e3o do Cluster HA (alta disponibilidade).<\/p>\n<p>Nas falhas dos n\u00f3s 01 e 02, que puderam ser recuperadas e o servidor voltou a ativa o Pacemaker percebe que o n\u00f3 01 retornou ao cluster e analisa a prioridade do n\u00f3 01, sendo a prioridade do n\u00f3 01 -100 e a do n\u00f3 03 &#8211; 60 a aloca\u00e7\u00e3o de recurso \u00e9 transferida de volta para o n\u00f3 01 caracterizando failback.<\/p>\n<p>Assim, para configurarmos as prioridades, utilizaremos o comando colocando ap\u00f3s o grupo de recursos a prioridade e o n\u00f3:<\/p>\n<p><strong># crm configure location HTTP_Server GrupodoServidor 100: no02<\/strong><\/p>\n<p>Podemos consultar a configura\u00e7\u00e3o do Pacemaker utilizando:<\/p>\n<p><strong># crm configure show<\/strong><\/p>\n<p>E veremos que: <samp>location HTTP_Server GrupodoServidor 100: no02<\/samp><\/p>\n<h1>TESTE DE COROSYNC E PACEMAKER<\/h1>\n<p>Com todas as configura\u00e7\u00f5es realizadas, o Cluster HA est\u00e1 dispon\u00edvel e configurado, os recursos do cluster j\u00e1 est\u00e3o dispon\u00edveis e seu endere\u00e7o \u00e9 <strong>http:\/\/192.168.0.100<\/strong> e podemos acess\u00e1-lo no terminal apenas digitando no navegador de internet o endere\u00e7o acima.<\/p>\n<p>Podemos perceber que na requisi\u00e7\u00e3o de protocolo HTTP, aparece no navegador a configura\u00e7\u00e3o que fizemos no arquivo<em>\/var\/www\/index.html<\/em>, que \u00e9 o arquivo padr\u00e3o do Apache2, neste caso, \u00e9 mostrado no navegador &#8220;No 02&#8221;, pois os servi\u00e7os est\u00e3o alocados no servidor no02.<\/p>\n<p>Agora podemos testar desligando o no02 ou interrompendo seu recurso:<\/p>\n<ul>\n<li>Para desligar, usamos: <strong>shutdown -s now<\/strong><\/li>\n<li>Para parar o recurso, usamos: <strong>crm node standby nodo2<\/strong><\/li>\n<\/ul>\n<p>Assim que um dos dois comandos sejam realizados, podemos atualizar a p\u00e1gina no navegador do terminal e veremos que o servi\u00e7o continua ativo, embora o servidor no02 esteja com falha, mas podemos notar que a p\u00e1gina mudou e agora mostra &#8220;No 01&#8221;, ao religar o servidor no02 o servi\u00e7o retorna ao n\u00f3 com maior prioridade, neste caso no02, como j\u00e1 mencionado.<\/p>\n<p>Os recursos do Cluster podem ser manipulados, onde \u00e9 poss\u00edvel parar o recurso:<\/p>\n<p><strong># crm resource stop NomedoRecurso<\/strong><\/p>\n<p>Trocando <strong>stop<\/strong> por <strong>start<\/strong>, faz com que o recurso seja iniciado. Para remover um recurso, utilizamos:<\/p>\n<p><strong># crm configure delete NomedoRecurso<\/strong><\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h1>CONFIGURA\u00c7\u00c3O DO DRBD<\/h1>\n<p>&nbsp;<\/p>\n<div>Podemos notar que o <em>Cluster<\/em> est\u00e1 ativo e em funcionamento, no entanto, nas requisi\u00e7\u00f5es de acesso est\u00e3o mudando apenas o recurso alocado em um n\u00f3 para outro n\u00f3 e os arquivos acessados s\u00e3o diferentes como demonstrado no teste acima. A partir da\u00ed, utilizaremos o<em>DRBD<\/em>, que \u00e9 um replicador de blocos, que faz a replica\u00e7\u00e3o dos dados para outro n\u00f3.<\/p>\n<p>Como o HD tem uma parti\u00e7\u00e3o exclusiva para replica\u00e7\u00e3o, o qual servir\u00e1 para alocar o diret\u00f3rio <em>\/var<\/em>, podemos fazer a configura\u00e7\u00e3o de replica\u00e7\u00e3o e depois alterar de lugar o diret\u00f3rio <em>\/var<\/em>, ou alterar o arquivo do Apache2 para buscar os arquivos html na nossa parti\u00e7\u00e3o replicada, primeiramente, instalar o DRBD em cada um dos n\u00f3s, farei no n\u00f3 no01:<\/p>\n<p><strong># aptitude install drbd8-utils<\/strong><\/p>\n<p>Depois de instalado, vamos carregar os m\u00f3dulos:<\/p>\n<p><strong># modprobe cn<\/strong><br \/>\n<strong># modprobe drbd<\/strong><\/p>\n<p>Configurar o DRBD e inserir o seguinte par\u00e2metro:<\/p>\n<p><strong># nano \/etc\/drbd.d\/global_common.conf<\/strong><\/p>\n<p>Altere a seguinte linha:<\/p>\n<div class=\"codigo\">usage-count no;<\/div>\n<p>Alterar o arquivo <em>\/etc\/drbd.d\/ro.res<\/em>:<\/p>\n<p><strong># nano \/etc\/drbd.d\/r0.res<\/strong><\/p>\n<p>A altera\u00e7\u00e3o pretendida neste arquivo \u00e9 configurar as parti\u00e7\u00f5es do HD onde est\u00e3o o diret\u00f3rio <em>\/var<\/em>, que no meu caso, \u00e9 <em>\/dev\/hdb1<\/em>:<\/p>\n<div class=\"codigo\">on hachi\u00a0{<br \/>\ndevice\u00a0\u00a0 \/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0 \/dev\/hdb1;<br \/>\naddress\u00a0\u00a0192.168.0.1:7793;<br \/>\nmeta-disk internal;<br \/>\n}<\/p>\n<p>on narnia\u00a0{<br \/>\ndevice\u00a0\u00a0\u00a0\u00a0\/dev\/drbd0;<br \/>\ndisk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/dev\/hdb1;<br \/>\naddress\u00a0\u00a0 192.168.0.1:7793;<br \/>\nmeta-disk internal;<br \/>\n}<\/p><\/div>\n<p>Zerando as parti\u00e7\u00f5es dos n\u00f3s do cluster:<\/p>\n<p><strong># dd if=\/dev\/zero of=\/dev\/hdb1 bs=1M count=128<\/strong><\/p>\n<p>Inicializando os recursos executando em todos os n\u00f3s:<\/p>\n<p><strong># drbdadm create-md r0<\/strong><br \/>\n<strong># modprobe drbd<\/strong><br \/>\n<strong># drbdadm up r0<\/strong><\/p>\n<p>Sincronizando pela primeira vez, fazendo apenas no n\u00f3 no01:<\/p>\n<p><strong># drbdadm &#8212; &#8211;overwrite-data-of-peer primary r0<\/strong><\/p>\n<p>Aguardar a finaliza\u00e7\u00e3o do sincronismo, o tempo depende do tamanho do recurso e velocidade da conex\u00e3o entre os n\u00f3. Iniciando o servi\u00e7o do DRBD:<\/p>\n<p><strong># service drbd restart<\/strong><\/p>\n<p>Formatando o dispositivos criados nos passos anteriores, fazendo apenas no primeiro n\u00f3:<\/p>\n<p><strong># mkfs.ext4 \/dev\/drbd0<\/strong><\/p>\n<p>Nome do diret\u00f3rio opcional, caso queira configurar o Apache2 para buscar os arquivos aqui:<\/p>\n<p><strong># mkdir \/dados<\/strong><\/p>\n<p>Montando o dispositivo:<\/p>\n<p><strong># mount -t ext4 \/dev\/drbd0 \/dados<\/strong><\/p>\n<h1>TESTES COM DRBD<\/h1>\n<p>Vamos criar um arquivo no diret\u00f3rio onde foi montado o drbd:<\/p>\n<p><strong># nano \/dados\/teste<\/strong><\/p>\n<p>Vamos desmontar o dispositivo, lembre-se que \u00e9 necess\u00e1rio sair do dispositivo:<\/p>\n<p><strong># umount \/dados<\/strong><\/p>\n<p>Mudando o n\u00f3 prim\u00e1rio para secund\u00e1rio:<\/p>\n<p><strong># drbdadm secondary all<\/strong><\/p>\n<p>Mudando outro n\u00f3 do Cluster em prim\u00e1rio, neste caso, n\u00f3 no02 ou no03:<\/p>\n<p><strong># drbdadm primary all<\/strong><\/p>\n<p>Montando o dispositivo no n\u00f3 que se tornou prim\u00e1rio:<\/p>\n<p><strong># mount -t ext4 \/dev\/drbd0 \/dados<\/strong><\/p>\n<p>Assim o arquivo foi replicado com sucesso.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h1>CONCLUS\u00c3O<\/h1>\n<p>&nbsp;<\/p>\n<div>O emprego de um <em>Cluster de Alta Disponibilidade (HA)<\/em> para Servidores Web \u00e9 uma das solu\u00e7\u00f5es que tem a melhor rela\u00e7\u00e3o custo-benef\u00edcio, pois s\u00e3o utilizados computadores convencionais, que juntos conseguem atingir os n\u00edveis exigidos para classifica\u00e7\u00e3o de Alta Disponibilidade, chegando a 99,99% de disponibilidade por ano.<\/p>\n<p>A vantagem da utiliza\u00e7\u00e3o \u00e9 a manuten\u00e7\u00e3o programada, que mant\u00e9m o recurso dispon\u00edvel mesmo com o desligamento de algumas m\u00e1quinas e a inclus\u00e3o de novos n\u00f3s no Cluster \u00e9 feita de forma simples.<\/p>\n<p>Assim, esta estrutura de servidores em rede (Cluster) pode ser empregada como Servidores, como exemplo, do Instituto Federal de Educa\u00e7\u00e3o, Ci\u00eancia e Tecnologia do Sul de Minas Gerais &#8211; Campus Muzambinho &#8211; MG, em todos os servi\u00e7os do dom\u00ednio muz.ifsuldeminas.edu.br (Servidores Apache, MySQL, Samba, entre outros).<\/p>\n<p>Mas devemos ter o cuidado para implantarmos em uma DMZ &#8211; zona desmilitarizada &#8211; para que a vulnerabilidade de invas\u00f5es n\u00e3o se torne um ponto de falhas.<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>INTRODU\u00c7\u00c3O &nbsp; Os Servidores Web s\u00e3o componentes essenciais em uma rede, onde disponibilizam uma infinidade de servi\u00e7os, no entanto, s\u00e3o dispositivos eletr\u00f4nicos e est\u00e3o sujeitos a falhas, tanto f\u00edsicas quanto l\u00f3gicas. Os respons\u00e1veis pelo gerenciamento dos servidores utilizam uma gama de recursos para aumentar e garantir a disponibilidade de acesso aos servi\u00e7os disponibilizados, como Nobreaks, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[455,477,91,1,730,830,725,42,51,495,514,68,271,127,548],"tags":[838,837,31,349,839,353,17,32,841,840,355,377,416],"class_list":["post-2614","post","type-post","status-publish","format-standard","hentry","category-apache2","category-backup-2","category-banco-de-dados","category-viazap","category-clusterweb","category-debian","category-hospedagem","category-leitura-recomendada","category-linux-linuxrs","category-profissional-de-ti","category-programacao","category-redes-2","category-seguranca-2","category-sistemas-de-armazenamento","category-ubuntu-2","tag-7-1","tag-alta","tag-cluster","tag-com","tag-corosync","tag-de","tag-debian","tag-disponibilidade","tag-drbd","tag-pacemaker","tag-para","tag-servidores","tag-web"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2614"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2614\/revisions"}],"predecessor-version":[{"id":2615,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2614\/revisions\/2615"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}