{"id":4672,"date":"2019-04-24T09:01:31","date_gmt":"2019-04-24T12:01:31","guid":{"rendered":"https:\/\/blog.clusterweb.com.br\/?p=4672"},"modified":"2019-04-24T09:01:31","modified_gmt":"2019-04-24T12:01:31","slug":"alta-disponibilidade-de-servidores-web","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4672","title":{"rendered":"Alta disponibilidade de Servidores Web"},"content":{"rendered":"<div id=\"dw__toc\">\n<div><\/div>\n<\/div>\n<h2 id=\"resumo\" class=\"sectionedit2\">Resumo<\/h2>\n<div class=\"level2\">\n<p>A alta disponibilidade comp\u00f5e-se por uma arquitectura de dois ou mais computadores configurados para que possam trabalhar em conjunto. Desta forma, cada computador monitoriza os demais e em caso de falha assume os servi\u00e7os que ficaram indispon\u00edveis. Neste projecto s\u00e3o abordadas quest\u00f5es relativamente a hardware e software, privilegiando as solu\u00e7\u00f5es de alta disponibilidade baseadas em software. No mercado existem v\u00e1rias solu\u00e7\u00f5es para alcan\u00e7ar esse objectivo, mas o elevado custo de implementa\u00e7\u00e3o e licenciamento impede a adop\u00e7\u00e3o desses sistemas por empresas economicamente limitadas. Para contornar essa limita\u00e7\u00e3o, foi utilizado software Open Source que permite a implementa\u00e7\u00e3o de alta disponibilidade a baixo custo. Neste projecto \u00e9 abordada a alta disponibilidade em servidores Web, recorrendo a software de c\u00f3digo aberto e hardware vulgar. No cap\u00edtulo direccionado aos conceitos b\u00e1sicos s\u00e3o apresentados alguns conceitos necess\u00e1rios para a compreens\u00e3o do projecto, de seguida s\u00e3o explicados os diferentes tipos de cluster e respectivas vantagens de implementa\u00e7\u00e3o, posteriormente os pontos de falha existentes nos sistemas computacionais bem como poss\u00edveis solu\u00e7\u00f5es. Finalmente \u00e9 apresentada uma solu\u00e7\u00e3o que garante alta disponibilidade atrav\u00e9s da utiliza\u00e7\u00e3o dos softwares Heartbeat, Keepalived, Haproxy, Apache, Mysql, GlusterFS e do m\u00f3dulo Bonding. Embora o objectivo deste projecto seja direccionado para os servidores Web, \u00e9 poss\u00edvel recorrer aos mesmos mecanismos na implementa\u00e7\u00e3o de outras solu\u00e7\u00f5es que exijam alta disponibilidade.<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p><!--more--><\/p>\n<h2 id=\"siglas\" class=\"sectionedit3\">Siglas<\/h2>\n<div class=\"level2\">\n<ul>\n<li class=\"level1\">\n<div class=\"li\">ARP &#8211; Address Resolution Protocol<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">CPU &#8211; Central Processing Unit<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\"><a class=\"wikilink1\" title=\"dns\" href=\"https:\/\/www.josecosta.net\/doku\/doku.php\/dns\">DNS<\/a>\u00a0&#8211; Domain Name System<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">HA &#8211; High Availability<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">HDD &#8211; Hard Disk Drive<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\"><abbr title=\"HyperText Markup Language\">HTML<\/abbr>\u00a0&#8211; HyperText Markup Language<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\"><abbr title=\"Internet Information Services\">IIS<\/abbr>\u00a0&#8211; Internet Information Services<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">I\/O &#8211; Input-Output<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">IP &#8211; Internet Protocol<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\"><abbr title=\"Local Area Network\">LAN<\/abbr>\u00a0&#8211; Local Area Networks<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">MAC address &#8211; Media Access Control address<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">MAN &#8211; Metropolitan Area Networks<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">NAS &#8211; Network-attached storage<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">NASA &#8211; National Aeronautics and Space Administration<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">RAM \u2013 Random Access Memory<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">SPOF &#8211; Single points of Failure<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">TCP &#8211; Transmission Control Protocol<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">UDP &#8211; User Datagram Protocol<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">UPS &#8211; Uninterruptible Power Supply<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">UTP &#8211; Unshielded Twisted Pair<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\"><abbr title=\"Wide Area Network\">WAN<\/abbr>\u00a0&#8211; Wide Area Networks<\/div>\n<\/li>\n<\/ul>\n<\/div>\n<h2 id=\"introducao\" class=\"sectionedit4\">Introdu\u00e7\u00e3o<\/h2>\n<div class=\"level2\">\n<p>O r\u00e1pido avan\u00e7o tecnol\u00f3gico provocou depend\u00eancias computacionais cada vez maiores na vida das pessoas e no dia-a-dia das empresas. A comunica\u00e7\u00e3o entre organiza\u00e7\u00f5es e pessoas tem vindo a ganhar cada vez mais \u00eanfase nas actividades comerciais e de lazer. As transac\u00e7\u00f5es comerciais, comunica\u00e7\u00e3o interpessoal e realiza\u00e7\u00e3o de neg\u00f3cios electronicamente, ocorrem a todo o instante. Os recursos tecnol\u00f3gicos passaram de ferramentas de trabalho a factores competitivos de extrema import\u00e2ncia. Os actuais sistemas de informa\u00e7\u00e3o beneficiam com a rede global \u201cInternet\u201d, que lhe permite a troca de dados e informa\u00e7\u00f5es em formato digital. As redes inform\u00e1ticas foram desenvolvidas para suportar in\u00fameras aplica\u00e7\u00f5es tal como voz, v\u00eddeo e dados independentemente da dispers\u00e3o geogr\u00e1fica. A ocorr\u00eancia de falhas de servi\u00e7o \u00e9 uma das grandes preocupa\u00e7\u00f5es da actual sociedade de informa\u00e7\u00e3o. A indisponibilidade de um site ou servi\u00e7o de correio electr\u00f3nico reflecte negativamente a factura\u00e7\u00e3o bem como a interac\u00e7\u00e3o com clientes e fornecedores. Actualmente o site de uma empresa \u00e9 o seu cart\u00e3o de visitas, e o e-mail um canal muito importante para a correspond\u00eancia entre entidades interna e externas \u00e0 empresa. Sendo assim s\u00f3 \u00e9 poss\u00edvel garantir qualidade e disponibilidade de servi\u00e7o se os dados estiverem dispon\u00edveis em tempo real e corresponderem a informa\u00e7\u00e3o fi\u00e1vel. A necessidade de disponibilidade e depend\u00eancia faz com que qualquer processo que envolva recursos computacionais seja cr\u00edtico. Torna-se, por isso, necess\u00e1rio implementar sistemas de armazenamento de dados seguros e que nos garantam disponibilidade. Desta forma \u00e9 necess\u00e1rio arranjar mecanismos que nos permitam contornar poss\u00edveis falhas de hardware e software, mantendo intacta a interac\u00e7\u00e3o com o utilizador final. A alta disponibilidade (HA-High Availability) visa garantir a m\u00e1xima disponibilidade dos servi\u00e7os prestados, recorrendo a software e hardware espec\u00edfico para o efeito. Actualmente os maiores construtores de hardware e software disponibilizam solu\u00e7\u00f5es HA os quais permitem suportar aplica\u00e7\u00f5es cr\u00edticas que devem estar permanentemente dispon\u00edveis. No entanto, estas solu\u00e7\u00f5es t\u00eam um elevado custo e est\u00e3o dependentes de sistemas propriet\u00e1rios. Este facto faz com que os sistemas Open Source tenham cada vez mais adeptos permitindo o aparecimento de solu\u00e7\u00f5es HA gratuitas, de c\u00f3digo aberto e com actualiza\u00e7\u00f5es permanentes. Este projecto pretende implementar uma solu\u00e7\u00e3o de alta disponibilidade para servidores Web atrav\u00e9s de cria\u00e7\u00e3o de um cluster LINUX com recurso a software baseado na licen\u00e7a GNU-<abbr title=\"GNU General Public License\">GPL<\/abbr>. Por\u00e9m, o conceito apresentado pode ser utilizado em qualquer servi\u00e7o que necessite de alta disponibilidade.<\/p>\n<\/div>\n<h2 id=\"objectivos\" class=\"sectionedit5\">Objectivos<\/h2>\n<div class=\"level2\">\n<p>O objectivo geral deste trabalho \u00e9 implementar um sistema que sustente um servidor Web de alta disponibilidade. Devido a restri\u00e7\u00f5es de recursos computacionais \u00e9 pretendido uma implementa\u00e7\u00e3o de alta disponibilidade recorrendo a hardware de baixo custo evitado solu\u00e7\u00f5es propriet\u00e1rias e recorrendo a software OpenSource.<\/p>\n<\/div>\n<h2 id=\"conceitos_basicos\" class=\"sectionedit6\">Conceitos b\u00e1sicos<\/h2>\n<div class=\"level2\">\n<p>Para que o objectivo deste projecto seja percept\u00edvel, \u00e9 necess\u00e1rio ter presente alguns conceitos que servem de suporte ao desenvolvimento do tema.<\/p>\n<\/div>\n<h3 id=\"rede_informatica\" class=\"sectionedit7\">Rede Inform\u00e1tica<\/h3>\n<div class=\"level3\">\n<p>Uma rede inform\u00e1tica consiste em dois ou mais sistemas computacionais interligados. As redes podem ser distinguidas por factores geogr\u00e1ficos. As redes que se encontram pr\u00f3ximas ou seja no mesmo edif\u00edcio designam-se por Local Area Networks (LANs). As Metropolitan Area Networks (MANs)) que abrangem \u00e1reas semelhantes a uma cidade ou Wide Area Networks (WANs), de grandes dimens\u00f5es implementadas por operadores ou empresas de grandes dimens\u00f5es. Existem diferentes tipos e topologias de redes compostas por uma variedade de equipamentos que juntamente com a cablagem potenciam a comunica\u00e7\u00e3o. Os switch s\u00e3o utilizados para interligar redes locais, equipamentos e computadores que existem. Os routers servem para interligar redes distintas, definir redes de broadcast e efectuar encaminhamento (Routing) para determinada rede utilizando protocolos de encaminhamento. (Edmundo Monteiro, 2000)<\/p>\n<\/div>\n<h3 id=\"servicos\" class=\"sectionedit8\">Servi\u00e7os<\/h3>\n<div class=\"level3\">\n<p>Os utilizadores de uma rede pretendem usufruir de tudo o que ela lhe possa facultar a n\u00edvel de comunica\u00e7\u00f5es. Para que isso seja poss\u00edvel \u00e9 necess\u00e1rio que os elementos da rede suportem os servi\u00e7os necess\u00e1rios. EX: Domain Name System (<a class=\"wikilink1\" title=\"dns\" href=\"https:\/\/www.josecosta.net\/doku\/doku.php\/dns\">DNS<\/a>). Embora para o utilizador final a exist\u00eancia deste servi\u00e7o n\u00e3o seja not\u00f3ria, \u00e9 essencial que ele exista na rede. S\u00f3 desta forma \u00e9 poss\u00edvel efectuar a tradu\u00e7\u00e3o de nomes em endere\u00e7os IP. Um servi\u00e7o \u00e9 algo existente numa rede que visa executar uma determinada fun\u00e7\u00e3o sempre que um elemento da rede a solicite.<\/p>\n<\/div>\n<h3 id=\"tcp_ip\" class=\"sectionedit9\">TCP\/IP<\/h3>\n<div class=\"level3\">\n<p>No que diz respeito a transporte de informa\u00e7\u00e3o o modelo TCP\/IP \u00e9 o mais utilizado em redes de computadores. Os dois protocolos de transporte utilizados s\u00e3o TCP e UDP, o primeiro \u00e9 orientado \u00e1 liga\u00e7\u00e3o o qual garante a entrega da informa\u00e7\u00e3o, j\u00e1 o segundo n\u00e3o nos oferece a mesma garantia no entanto \u00e9 um protocolo mais leve e com menor impacto na rede. Num n\u00edvel mais baixo na comunica\u00e7\u00e3o \u00e9 utilizado o protocolo IP tanto em LANs, MANs ou WANs. Em qualquer dos casos podem ser utilizadas liga\u00e7\u00f5es f\u00edsicas com cabo UTP, cobre ou fibra \u00f3ptica dependendo da largura de banda exigida bem como dist\u00e2ncia entre equipamentos. As liga\u00e7\u00f5es via r\u00e1dio, actualmente muito explorada, dificilmente s\u00e3o utilizadas em ambientes que requerem alta disponibilidade e grande largura de banda. (Loureiro)<\/p>\n<\/div>\n<h3 id=\"cluster\" class=\"sectionedit10\">Cluster<\/h3>\n<div class=\"level3\">\n<p>Um cluster \u00e9 um conjunto de computadores independentes, designado por n\u00f3s, que colaboram entre si para atingir um objectivo comum. Para que isso aconte\u00e7a, os computadores devem comunicar entre si atrav\u00e9s de liga\u00e7\u00f5es de alta velocidade, de forma a coordenar todas as ac\u00e7\u00f5es a executar sendo vistos pelo utilizador final como um \u00fanico sistema. Um cluster tem como objectivo principal o aumento de disponibilidade e ou de desempenho. Ao longo deste trabalho \u00e9 apresentada uma descri\u00e7\u00e3o mais pormenorizada dos diferentes tipos de cluster. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"redundancia\" class=\"sectionedit11\">Redund\u00e2ncia<\/h3>\n<div class=\"level3\">\n<p>Nas redes inform\u00e1ticas a redund\u00e2ncia pode significar a exist\u00eancia de v\u00e1rios sistemas para efectuar a mesma opera\u00e7\u00e3o, ou de equipamentos alternativos que em caso de falha assumem automaticamente as fun\u00e7\u00f5es do equipamento que falhou. A redund\u00e2ncia nas redes garante que existem v\u00e1rios caminhos para chegar ao mesmo destino, com dois ou mais equipamentos a efectuar a mesma fun\u00e7\u00e3o. Actualmente os equipamentos destinados a redes empresariais (switch, Routers, etc.) s\u00e3o constru\u00eddos a pensar em solu\u00e7\u00f5es ao n\u00edvel da redund\u00e2ncia. A prova deste facto \u00e9 a exist\u00eancia de duas fontes de alimenta\u00e7\u00e3o. Os bastidores onde os equipamentos s\u00e3o instalados j\u00e1 disponibilizam energia socorrida recorrendo a UPS\u2019s, geradores e estabilizadores de corrente. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"disponibilidade\" class=\"sectionedit12\">Disponibilidade<\/h3>\n<div class=\"level3\">\n<p>A disponibilidade de um servi\u00e7o \u00e9 vis\u00edvel atrav\u00e9s de tarefas simples e que fazem parte do nosso dia-a-dia, tal como o pagamento via multibanco imposs\u00edveis de concretizar sem a exist\u00eancia de um sistema inform\u00e1tico. No caso referido anteriormente a disponibilidade \u00e9 t\u00e3o crucial que pode levar ou n\u00e3o \u00e0 realiza\u00e7\u00e3o de um neg\u00f3cio. O conceito de disponibilidade num sistema inform\u00e1tico refere-se ao per\u00edodo de tempo em que os servi\u00e7os est\u00e3o dispon\u00edveis, ou o tempo aceit\u00e1vel para o processamento de uma determinada opera\u00e7\u00e3o solicitada pelo utilizador. Contudo, podem ocorrer interrup\u00e7\u00f5es planeadas tais como upgrades de sistema operativo, podendo implicar retoma dos servi\u00e7os por parte de outra m\u00e1quina destinada para o efeito. A disponibilidade de um servi\u00e7o \u00e9 baseada na percentagem que mede a probabilidade de encontrar o sistema em funcionamento num determinado intervalo temporal. A disponibilidade de servi\u00e7o \u00e9 denominada por uptime. J\u00e1 o downtime representa o tempo em que este se encontra indispon\u00edvel. (Stern, 2003)<\/p>\n<\/div>\n<h3 id=\"tolerancia_a_falha\" class=\"sectionedit13\">Toler\u00e2ncia a falha<\/h3>\n<div class=\"level3\">\n<p>O conceito de toler\u00e2ncia a falha surgiu em 1967 por Avizienis que defendia que um sistema de toler\u00e2ncia a falhas deveria ter a capacidade de garantir continuidade de servi\u00e7os, mesmos quando ocorrem falhas de Hardware ou Software, mas n\u00e3o em caso de erro humano. Este tipo de sistema pode ser implementado com recurso a redund\u00e2ncia de hardware, (CPU, memorias, dispositivos I\/O) e ou de software (V\u00e1rios aplica\u00e7\u00f5es desenvolvidas por equipas distintas com base nas mesmas especifica\u00e7\u00f5es e com implementa\u00e7\u00f5es diferentes). A toler\u00e2ncia a falha passa pela exist\u00eancia de redund\u00e2ncia de equipamentos, para que em caso de detec\u00e7\u00e3o de falha o equipamento secund\u00e1rio assuma automaticamente as fun\u00e7\u00f5es do prim\u00e1rio. (Ruponi, 2004)<\/p>\n<\/div>\n<h3 id=\"disponibilidade_continua\" class=\"sectionedit14\">Disponibilidade continua<\/h3>\n<div class=\"level3\">\n<p>Este conceito visa garantir disponibilidade de servi\u00e7o 24 horas\/dia sem nenhuma falha, o que implica HA. Esta abordagem combina as caracter\u00edsticas do funcionamento cont\u00ednuo e de alta disponibilidade HA, que representa o estado ideal. \u00c9 geralmente utilizada quando pretendemos elevados n\u00edveis de disponibilidade e um downtime quase nulo. \u00c9 comum ser executada simultaneamente a mesma tarefa em duas m\u00e1quinas distintas. Este tipo de sistema tenta garantir uma disponibilidade de 100% recorrendo \u00e0 utiliza\u00e7\u00e3o de equipamentos redundantes e capacidade de recupera\u00e7\u00e3o total em caso de erro. (Ruponi, 2004)<\/p>\n<\/div>\n<h2 id=\"identificacao_dos_pontos_criticos_de_falha\" class=\"sectionedit15\">Identifica\u00e7\u00e3o dos pontos cr\u00edticos de falha<\/h2>\n<div class=\"level2\">\n<p>No desenvolvimento de um projecto HA devemos analisar alguns aspectos talis como equipamentos e software envolvido. Ambiente de instala\u00e7\u00e3o do sistema bem como o poder de processamento e armazenamento de dados. Para que a falha de qualquer equipamento que comp\u00f5e o sistema computacional n\u00e3o se reflicta para o utilizador final, \u00e9 importante que n\u00e3o existam Single points of Failure (SPOF). Numa primeira fase, mais simples e econ\u00f3mica deve-se aplicar redund\u00e2ncia a n\u00edvel de Hardware recorrendo a fontes de alimenta\u00e7\u00e3o redundantes UPS\u2019s, discos em mirror, CPU\u2019s, liga\u00e7\u00f5es de rede, at\u00e9 obtermos a duplica\u00e7\u00e3o de todos o sistema computacional. No que diz respeito \u00e0 infra-estrutura de rede tamb\u00e9m devemos garantir redund\u00e2ncia quer ao n\u00edvel da cablagem quer ao n\u00edvel de switching (Switchs, routers, etc.).<\/p>\n<p>A duplica\u00e7\u00e3o do sistema computacional implica a instala\u00e7\u00e3o de novos equipamentos. Caso sejam instalados no mesmo segmento de rede ou bastidor estamos perante uma SPOF. Desta forma devemos colocar o computador noutro segmento de rede e noutro Bastidor. Em casos onde a seguran\u00e7a da informa\u00e7\u00e3o e a redund\u00e2ncia de servi\u00e7os \u00e9 crucial podemos optar pela instala\u00e7\u00e3o dos equipamentos em locais geograficamente distintos (<\/p>\n<p>A instala\u00e7\u00e3o do sistema redundante geograficamente disperso obriga a que seja efectuado um grande investimento. Para rentabilizar este sistema \u00e9 conveniente a adop\u00e7\u00e3o de balanceamento onde ambos os sistemas respondem aos pedidos provendo um aumento de qualidade de servi\u00e7o e aperfei\u00e7oamento de performance.<\/p>\n<\/div>\n<h2 id=\"clusters\" class=\"sectionedit16\">Clusters<\/h2>\n<div class=\"level2\">\n<p>Neste cap\u00edtulo s\u00e3o abortados os diferentes tipos de cluster bem como vantagem e desvantagens resultantes de cada um.<\/p>\n<\/div>\n<h3 id=\"definicao_de_cluster\" class=\"sectionedit17\">Defini\u00e7\u00e3o de Cluster<\/h3>\n<div class=\"level3\">\n<p>A tecnologia de Cluster surgiu para computadores de alto desempenho conhecidos por super-computadores, no entanto a implementa\u00e7\u00e3o deste sistema com recurso a computadores \u201cnormais\u201d teve inicio em 1994 num projecto da NASA, que necessitava de alto processamento na ordem de alguns gigaflops (um gigaflop \u00e9 igual a um bili\u00e3o de opera\u00e7\u00f5es de ponto flutuante por segundo). Nessa altura um super computador com esse n\u00edvel de desempenho custava alguns milhares de d\u00f3lares. Resultante do elevado pre\u00e7o, Thomas Sterling e Donald J. Backer resolveram interligar 16 computadores com um processador 486 DX4-100 que utilizavam um sistema operativo Linux e interligados via rede. Este grupo de computadores tinha uma capacidade de processamento de 70 megaflops com um custo de quarenta mil d\u00f3lares, que equivalia a dez porcento do custo de um super computador equivalente na \u00e9poca. Este grupo de computadores foi denominado Beowulf Cluster, com capacidade para integrar computadores com deferentes capacidades computacionais (com hardware distinto). (The Beowulf Cluster Site)<\/p>\n<\/div>\n<h3 id=\"principios_de_um_cluster\" class=\"sectionedit18\">Princ\u00edpios de um cluster<\/h3>\n<div class=\"level3\">\n<p>Para que possamos retirar vantagens da utiliza\u00e7\u00e3o de um cluster o mesmo deve reunir as seguintes caracter\u00edsticas:<\/p>\n<\/div>\n<h3 id=\"hardware_standard\" class=\"sectionedit19\">Hardware Standard<\/h3>\n<div class=\"level3\">\n<p>Todos os computadores denominados por n\u00f3s, devem esta interligados por uma rede que opere sobre protocolos standard e equipamentos gen\u00e9ricos. Em rela\u00e7\u00e3o ao sistema operativo deve ser padr\u00e3o em todos os computadores pois o software de gest\u00e3o deve ser comum a todos os elementos. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"escalabilidade\" class=\"sectionedit20\">Escalabilidade<\/h3>\n<div class=\"level3\">\n<p>Deve permitir a adi\u00e7\u00e3o de novos elementos ao cluster, aplica\u00e7\u00f5es, perif\u00e9ricos e novas liga\u00e7\u00f5es de rede sem interromper a disponibilidade de servi\u00e7os. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"transparencia\" class=\"sectionedit21\">Transpar\u00eancia<\/h3>\n<div class=\"level3\">\n<p>Os computadores devem comunicar entre si atrav\u00e9s de liga\u00e7\u00f5es de alta velocidade de forma a coordenar todas as ac\u00e7\u00f5es a serem executadas, sendo vistos pelo utilizador final como um \u00fanico sistema. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"gestao_e_manutencao\" class=\"sectionedit22\">Gest\u00e3o e manuten\u00e7\u00e3o<\/h3>\n<div class=\"level3\">\n<p>Um dos grandes problemas destes sistemas computacionais \u00e9 a manuten\u00e7\u00e3o ser uma tarefa morosa e com grande propens\u00e3o a erros. Assim sendo, um cluster deve reunir um ambiente que facilite a sua configura\u00e7\u00e3o e administra\u00e7\u00e3o para que ele n\u00e3o se torne um grande sistema complexo, que requer um grande trabalho de configura\u00e7\u00e3o e administra\u00e7\u00e3o. (Pitanga, 2003)<\/p>\n<\/div>\n<h3 id=\"principais_vantagens_oferecidas_por_um_cluster\" class=\"sectionedit23\">Principais vantagens oferecidas por um cluster<\/h3>\n<div class=\"level3\">\n<p>\u2022 Alto desempenho que nos permite resolver problemas complexos que requerem grande capacidade computacional atrav\u00e9s de processamento paralelo, possibilitando a redu\u00e7\u00e3o do tempo dispendido para a execu\u00e7\u00e3o de uma determinada tarefa. \u2022 Escalabilidade permitindo a adi\u00e7\u00e3o de novos n\u00f3s de forma a aumentara a capacidade de processamentos mediante o incremento da carga de trabalho. \u2022 Toler\u00e2ncia a falhas que permite a continuidade de servi\u00e7o em caso de falha, este facto aumenta a fiabilidades do sistema.<\/p>\n<\/div>\n<h2 id=\"tipos_de_cluster\" class=\"sectionedit24\">Tipos de cluster<\/h2>\n<div class=\"level2\">\n<p>Os clusters podem ser utilizados em diferentes situa\u00e7\u00f5es ou cen\u00e1rios. Vulgarmente encontram-se instalados em ambientes que requerem alta disponibilidade, ex: servidores Web, e-mail etc. Tamb\u00e9m podem ser utilizados em situa\u00e7\u00f5es que requerem grande capacidade de processamento tal como investiga\u00e7\u00e3o cient\u00edfica ou centros de c\u00e1lculo. De seguida s\u00e3o descritos os principais tipos de cluster e quais as suas especificidades.<\/p>\n<\/div>\n<h3 id=\"alto_desempenho\" class=\"sectionedit25\">Alto desempenho<\/h3>\n<div class=\"level3\">\n<p>Como o nome indica, este tipo de cluster foca aspectos que dizem respeito \u00e0 necessidade de grande poder de processamento, normalmente na execu\u00e7\u00e3o de actividades complexas. Neste sistema, as tarefas que requerem grande capacidade computacional s\u00e3o divididas e distribu\u00eddas por todos os elementos que constituem o cluster. Este processo \u00e9 denominado por processamento distribu\u00eddo ou processamento paralelo, permitindo a redu\u00e7\u00e3o do tempo dispendido para a execu\u00e7\u00e3o da tarefa. O processamento paralelo caracteriza-se pela distribui\u00e7\u00e3o do processo por mais do que um CPU e o processamento distribu\u00eddo pela partilha dos recursos computacionais permitindo optimizar a execu\u00e7\u00e3o das tarefas computacionais. No que diz respeito a cluster de alto desempenho, a principal refer\u00eancia \u00e9 o projecto Beowulf da NASA. Desta forma muitos administradores de sistemas denominam os clusters de alto desempenho por Cluster Beowulf. Beowulf \u00e9 uma arquitectura multicomputador que pode ser utilizada para computa\u00e7\u00e3o paralela. Normalmente esta arquitectura consiste num n\u00f3 servidor e um ou mais n\u00f3s clientes interligados via rede. N\u00e3o \u00e9 necess\u00e1rio hardware espec\u00edfico, sendo apenas necess\u00e1rio um sistema operativo Linux com as bibliotecas PVM ou MPI. Este facto faz com que o custo da solu\u00e7\u00e3o total de um cluster Beowulf seja consideravelmente mais baixo quando comparado com um super computador. Os clusters de alto desempenho normalmente s\u00e3o utilizados em projectos cient\u00edficos ou em an\u00e1lises financeiras que requerem c\u00e1lculos complexos. (The Beowulf Cluster Site)<\/p>\n<\/div>\n<h3 id=\"balanceamento_de_carga\" class=\"sectionedit26\">Balanceamento de carga<\/h3>\n<div class=\"level3\">\n<p>Nos clusters de balanceamento de carga, todos os n\u00f3s executam as mesmas aplica\u00e7\u00f5es sendo os pedidos divididos entre eles de forma equilibrada. Se um dos n\u00f3s falhar a distribui\u00e7\u00e3o dos pedidos \u00e9 distribu\u00edda pelos n\u00f3s activos. O cluster de balanceamento de carga tem como objectivo principal fornecer aumento do desempenho global do sistema, no entanto \u00e9 muito diferente do cluster de alto desempenho, pois os pedidos s\u00e3o processados exclusivamente no n\u00f3 para o qual o pedido foi reencaminhado. O objectivo deste sistema consiste apenas em dividir as requisi\u00e7\u00f5es e n\u00e3o as subtarefas resultantes de um pedido. Este tipo de cluster \u00e9 muito utilizado em servidores Web e e-mail. (The Reliable, High Performance TCP\/<abbr title=\"Hyper Text Transfer Protocol\">HTTP<\/abbr>\u00a0Load Balancer)<\/p>\n<\/div>\n<h3 id=\"alta_disponibilidade\" class=\"sectionedit27\">Alta disponibilidade<\/h3>\n<div class=\"level3\">\n<p>A alta disponibilidade comp\u00f5e-se por uma arquitectura de dois ou mais computadores configurados para que possam trabalhar em conjunto. Desta forma, cada computador monitoriza os demais e em caso de falha assume os servi\u00e7os que ficaram indispon\u00edveis. Este tipo de cluster d\u00e1-se o nome de cluster HA (High availability) sendo este um dos modelos implementados neste projecto. Os clusters de alta disponibilidade s\u00e3o utilizados sempre que se verifica a necessidade de responder a servi\u00e7os que devam estar sempre dispon\u00edveis. Podemos classificar a disponibilidade em tr\u00eas classes distintas: 1) Disponibilidade Convencional &#8211; Este tipo de disponibilidade \u00e9 a que maioria dos servidores Web existentes no mercado implementa e que de alguma forma oculta eventuais falhas. Os recursos computacionais pertencentes a esta classe facultam uma disponibilidade de 99% a 99.9%, isto significa que ao longo de um ano poder\u00e1 existir uma indisponibilidade num per\u00edodo de 9 horas e quatro dias. 2) Alta disponibilidade &#8211; \u00c9 facultada por servidores munidos de recursos que os permitem detectar, recuperar e ocultar eventuais falhas. Estes sistemas computacionais garantem uma disponibilidade de 99.99% a 99.999%, ou seja ao longo de um ano pode existir uma indisponibilidade de pouco superior a cinco minutos. 3) Disponibilidade cont\u00ednua &#8211; Existe em servidores muito sofisticados com recursos muito eficientes no que diz respeito \u00e0 detec\u00e7\u00e3o, recupera\u00e7\u00e3o e capazes de ocultar eventuais falhas. Estes t\u00eam disponibilidades cada vez mais pr\u00f3ximas dos 100% sendo o per\u00edodo de inactividade insignificante ou at\u00e9 inexistente. Nos sistemas de toler\u00e2ncia a falhas, a exist\u00eancia de redund\u00e2ncia \u00e9 um dos pr\u00e9-requisitos para alcan\u00e7ar alta disponibilidade num sistema computacional. Caso n\u00e3o exista redund\u00e2ncia de todos os equipamentos e sistemas (Hardware e software) estamos perante um Single point of Failure (SPOF), ponto \u00fanico de falha. Contudo n\u00e3o existe um tipo de cluster melhor ou pior, desta forma devemos escolher o cluster que mais se adequa ao problema a resolver ou \u00e0 realidade da empresa ou institui\u00e7\u00e3o. (Linux-HA Project)<\/p>\n<\/div>\n<h2 id=\"solucao_para_garantir_alta_disponibilidade_em_servidores_web\" class=\"sectionedit28\">Solu\u00e7\u00e3o para garantir alta disponibilidade em servidores Web<\/h2>\n<div class=\"level2\">\n<p>Como referido anteriormente, o objectivo deste projecto \u00e9 implementar um sistema que garanta alta disponibilidade num servidor Web recorrendo a hardware de baixo custo, evitando solu\u00e7\u00f5es propriet\u00e1rias. Para alcan\u00e7ar este objectivo foram criados dois clusters; Servidor Web e HaProxy e instalado um servidor de base de dados. Ambos os clusters s\u00e3o compostos por 2 computadores. No que diz respeito a infra-estrutura de rede e servidores, com excep\u00e7\u00e3o do servidor de base de dados, existe redund\u00e2ncia em todos os equipamentos (routers, switch, interfaces de rede e servidores).<\/p>\n<p>O esquema l\u00f3gico representa o fluxo de informa\u00e7\u00e3o gerado pela interac\u00e7\u00e3o com os clientes. Quando um cliente faz um pedido, o router reencaminha o tr\u00e1fego para o HAproxy sendo esse pedido posteriormente reencaminhado para o servidor Web. O servidor Web para obter a informa\u00e7\u00e3o solicitada recorre ao servidor de base de dados e devolve a informa\u00e7\u00e3o ao cliente.<\/p>\n<p>O Router Backup e o HAproxy 2 Backup est\u00e3o configurados em modo failover, apenas entram em funcionamento caso ocorra alguma falha no Router prim\u00e1rio ou HAproxy 1. Os servidores Web 1 e Web2 est\u00e3o configurados para responder em modo balanceador de carga. Ambos respondem aos pedidos mediante a distribui\u00e7\u00e3o dos mesmos por parte do HAproxy. O servidor de base de dados responde aos pedidos solicitados pelos servidores Web.<\/p>\n<\/div>\n<h3 id=\"software_instalado_nos_servidores\" class=\"sectionedit29\">Software instalado nos servidores<\/h3>\n<div class=\"level3\">\n<p>Como referido anteriormente foi necess\u00e1rio adoptar algumas ferramentas de forma a obter uma arquitectura de alta disponibilidade. O sistema operativo adoptado foi o Ubuntu Server 9.04. A sincroniza\u00e7\u00e3o de dados entre Servidores ficou a cargo do GLUSTERFS. O Heartbeat e Keepalived foram utilizados na monitoriza\u00e7\u00e3o dos elementos do cluster de balanceamento HAproxy. Foi adoptado o Apache como servidor http e o Mysql para servidor de base de dados. O m\u00f3dulo Bonding serviu para a agrega\u00e7\u00e3o de interfaces de rede. Todos os pacotes de software supra referidos ser\u00e3o explicados pormenorizadamente.<\/p>\n<p><strong>Nas seguintes tabelas est\u00e1 representada a distribui\u00e7\u00e3o de software por servidor:<\/strong><\/p>\n<p><strong>Software Instalado no HAproxy<\/strong><\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">Sistema Operativo Ubuntu server 9.04<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Heartbeat<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Keepalived<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Haproxy<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Modulo Bonding<\/div>\n<\/li>\n<\/ul>\n<p><strong>Software Instalado Servidor Web<\/strong><\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">Sistema Operativo Ubuntu server 9.04<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Apache<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">GlusterFS<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Modulo Bonding<\/div>\n<\/li>\n<\/ul>\n<p><strong>Software Instalado no servidor de base de dados<\/strong><\/p>\n<p>* Sistema Operativo Ubuntu server 9.04<\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">Mysql<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">Modulo Bonding<\/div>\n<\/li>\n<\/ul>\n<\/div>\n<h3 id=\"hardware_dos_servidores\" class=\"sectionedit30\">Hardware dos servidores<\/h3>\n<div class=\"level3\">\n<p>De seguida s\u00e3o descritos os principais componentes de hardware que comp\u00f5em o sistema computacional implementado.<\/p>\n<p><strong>Os servidores HAproxy foram instalados em dois computadores Compaq D310DT com as seguintes caracter\u00edsticas:<\/strong><\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">CPU Pentium 4 a 2.4 GHZ<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">HDD Disco IDE de 40GB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">RAM 1152MB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN1 D-link DGE-530T 10\/100\/1000<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN2 D-link DGE-530T 10\/100\/1000<\/div>\n<\/li>\n<\/ul>\n<p><strong>Os servidores Web foram instalados em dois computadores HP Compaq dc7600 com as seguintes caracter\u00edsticas:<\/strong><\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">CPU Pentium 4 a 3.2 GHZ<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">HDD Disco SATA de 40GB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">RAM 3072MB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN1 Broadcom NetXtreme 10\/100\/1000<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN2 D-link DGE-530T 10\/100\/1000<\/div>\n<\/li>\n<\/ul>\n<p><strong>O servidor de base de dados foi instalado num computador IBM IntelliStation M Pro com as seguintes caracter\u00edsticas:<\/strong><\/p>\n<ul>\n<li class=\"level1\">\n<div class=\"li\">CPU Pentium 4 a 3.2 GHZ<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">HDD SATA de 80GB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">RAM 1024MB<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN1 Broadcom NetXtreme 10\/100\/1000<\/div>\n<\/li>\n<li class=\"level1\">\n<div class=\"li\">LAN2 D-link DGE-530T 10\/100\/1000<\/div>\n<\/li>\n<\/ul>\n<p>Tendo em conta a complexidade da solu\u00e7\u00e3o global a mesma vai ser subdividida em v\u00e1rias \u00e1reas as quais ser\u00e3o descritas separadamente. Numa primeira fase vai ser descrita a configura\u00e7\u00e3o e infra-estrutura de rede, seguindo-se o cluster para balanceamento de tr\u00e1fego (Load Balancer) HAProxy, posteriormente o cluster http com recurso ao Apache e finalmente o servidor de base de dados Mysql.<\/p>\n<\/div>\n<h3 id=\"infra-estrutura_de_rede\" class=\"sectionedit31\">Infra-estrutura de rede<\/h3>\n<div class=\"level3\"><\/div>\n<h3 id=\"bonding_de_placas_de_rede_dos_servidores\" class=\"sectionedit32\">Bonding de placas de rede dos servidores<\/h3>\n<div class=\"level3\">\n<p>Independentemente do tipo de cluster implementado neste projecto, a arquitectura de rede \u00e9 comum. Todos os servidores utilizam simultaneamente dois interfaces de rede. Este facto faz com que haja um incremento de performance e diminui\u00e7\u00e3o da probabilidade de falha. Para possibilitar essa implementa\u00e7\u00e3o, \u00e9 necess\u00e1rio acrescentar ao kernel dos servidores o m\u00f3dulo Bonding. Este m\u00f3dulo surgiu juntamente com o projecto Beowulf, inicialmente desenvolvido por Donald Becker\u2019s o qual tem sofrido constantes actualiza\u00e7\u00f5es provenientes das comunidades criadas em torno deste componente.<\/p>\n<\/div>\n<h3 id=\"principais_abordagens_de_implementacao_modulo_bonding\" class=\"sectionedit33\">Principais abordagens de implementa\u00e7\u00e3o m\u00f3dulo Bonding<\/h3>\n<div class=\"level3\">\n<p>O m\u00f3dulo Bonding foi evoluindo e gradualmente surgiram upgrades com novas funcionalidades e forma de comunica\u00e7\u00e3o. De seguida s\u00e3o descritas as abordagens conhecidas at\u00e9 ao momento:\u00a0<strong>Round-robin policy (mode=0)<\/strong><\/p>\n<p>Os pacotes s\u00e3o transmitidos sequencialmente do primeiro dispositivo escravo at\u00e9 ao \u00faltimo. Esta abordagem implementa balanceamento de carga e toler\u00e2ncia a falhas.<\/p>\n<p><strong>Active-backup policy (mode=1)<\/strong><\/p>\n<p>Apenas um interface est\u00e1 activo sendo o seguinte activado em caso de falha. Esta abordagem implementa toler\u00e2ncia a falhas.<\/p>\n<p><strong>Balance-xor policy (mode=2)<\/strong><\/p>\n<p>Transmiss\u00e3o baseada no endere\u00e7o MAC de destino. \u00c9 seleccionado o mesmo interface slave para cada endere\u00e7o MAC de destino. Implementa balanceamento de carga e toler\u00e2ncia a falhas.<\/p>\n<p><strong>Broadcast (mode=3)<\/strong><\/p>\n<p>Transmite todos os pacotes em todos os interfaces slave. Implementa toler\u00e2ncia a falhas.<\/p>\n<p><strong>Dynamic link aggregation IEEE 802.3ad (mode=4 )<\/strong><\/p>\n<p>Agrega interfaces com a mesma velocidade e utiliza todos os interfaces slave desde que o switch suporte a especifica\u00e7\u00e3o 802.3ad e o driver do interface de rede suporte ethertool para garantir full-duplex.<\/p>\n<p><strong>TLB &#8211; Transmit load balancing (mode=5)<\/strong><\/p>\n<p>N\u00e3o requer um switch especial e a sa\u00edda do tr\u00e1fego \u00e9 distribu\u00edda de acordo com a carga de cada interface slave. O tr\u00e1fego de entrada \u00e9 recebido pela primeira interface slave e em caso de falha a outra interface assume as suas fun\u00e7\u00f5es.<\/p>\n<p><strong>* Adaptive load balancing (mode=6)<\/strong><\/p>\n<p>Inclui Transmit Load Balancing (tlb) com Receive Load Balancing (rlb) n\u00e3o requer um switch especial. O bonding intercepta a resposta ARP enviada pelo sistema local e ao enviar os pacotes reescreve o endere\u00e7o do hardware de origem com o endere\u00e7o de hardware de uma das interfaces slave.<\/p>\n<\/div>\n<h4 id=\"modo_de_funcionamento_bonding_adoptado\">Modo de funcionamento Bonding adoptado<\/h4>\n<div class=\"level4\">\n<p>Depois de testados os diferentes modos de funcionamento do Bonding, foi utilizada a configura\u00e7\u00e3o Round-robin policy (mode=0). Desta forma, para al\u00e9m de garantir toler\u00e2ncia a falhas obtemos um incremento de performance. O modo Active-backup policy (mode=1) foi exclu\u00eddo pelo facto de subaproveitar os equipamentos de rede, pois apenas s\u00e3o utilizados em caso de falha dos dispositivos prim\u00e1rios. O modo Broadcast (mode=3) embora utilize todos os dispositivos de rede foi exclu\u00eddo por n\u00e3o fornecer incremento de performance. Os m\u00f3dulos TLB &#8211; Transmit load balancing (mode=5) e Adaptive load balancing (mode=6) foram exclu\u00eddos pela obrigatoriedade de suporte ao ethertool por parte do driver da placa de rede. O Dynamic link aggregation IEEE 802.3ad (mode=4 ) foi exclu\u00eddo pela necessidade de um switch com suporte \u00e0 especifica\u00e7\u00e3o 802.3ad. O balance-xor policy (mode=2) \u00e9 um bom candidato, no entanto apenas se torna vantajoso em situa\u00e7\u00f5es de m\u00faltiplos clientes. O facto de recorrer sempre ao mesmo interface para responder ao pedido de um determinado MAC impede-o de tirar partido da agrega\u00e7\u00e3o de interfaces.<\/p>\n<\/div>\n<h4 id=\"instalacao_do_bonding_de_rede\">Instala\u00e7\u00e3o do Bonding de rede<\/h4>\n<div class=\"level4\">\n<p>De seguida s\u00e3o apresentados todos os passos necess\u00e1rios para proceder \u00e0 instala\u00e7\u00e3o do suporte ao Bonding. Todos os comandos devem ser executados como root para tal devemos executar o seguinte:<\/p>\n<pre class=\"code\">$ sudo \u2013s<\/pre>\n<p>Para simplificar o processo de instala\u00e7\u00e3o devemos sempre que poss\u00edvel recorrer ao gestor de pacotes APT desta forma para activar o suporte a Bonding devemos executar o seguinte comando:<\/p>\n<pre class=\"code\"># apt-get install ifenslave<\/pre>\n<p>Agora vamos iniciar a configura\u00e7\u00e3o do Bonding. Para tal devemos editar o ficheiro Bonding que se encontra na directoria \/etc\/modprobe.d\/. Neste caso recorremos ao VI ou qualquer outro editor de texto.<\/p>\n<pre class=\"code\"># vi \/etc\/modprobe.d\/bonding<\/pre>\n<p>Para activar o modo Round-robin o ficheiro deve ficar assim: alias bond0 bonding options bonding mode=0 miimon=100 downdelay=200 updelay=200<\/p>\n<p>Agora vamos iniciar a configura\u00e7\u00e3o dos interfaces de rede. Para isso devemos editar o ficheiro interfaces que se encontra na directoria \/etc\/network\/:<\/p>\n<pre class=\"code\"># vi \/etc\/network\/interfaces<\/pre>\n<p>Os servidores encontram-se instalados na rede 192.168.200.xxx Para configurar a agrega\u00e7\u00e3o de dois interfaces, o conte\u00fado do ficheiro deve ser id\u00eantico ao seguinte e apenas devemos substituir o endere\u00e7o IP conforme o servidor:<\/p>\n<pre class=\"code\">auto lo\r\niface lo inet loopback\r\n\r\nauto bond0\r\niface bond0 inet static\r\n        address 192.168.200.XXX\r\n        netmask 255.255.255.0\r\n        network 192.168.200.0\r\n        broadcast 192.168.200.255\r\n        gateway 192.168.200.254\r\n        up \/sbin\/ifenslave bond0 eth0 eth1\r\n        down \/sbin\/ifenslave -d bond0 eth0 eth1<\/pre>\n<p>Depois de efectuadas as respectivas altera\u00e7\u00f5es para que as mesmas sejam carregadas \u00e9 necess\u00e1rio reiniciar o servi\u00e7o de rede. Para tal devemos executar o seguinte comando:<\/p>\n<pre class=\"code\"># \/etc\/init.d\/networking restart<\/pre>\n<\/div>\n<h2 id=\"loadbalancer_de_alta_disponibilidade\" class=\"sectionedit34\">Loadbalancer de alta disponibilidade<\/h2>\n<div class=\"level2\">\n<p>A necessidade de instala\u00e7\u00e3o de um cluster de loadbalancer deve-se ao facto de existirem v\u00e1rios servidores Web, sendo necess\u00e1rio proceder \u00e0 distribui\u00e7\u00e3o de pedidos http entre os diferentes servidores. Depois de analisados diversos conceitos de loadbalances, foi adoptado o HAproxy. A escolha desta ferramenta deve-se ao facto de ser open source, robusta e est\u00e1vel, n\u00e3o tendo sido detectado qualquer problema de seguran\u00e7a nos \u00faltimos sete anos. O facto de o Haproxy ser adoptado pelo RedWall e Exceliance comprovam a sua robustez. Como referido anteriormente a alta disponibilidade apenas \u00e9 garantida atrav\u00e9s da redund\u00e2ncia, sendo por isso primordial a exist\u00eancia de dois servidores.<\/p>\n<p>O HAproxy 1 \u00e9 o servidor principal, o Haproxy 2 o servidor secund\u00e1rio e o Keepalived \u00e9 respons\u00e1vel pela configura\u00e7\u00e3o do endere\u00e7o IP virtual nos dois loadbalancers. A aplica\u00e7\u00e3o Heartbeat \u00e9 respons\u00e1vel pela monitoriza\u00e7\u00e3o do estado do servidor de balanceamento, que em caso de falha do servidor principal e servidor secund\u00e1rio assume o balanceamento, sendo activado nele o endere\u00e7o virtual recorrendo ao Keepalived. O HAProxy faz o redireccionamento dos pedidos para os servidores Web que est\u00e3o em funcionamento. Caso ocorra algum problema com o servidor Web onde o cliente est\u00e1 ligado, o servidor de balanceamento reencaminha os pedidos para outro servidor, sendo que este processo \u00e9 transparente para o cliente. Tendo em conta a forma de funcionamento deste servidor, podemos constatar que o mesmo se enquadra nos clusters de Alta disponibilidade.<\/p>\n<\/div>\n<h3 id=\"instalacao_do_haproxy\" class=\"sectionedit35\">Instala\u00e7\u00e3o do HAproxy<\/h3>\n<div class=\"level3\">\n<p>De seguida s\u00e3o apresentados todos os passos necess\u00e1rios para proceder \u00e0 instala\u00e7\u00e3o do HAproxy, Heartbeat e Keepalived. Todos os comandos e ficheiros devem ser executados de igual forma em ambos os servidores at\u00e9 que apare\u00e7am indica\u00e7\u00f5es contr\u00e1rias. Todos os comandos devem ser executados como root para tal devemos executar o seguinte:<\/p>\n<pre class=\"code\">$ sudo \u2013s<\/pre>\n<p>Para instalar o HAproxy devemos executar o seguinte comando:<\/p>\n<pre class=\"code\"># apt-get install haproxy<\/pre>\n<p>As configura\u00e7\u00f5es do HAProxy s\u00e3o guardadas em \/etc\/haproxy\/haproxy.cfg antes de procedermos \u00e0s configura\u00e7\u00f5es, devemos fazer um backup dos ficheiros originais e proceder \u00e0 cria\u00e7\u00e3o de novos com os seguintes comandos:<\/p>\n<pre class=\"code\"># cp \/etc\/haproxy\/haproxy.cfg \/etc\/haproxy\/haproxy.cfg_orig\r\n# cat \/dev\/null &gt; \/etc\/haproxy\/haproxy.cfg<\/pre>\n<p>Agora vamos editar o ficheiro de configura\u00e7\u00e3o:<\/p>\n<pre class=\"code\"># vi \/etc\/haproxy\/haproxy.cfg<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\">global\r\n        log 127.0.0.1   local0\r\n        log 127.0.0.1   local1 notice\r\n        #log loghost    local0 info\r\n        maxconn 4096\r\n        #debug\r\n        #quiet\r\n        user haproxy\r\n        group haproxy<\/pre>\n<pre class=\"code\">defaults\r\n        log     global\r\n        mode    http\r\n        option  httplog\r\n        option  dontlognull\r\n        retries 3\r\n        redispatch\r\n        maxconn 2000\r\n        contimeout      5000\r\n        clitimeout      50000\r\n        srvtimeout      50000<\/pre>\n<pre class=\"code\">listen webfarm 192.168.200.120:80\r\n       mode http\r\n       stats enable\r\n       stats auth admin:olamundo\r\n       balance roundrobin\r\n       cookie JSESSIONID prefix\r\n       option httpclose\r\n       option forwardfor\r\n       option httpchk HEAD \/check.txt HTTP\/1.0\r\n       server server1 192.168.200.100:80 cookie A check\r\n       server server2 192.168.200.101:80 cookie B check<\/pre>\n<p>Para activar o script de init devemos editar o ficheiro haproxy que se encontra na pasta \/etc\/default\/<\/p>\n<pre class=\"code\"># vi \/etc\/default\/haproxy<\/pre>\n<p>Verificar se a op\u00e7\u00e3o ENABLED \u00e9 igual a 1, deve ficar assim:<\/p>\n<pre class=\"code\"># Set ENABLED to 1 if you want the init script to start haproxy.\r\nENABLED=1\r\n# Add extra flags here.\r\n#EXTRAOPTS=\"-de -m 16\"<\/pre>\n<p>Depois de instalar o HAproxy, devemos instalar o Heartbeat com o seguinte comando:<\/p>\n<pre class=\"code\"># apt-get install heartbeat<\/pre>\n<p>Para permitir o HAProxy utilizar endere\u00e7o IP virtual partilhado, devemos editar o ficheiro \/etc\/sysctl.conf:<\/p>\n<pre class=\"code\"># vi \/etc\/sysctl.conf<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\">net.ipv4.ip_nonlocal_bind=1<\/pre>\n<p>Depois de guardar o ficheiro, deve-se executar o seguinte comando:<\/p>\n<pre class=\"code\"># sysctl -p<\/pre>\n<p>A configura\u00e7\u00e3o do heartbeat \u00e9 baseada em tr\u00eas ficheiros de configura\u00e7\u00e3o: \/etc\/ha.d\/authkeys, \/etc\/ha.d\/ha.cf e \/etc\/ha.d\/haresources. Os \/etc\/ha.d\/authkeys e \/etc\/ha.d\/haresources devem ser id\u00eanticos no HAproxy1 e HAproxy2, o ficheiro \/etc\/ha.d\/ha.cf difere apenas por uma linha. Para isso devemos executar os seguintes comandos:<\/p>\n<pre class=\"code\"># vi \/etc\/ha.d\/authkeys<\/pre>\n<p>Deve definir a senha para autenticar o heartbeat do HAproxy 1 no HAproxy 2 e vice-versa:<\/p>\n<pre class=\"code\">auth 3\r\n3 md5 olamundo<\/pre>\n<p>O ficheiro \/etc\/ha.d\/authkeys deve ser lido apenas pelo root, para tal devemos executar o seguinte comando:<\/p>\n<pre class=\"code\">chmod 600 \/etc\/ha.d\/authkeys<\/pre>\n<p>Aten\u00e7\u00e3o: O ficheiro ha.cf \u00e9 diferente em ambos os servidores! Ficheiro ha.cf do HAproxy 1 Usar este comando para editar:<\/p>\n<pre class=\"code\"># vi \/etc\/ha.d\/ha.cf<\/pre>\n<p>Fica assim:<\/p>\n<pre class=\"code\">#\r\n#       keepalive: how many seconds between heartbeats\r\n#\r\nkeepalive 2\r\n#\r\n#       deadtime: seconds-to-declare-host-dead\r\n#\r\ndeadtime 10\r\n#\r\n#       What UDP port to use for udp or ppp-udp communication?\r\n#\r\nudpport        694\r\nbcast  bond0\r\nmcast bond0 225.0.0.1 694 1 0\r\nucast bond0 192.168.200.122\r\n#       What interfaces to heartbeat over?\r\nudp     bond0\r\n#\r\n#       Facility to use for syslog()\/logger (alternative to log\/debugfile)\r\n#\r\nlogfacility     local0\r\n#\r\n#       Tell what machines are in the cluster\r\n#       node    nodename ...    -- must match uname -n\r\nnode    balancer1\r\nnode    balancer2<\/pre>\n<p>Ficheiro ha.cf do HAproxy 2<\/p>\n<pre class=\"code\">#\r\n#       keepalive: how many seconds between heartbeats\r\n#\r\nkeepalive 2\r\n#\r\n#       deadtime: seconds-to-declare-host-dead\r\n#\r\ndeadtime 10\r\n#\r\n#       What UDP port to use for udp or ppp-udp communication?\r\n#\r\nudpport        694\r\nbcast  bond0\r\nmcast bond0 225.0.0.1 694 1 0\r\nucast bond0 192.168.200.121\r\n#       What interfaces to heartbeat over?\r\nudp     bond0\r\n#\r\n#       Facility to use for syslog()\/logger (alternative to log\/debugfile)\r\n#\r\nlogfacility     local0\r\n#\r\n#       Tell what machines are in the cluster\r\n#       node    nodename ...    -- must match uname -n\r\nnode    balancer1\r\nnode    balancer2<\/pre>\n<p>Agora vamos editar o haresources para tal execute o seguinte comando:<\/p>\n<pre class=\"code\"># vi \/etc\/ha.d\/haresources<\/pre>\n<p>Fica assim:<\/p>\n<pre class=\"code\">Balancer  192.168.200.120<\/pre>\n<p>Para terminar devemos iniciar o Haproxy com o seguinte comando:<\/p>\n<pre class=\"code\">#\/etc\/init.d\/heartbeat start<\/pre>\n<p>Se tudo ocorrer como esperado, podemos aceder ao interface Web com informa\u00e7\u00f5es referentes aos pedidos bem como o encaminhamento para diferentes servidores atrav\u00e9s do seguinte link\u00a0<a class=\"urlextern\" title=\"http:\/\/192.168.200.120\/haproxy?stats\" href=\"http:\/\/192.168.200.120\/haproxy?stats\" rel=\"nofollow\">http:\/\/192.168.200.120\/haproxy?stats<\/a>.<\/p>\n<\/div>\n<h2 id=\"cluster_http\" class=\"sectionedit36\">Cluster http<\/h2>\n<div class=\"level2\">\n<p>Todo o projecto foi desenhado em torno dos ervidores http, e pretende-se que os memos possam responder a um elevado n\u00famero de pedidos garantindo disponibilidade e capacidade de resposta. Estes servidores tem como requisito garantir a execu\u00e7\u00e3o de\u00a0<abbr title=\"HyperText Markup Language\">HTML<\/abbr>,\u00a0<abbr title=\"Hypertext Preprocessor\">PHP<\/abbr>\u00a05, perl e suporte a Mysql. Relativamente ao servidor http, foi adoptado o Apache pelo facto de ser o servidor Web mais seguro e utilizado no mundo. Como referido anteriormente, este cluster \u00e9 composto por 2 servidores, web1 e web2. Para potenciar o aumento da capacidade de resposta os servidores, estes utilizam uma arquitectura multicomputador recorrendo ao loadbalance sendo o HAproxy respons\u00e1vel pela distribuir\u00e3o dos pedidos. Uma vez que o objectivo deste projecto \u00e9 a utiliza\u00e7\u00e3o de hardware de baixo custo, foi exclu\u00edda a possibilidade de utiliza\u00e7\u00e3o dispositivos de armazenamento de dados comum aos dois servidores (NAS Network-attached storage, etc.). Esta limita\u00e7\u00e3o obrigou a adop\u00e7\u00e3o de softwares que nos permitia sincronismo do direct\u00f3rio do apache em tempo real, sem grande impacto de performance. Para esse efeito foi utilizado o GlusterFS. Quanto ao servi\u00e7o de Mysql este \u00e9 disponibilizado por um cluster dedicado ao efeito o qual ser\u00e1 explicado de seguida.<\/p>\n<\/div>\n<h3 id=\"o_glustergf\" class=\"sectionedit37\">O GlusterGF<\/h3>\n<div class=\"level3\">\n<p>O Gluster FS \u00e9 um cluster de armazenamento de dados de alta disponibilidade, que nos permite agregar m\u00faltiplas unidades de armazenamento remotas num \u00fanico volume. As unidades de armazenamentos denominam-se por bricks, distribu\u00eddas pela rede num \u00fanico sistema de ficheiros paralelo. Esta arquitectura permite uma grande escalabilidade possibilitando a adi\u00e7\u00e3o de milhares de bricks, resultando v\u00e1rios peta bytes de armazenamento. O GlusterFS baseia-se num sistema cliente servidor, podendo existir um ou mais servidores de ficheiros. Este sistema tamb\u00e9m permite que cada computador funcione como servidor. Grandes partes das funcionalidades facultadas pelo GlusterFS s\u00e3o implementadas atrav\u00e9s de tradutores (objectos bin\u00e1rios carregados em tempo real). Estes objectos definem o interface de comunica\u00e7\u00e3o, de modo a que os mesmos possam ser carregados tanto por clientes como pelos servidores. O GlusterFs corre sobre Linux, FreeBSd, OpenSolaris, e MACX\u00a0<abbr title=\"Operating System\">OS<\/abbr>\u00a0X. Este sistema de ficheiro tamb\u00e9m pode ser acedido por Windows recorrendo \u00e0 partilhar via SAMBA. (GlusterFS)<\/p>\n<\/div>\n<h3 id=\"instalacao_do_apache\" class=\"sectionedit38\">Instala\u00e7\u00e3o do Apache<\/h3>\n<div class=\"level3\">\n<p>De seguida s\u00e3o apresentados os passos necess\u00e1rios para a instala\u00e7\u00e3o do cluster http. Numa primeira fase s\u00e3o descritos os passos necess\u00e1rios para instala\u00e7\u00e3o e parametriza\u00e7\u00e3o do Apache, para que possam interagir correctamente com o HAproxy. Posteriormente \u00e0 referida instala\u00e7\u00e3o e parametriza\u00e7\u00e3o, s\u00e3o descritos todos os passos necess\u00e1rios para a instala\u00e7\u00e3o do GlusterFS. Todos os comandos e ficheiros devem ser executados nos dois servidores que constituem o cluster http at\u00e9 que apare\u00e7am indica\u00e7\u00f5es em contr\u00e1rio.<\/p>\n<p><a class=\"wikilink1\" title=\"servidor_web\" href=\"https:\/\/www.josecosta.net\/doku\/doku.php\/servidor_web#instalacao_do_apache\">Instala\u00e7\u00e3o do Apache<\/a><\/p>\n<p>Se tudo correr como previsto o apache j\u00e1 esta a correr para validar essa situa\u00e7\u00e3o podemos recorrer a um browser e aceder os seguintes endere\u00e7os\u00a0<a class=\"urlextern\" title=\"http:\/\/192.168.200.111\" href=\"http:\/\/192.168.200.111\/\" rel=\"nofollow\">http:\/\/192.168.200.111<\/a>\u00a0e\u00a0<a class=\"urlextern\" title=\"http:\/\/192.168.200.112\" href=\"http:\/\/192.168.200.112\/\" rel=\"nofollow\">http:\/\/192.168.200.112<\/a><\/p>\n<\/div>\n<h3 id=\"configuracao_do_apache\" class=\"sectionedit39\">Configura\u00e7\u00e3o do apache<\/h3>\n<div class=\"level3\">\n<p>Como o HAproxy est\u00e1 configurado no modo proxy transparente ele vai passar o endere\u00e7o IP do computador original num campo chamado X-Forwarded-For. Com \u00e9 \u00f3bvio os logs do servidor devem registar o endere\u00e7o IP de origem e n\u00e3o o endere\u00e7o do HAproxy. Para rectificar esse problema devemos editar o ficheiro \/etc\/apache2\/apache2.conf e alterar o par\u00e2metro LogFormat onde aparece %h por %\\\\\\\\{X-Forwarded-For\\\\\\\\}i : Para editar o ficheiro do configura\u00e7\u00e3o executar o seguinte comando:<\/p>\n<pre class=\"code\"># vi \/etc\/apache2\/apache2.conf<\/pre>\n<p>Original:<\/p>\n<pre class=\"code\">LogFormat \"%h %l %u %t \\\"%r\\\" %&gt;s %b \\\"%\\\\\\\\{Referer\\\\\\\\}i\\\" \\\"%\\\\\\\\{User-Agent\\\\\\\\}i\\\"\" combined\r\nLogFormat \"%h %l %u %t \\\"%r\\\" %&gt;s %b\" common\r\nLogFormat \"%\\\\\\\\{Referer\\\\\\\\}i -&gt; %U\" referer\r\nLogFormat \"%\\\\\\\\{User-agent\\\\\\\\}i\" agent<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\">LogFormat \"%\\\\\\\\{X-Forwarded-For\\\\\\\\}i %l %u %t \\\"%r\\\" %&gt;s %b \\\"%\\\\\\\\{Referer\\\\\\\\}i\\\" \\\"%\\\\\\\\{User-Agent\\\\\\\\}i\\\"\" combined\r\nLogFormat \"%\\\\\\\\{X-Forwarded-For\\\\\\\\}i %l %u %t \\\"%r\\\" %&gt;s %b\" common\r\nLogFormat \"%\\\\\\\\{Referer\\\\\\\\}i -&gt; %U\" referer\r\nLogFormat \"%\\\\\\\\{User-agent\\\\\\\\}i\" agent<\/pre>\n<p>Como o HAproxy est\u00e1 constantemente a verificar a disponibilidade dos servidores com base no ficheiro \/var \/www\/Check.txt, \u00e9 importante desactivar os logs dessa opera\u00e7\u00e3o porque provoca enorme crescimento dos logs e afecta as estat\u00edsticas geradas pelo Webalizer ou AWStats. Para resolver esse problema devemos executar as seguintes altera\u00e7\u00f5es:<\/p>\n<pre class=\"code\"># vi \/etc\/apache2\/sites-available\/default<\/pre>\n<p>Devemos adicionar as seguintes linhas:<\/p>\n<pre class=\"code\">SetEnvIf Request_URI \"\\\\\\\\^\/check\\.txt$\" dontlog\r\nCustomLog \/var\/log\/apache2\/access.log combined env=!dontlog<\/pre>\n<p>Agora devemos criar o ficheiro check.txt na directoria do apache<\/p>\n<pre class=\"code\"># touch \/var\/www\/check.txt<\/pre>\n<p>Feito isto apenas nos resta reiniciar o apache:<\/p>\n<pre class=\"code\"># \/etc\/init.d\/apache2 restart<\/pre>\n<p>Depois de conclu\u00edda a execu\u00e7\u00e3o de todos os passos o apache j\u00e1 est\u00e1 pronto a servir conte\u00fados\u00a0<abbr title=\"Hypertext Preprocessor\">PHP<\/abbr>,\u00a0<abbr title=\"Practical Extraction and Report Language\">PERL<\/abbr>\u00a0e\u00a0<abbr title=\"HyperText Markup Language\">HTML<\/abbr>. No entanto, \u00e9 necess\u00e1rio garantir que os ficheiros e scripts constantes na ra\u00edz do apache s\u00e3o exactamente iguais em todos os servidores. Para tal, o GlusterFs foi configurado em modo cliente e servidor. Este tipo de abordagem garante-nos uma esp\u00e9cie de\u00a0<abbr title=\"Redundant Array of Inexpensive Disks\">RAID<\/abbr>\u00a01 via Software. De seguida s\u00e3o apresentados todos os passos necess\u00e1rios para obter os resultados pretendidos:<\/p>\n<\/div>\n<h3 id=\"instalacao_e_configuracao_do_glusterfs\" class=\"sectionedit40\">Instala\u00e7\u00e3o e configura\u00e7\u00e3o do GlusterFS<\/h3>\n<div class=\"level3\">\n<p>Os comandos devem ser executados como root para tal devemos executar o seguinte: $ sudo \u2013s<\/p>\n<p>Antes de iniciar a instala\u00e7\u00e3o do GlusterFs devemos satisfazer todos os requisitos instalando os pacotes que se seguem:<\/p>\n<pre class=\"code\"># apt-get install sshfs \r\n# apt-get install build-essential \r\n# apt-get install flex \r\n# apt-get install bison \r\n# apt-get install byacc \r\n# apt-get install wget<\/pre>\n<p>Como o Fuse dispon\u00edvel nos reposit\u00f3rios apresentava alguma instabilidade, foi necess\u00e1rio proceder \u00e0 sua instala\u00e7\u00e3o a partir do c\u00f3digo fonte. Os comandos que se seguem devem ser seguidos \u00e0 risca:<\/p>\n<pre class=\"code\"># mkdir \/root\/install\/\r\n# cd \/root\/install\r\n# wget http:\/\/ftp.gluster.com\/pub\/gluster\/glusterfs\/fuse\/fuse-2.7.4glfs11.tar.gz\r\n# tar -zxvf fuse-2.7.4glfs11.tar.gz\r\n# cd \/root\/install\/fuse-2.7.4glfs11<\/pre>\n<p>A pr\u00f3xima etapa \u00e9 compilar e instalar o Fuse<\/p>\n<pre class=\"code\"># .\/configure\r\n# make &amp;&amp; make install<\/pre>\n<p>Depois vamos instalar o GlusterFS mais a partir do c\u00f3digo fonte<\/p>\n<pre class=\"code\"># cd \/root\/install\/\r\n# wget http:\/\/ftp.gluster.com\/pub\/gluster\/glusterfs\/2.0\/LATEST\/glusterfs-2.0.4.tar.gz\r\n# tar -zxvf glusterfs-2.0.4.tar.gz\r\n# cd \/root\/install\/glusterfs-2.0.4<\/pre>\n<p>Agora devemos compilar e instalar o GlusterFS:<\/p>\n<pre class=\"code\"># .\/configure\r\n# make &amp;&amp; make install<\/pre>\n<p>Durante a compila\u00e7\u00e3o existem algumas bibliotecas que s\u00e3o compiladas para as directorias erradas. Para evitar problemas futuros devemos movelas para o local certo:<\/p>\n<pre class=\"code\"># cp \/usr\/local\/lib\/\\\\\\\\* -R \/usr\/lib\/<\/pre>\n<p>Vamos criar as directorias que v\u00e3o ser utilizados pelo cluster:<\/p>\n<pre class=\"code\"># mkdir \/etc\/glusterfs\/\r\n# mkdir \/mnt\/glusterfs\r\n# mkdir \/data\/\r\n# mkdir \/data\/export-ns\r\n# mkdir \/data\/export<\/pre>\n<p>Agora vamos configurar o GlusterFS. \u00c9 importante salientar que ambos os computadores correm tanto o GlusterFS em modo servidor e cliente. Desta forma \u00e9 necess\u00e1rio configurar dois ficheiros. O glusterfs-server.vol e o glusterfs-client.vol. \u2003 Para tal devemos executar o seguinte comando:<\/p>\n<pre class=\"code\"># vi \/etc\/glusterfs\/glusterfs-server.vol<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\">volume posix\r\ntype storage\/posix\r\noption directory \/data\/export\r\nend-volume\r\nvolume locks\r\ntype features\/locks\r\nsubvolumes posix\r\nend-volume\r\nvolume brick\r\ntype performance\/io-threads\r\noption thread-count 8\r\nsubvolumes locks\r\nend-volume\r\nvolume posix-ns\r\ntype storage\/posix\r\noption directory \/data\/export-ns\r\nend-volume\r\nvolume locks-ns\r\ntype features\/locks\r\nsubvolumes posix-ns\r\nend-volume\r\nvolume brick-ns\r\ntype performance\/io-threads\r\noption thread-count 8\r\nsubvolumes locks-ns\r\nend-volume\r\nvolume server\r\ntype protocol\/server\r\noption transport-type tcp\r\noption auth.addr.brick.allow\r\noption auth.addr.brick-ns.allow\r\nsubvolumes brick brick-ns\r\nend-volume<\/pre>\n<p>Se tudo estiver como pretendido j\u00e1 podemos iniciar o servidor:<\/p>\n<pre class=\"code\"># glusterfsd -f \/etc\/glusterfs\/glusterfs-server.vol<\/pre>\n<p>Agora vamos activar o arranque autom\u00e1tico do servidor do GlusterFs:<\/p>\n<pre class=\"code\"># chmod +x \/etc\/init.d\/glusterfsd\r\n# update-rc.d glusterfsd defaults<\/pre>\n<p>Alterar o ficheiro \/etc\/init.d\/glusterfsd:<\/p>\n<pre class=\"code\"># vi \/etc\/init.d\/glusterfsd<\/pre>\n<p>O par\u00e2metro CONFIGFILE seve ser o seguinte<\/p>\n<pre class=\"code\">CONFIGFILE=\/etc\/glusterfs\/glusterfs-server.vol<\/pre>\n<p>Uma vez configurado o modo servidor, agora vamos configurar o modo cliente:<\/p>\n<pre class=\"code\"># vi \/etc\/glusterfs\/glusterfs-client.vol<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\"># Adiciona condicao de cliente e anexa subvolume remoto no PC 1\r\n\r\nvolume brick1\r\ntype protocol\/client\r\noption transport-type tcp\/client\r\noption remote-host 192.168.200.100 \\\\\\\\# Computador 1\r\noption remote-subvolume brick \\\\\\\\# Nome do volume remoto\r\nend-volume\r\n\r\n# Adiciona condicao de cliente e anexa subvolume remoto no PC 2\r\n\r\nvolume brick2\r\ntype protocol\/client\r\noption transport-type tcp\/client\r\noption remote-host 192.168.200.101 # Computador 2\r\noption remote-subvolume brick # Nome do volume remoto\r\nend-vdice \r\nvolume brick1-ns\r\ntype protocol\/client\r\noption transport-type tcp\/client\r\noption remote-host 192.168.200.100 # Computador 1\r\noption remote-subvolume brick-ns # Nome do volume remoto\r\nend-vdice \r\nvolume brick2-ns\r\ntype protocol\/client\r\noption transport-type tcp\/client\r\noption remote-host 192.168.200.101 # Computador 2\r\noption remote-subvolume brick-ns # Nome do volume remoto\r\nend-volume\r\n  \r\n# Volume replicado com dados\r\nvolume afr1\r\ntype cluster\/afr\r\nsubvolumes brick1 brick2\r\nend-volume\r\n  \r\n#Volume replicado\r\nvolume afr-ns\r\ntype cluster\/afr\r\nsubvolumes brick1-ns brick2-ns\r\nend-volume\r\n  \r\n# Jun\u00e7\u00e3o  de todos os volumes afr (usado para &gt; 2 servidores)\r\nvolume unify\r\ntype cluster\/unify\r\noption scheduler rr \\\\\\\\# round robin\r\noption namespace afr-ns\r\nsubvolumes afr1\r\nend-volume\r\nvolume afr-ns\r\ntype cluster\/afr\r\nsubvolumes brick1-ns brick2-ns\r\nend-volume\r\n  \r\n# Jun\u00e7\u00e3o de todos os volumes afr (usado para &gt; 2 servidores)\r\nvolume unify\r\ntype cluster\/unify\r\noption scheduler rr \\\\\\\\# round robin\r\noption namespace afr-ns\r\nsubvolumes afr1\r\nend-volume<\/pre>\n<p>Para finalizar basta arrancar o GlusterFS em modo cliente e utilizar a ra\u00edz do apache como ponto de montagem:<\/p>\n<pre class=\"code\"># glusterfs -f \/etc\/glusterfs\/glusterfs-client.vol \/var\/www<\/pre>\n<p>Para terminar, vamos activar o arranque autom\u00e1tico do GlusterFs em modo cliente com o seguinte script:<\/p>\n<pre class=\"code\"># vi \/etc\/init.d\/glusterfs-clientd<\/pre>\n<p>Deve ficar assim:<\/p>\n<pre class=\"code\">ENV=\"env -i LANG=C PATH=\/usr\/local\/bin:\/usr\/bin:\/bin:\/sbin\"\r\n\r\ndo_start() \\\\\\\\{\r\n        echo \"Running ldconfig\";\r\n        ldconfig;\r\n        sleep 1;\r\n        echo \"Running depmod -a\";\r\n        depmod -a;\r\n        sleep 1;\r\n        if \\\\\\\\[ -x \/var\/www \\\\\\\\] ; then\r\n                HAVE_SAN=1\r\n        else\r\n                echo \"Mount point: \/var\/www doesn\\\\\\\\\u2019t exist creating...\"\r\n                mkdir \/var\/www;\r\n        fi\r\n        sleep 1;\r\n        echo \"Starting glusterfs\";\r\n        glusterfs -p \/var\/run\/glusterfs.pid -f \/etc\/glusterfs\/glusterfs-client.vol \/var\/www;\r\n\r\n\r\n        # Add whatever else you want to start after gluster here\r\n        # Imagine if we were serving \/etc\/nginx\/nginx.conf off of gluster\r\n        #echo \"Starting nginx\";\r\n        #sleep 3;\r\n        #\/etc\/init.d\/nginx start;\r\n\r\n }\r\n\r\ndo_stop() {\r\n      echo \"Killing glusterfs\";\r\n      if kill $(cat \/var\/run\/glusterfs.pid); then\r\n              KILLED=1\r\n      else\r\n              KILLED=0\r\n      fi\r\n      sleep 3;\r\n\r\n      echo \"Unmounting \/var\/www\";\r\n      if umount -l \/var\/www; then\r\n              UMOUNT=1\r\n      else\r\n              UMOUNT=0\r\n      fi\r\n}\r\n\r\ndo_restart() {\r\n        do_stop;\r\n        sleep 3;\r\n        do_start;\r\n}\r\n\r\n\r\ncase \"$1\" in\r\n          start)\r\n                do_start\r\n                ;;\r\n        restart|reload|force-reload) \r\n                do_restart\r\n                ;;\r\n        stop)\r\n              do_stop\r\n              ;;\r\nesac<\/pre>\n<p>Finalmente, activamos o GlusterFs no arranque de sistema:<\/p>\n<pre class=\"code\"># chmod +x \/etc\/init.d\/glusterfs-clientd\r\n# update-rc.d glusterfs-clientd defaults<\/pre>\n<p>Depois de executadas todas as etapas at\u00e9 aqui descritas, obt\u00eam-se sincronismo dos ficheiros constantes no direct\u00f3rio raiz do apache de ambos os servidores web. Este sincronismo equipara-se a um sistema RAID1.<\/p>\n<\/div>\n<h2 id=\"instalacao_do_servidor_de_base_de_dados\" class=\"sectionedit41\">Instala\u00e7\u00e3o do servidor de Base de Dados<\/h2>\n<div class=\"level2\">\n<p>Tendo em conta que o objectivo deste projecto n\u00e3o pretere abordar alta disponibilidade em bases de dados, este servidor apenas servir\u00e1 para facultar suporte a base de dados Mysql sem garantia de alta disponibilidade. No entanto este servidor tal, como todos os outros anteriormente instalados, implementa redund\u00e2ncia ao n\u00edvel de infra-estrutura de rede e m\u00f3dulo Bonding.<\/p>\n<p>O processo de instala\u00e7\u00e3o do\u00a0<a class=\"wikilink1\" title=\"mysql\" href=\"https:\/\/www.josecosta.net\/doku\/doku.php\/mysql\">MySQL<\/a>\u00a0\u00e9 descrito no seguinte link:\u00a0<a class=\"wikilink1\" title=\"mysql\" href=\"https:\/\/www.josecosta.net\/doku\/doku.php\/mysql#instalacao\">Instala\u00e7\u00e3o do MySQL<\/a><\/p>\n<\/div>\n<h1 id=\"conclusao\" class=\"sectionedit42\">Conclus\u00e3o<\/h1>\n<div class=\"level1\">\n<p>Actualmente, a utiliza\u00e7\u00e3o de sistemas computacionais \u00e9 de elevada import\u00e2ncia para grande parte das actividades comerciais e tarefas do nosso quotidiano. Desta forma, a interrup\u00e7\u00e3o de um servi\u00e7o de forma inesperada pode causar um enorme transtorno para todos os utilizadores do sistema. A utiliza\u00e7\u00e3o de redund\u00e2ncia \u00e9 uma das melhores forma de colmatar esse problema, no entanto a aquisi\u00e7\u00e3o de sistemas propriet\u00e1rios podem inviabilizar a sua execu\u00e7\u00e3o devido ao elevado custo de implementa\u00e7\u00e3o e manuten\u00e7\u00e3o. Neste projecto foi realizado um estudo de alternativas para a implementa\u00e7\u00e3o de servidores Web de alta disponibilidade recorrendo a software livre. O maior desafio foi encontrar uma solu\u00e7\u00e3o que para al\u00e9m de redund\u00e2ncia de software e hardware nos possibilitasse redund\u00e2ncia dos dados existentes na raiz do apache em tempo real e simultaneamente todos os membros do cluster pudessem responder a pedidos. Esse desafio foi ultrapassado com a utiliza\u00e7\u00e3o do GlusterFS e HAproxy. Os clusters implementados e testados garantem resultados ao n\u00edvel de solu\u00e7\u00f5es comerciais com custo de implementa\u00e7\u00e3o muito reduzidos, o aumento de qualidade e disponibilidade de servi\u00e7os \u00e9 not\u00f3rio. Actualmente existem grandes empresas que utilizam este tipo de solu\u00e7\u00f5es como suporte aos seus sistemas computacionais. \u00c9 com enorme satisfa\u00e7\u00e3o que podemos constatar que a maturidade dos sistemas Linux e software Open Source para este fim permite a sua adop\u00e7\u00e3o em sistemas de miss\u00e3o cr\u00edtica tanto em pequenas como grandes organiza\u00e7\u00f5es. Como recomenda\u00e7\u00e3o para trabalhos futuros seria interessante a implementa\u00e7\u00e3o de um cluster de base de dados recorrendo a sistemas de ficheiros como o OCFS2 e GFS. Este tipo de abordagem potenciava a implementa\u00e7\u00e3o de dois n\u00f3s Mysql em modo de balanceamento de carga. Resultando um sistema de alta disponibilidade e balanceamento com incremento de performance.<\/p>\n<\/div>\n<h1 id=\"bibliografia\" class=\"sectionedit43\">Bibliografia<\/h1>\n<div class=\"level1\">\n<p>Apache.org. (s.d.). Obtido em 18 de Agosto de 2009, de Apache\u00a0<abbr title=\"Hyper Text Transfer Protocol\">HTTP<\/abbr>\u00a0Server Project:\u00a0<a class=\"urlextern\" title=\"http:\/\/httpd.apache.org\/docs\/2.2\/\" href=\"http:\/\/httpd.apache.org\/docs\/2.2\/\" rel=\"nofollow\">http:\/\/httpd.apache.org\/docs\/2.2\/<\/a><\/p>\n<p>Edmundo Monteiro, F. B. (2000). Engenharia de Redes Inform\u00e1ticas 4\u00aa Edi\u00e7\u00e3o. FCA.<\/p>\n<p>Exceliance load balancing. (s.d.). Obtido em 25 de Agosto de 2009, de Exceliance load balancing:\u00a0<a class=\"urlextern\" title=\"http:\/\/www.exceliance.fr\/en\/index.htm\" href=\"http:\/\/www.exceliance.fr\/en\/index.htm\" rel=\"nofollow\">http:\/\/www.exceliance.fr\/en\/index.htm<\/a><\/p>\n<p>GlusterFS. (s.d.). Obtido em 14 de Agosto de 2009, de GlusterFS &#8211; Highly Scalable Clustered Storage :\u00a0<a class=\"urlextern\" title=\"http:\/\/www.gluster.com\/community\/documentation\/index.php\/GlusterFS\" href=\"http:\/\/www.gluster.com\/community\/documentation\/index.php\/GlusterFS\" rel=\"nofollow\">http:\/\/www.gluster.com\/community\/documentation\/index.php\/GlusterFS<\/a><\/p>\n<p>Keepalived. (s.d.). Obtido em 17 de Agosto de 2009, de keepalived project :\u00a0<a class=\"urlextern\" title=\"http:\/\/www.keepalived.org\/\" href=\"http:\/\/www.keepalived.org\/\" rel=\"nofollow\">http:\/\/www.keepalived.org\/<\/a><\/p>\n<p>Linux-HA Project. (s.d.). Obtido em 25 de Agosto de 2009, de Open Source High-Availability Software:\u00a0<a class=\"urlextern\" title=\"http:\/\/www.linux-ha.org\" href=\"http:\/\/www.linux-ha.org\/\" rel=\"nofollow\">www.linux-ha.org<\/a><\/p>\n<p>Loureiro, P. TCP-IP em Redes Microsoft Para Profissionais. FCA.<\/p>\n<p>MySQL Documentation. (s.d.). Obtido em 15 de Agosto de 2009, de MySQL:\u00a0<a class=\"urlextern\" title=\"http:\/\/dev.mysql.com\/doc\/\" href=\"http:\/\/dev.mysql.com\/doc\/\" rel=\"nofollow\">http:\/\/dev.mysql.com\/doc\/<\/a><\/p>\n<p>Netcraft Ltd &#8211; Internet Research, Anti-Phishing and PCI Security. (s.d.). Obtido em 5 de Setembro de 2009, de Netcraft Ltd:\u00a0<a class=\"urlextern\" title=\"http:\/\/news.netcraft.com\/\" href=\"http:\/\/news.netcraft.com\/\" rel=\"nofollow\">http:\/\/news.netcraft.com\/<\/a><\/p>\n<p>Pitanga, M. (2003). Computa\u00e7\u00e3o em Cluster. Rio de Janeiro: Brasport.<\/p>\n<p>RedWall Firewall . (s.d.). Obtido em 25 de Agosto de 2009, de RedWall:\u00a0<a class=\"urlextern\" title=\"http:\/\/www.redwall-firewall.com\/\" href=\"http:\/\/www.redwall-firewall.com\/\" rel=\"nofollow\">http:\/\/www.redwall-firewall.com\/<\/a><\/p>\n<p>Ruponi, V. (2004). Towards Zero Downtime: High Availability Blueprints. Authorhouse.<\/p>\n<p>Stern, E. M. (2003). Blueprints for High Availability. Authorhouse.<\/p>\n<p>The Beowulf Cluster Site. (s.d.). Obtido em 10 de Agosto de 2009, de Beowulf.org:\u00a0<a class=\"urlextern\" title=\"http:\/\/www.beowulf.org\/overview\/history.html\" href=\"http:\/\/www.beowulf.org\/overview\/history.html\" rel=\"nofollow\">http:\/\/www.beowulf.org\/overview\/history.html<\/a><\/p>\n<p>The Reliable, High Performance TCP\/<abbr title=\"Hyper Text Transfer Protocol\">HTTP<\/abbr>\u00a0Load Balancer. (s.d.). Obtido em 12 de Agosto de 2009, de HAProxy:\u00a0<a class=\"urlextern\" title=\"http:\/\/haproxy.1wt.eu\/\" href=\"http:\/\/haproxy.1wt.eu\/\" rel=\"nofollow\">http:\/\/haproxy.1wt.eu\/<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Resumo A alta disponibilidade comp\u00f5e-se por uma arquitectura de dois ou mais computadores configurados para que possam trabalhar em conjunto. Desta forma, cada computador monitoriza os demais e em caso de falha assume os servi\u00e7os que ficaram indispon\u00edveis. Neste projecto s\u00e3o abordadas quest\u00f5es relativamente a hardware e software, privilegiando as solu\u00e7\u00f5es de alta disponibilidade baseadas [&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,1082,730,1,830,725,42,51,495,68,271],"tags":[837,131,353,32,672,377,416],"class_list":["post-4672","post","type-post","status-publish","format-standard","hentry","category-apache2","category-backup-2","category-banco-de-dados","category-centos-7-rhel-7","category-clusterweb","category-viazap","category-debian","category-hospedagem","category-leitura-recomendada","category-linux-linuxrs","category-profissional-de-ti","category-redes-2","category-seguranca-2","tag-alta","tag-apache","tag-de","tag-disponibilidade","tag-ha","tag-servidores","tag-web"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4672","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=4672"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4672\/revisions"}],"predecessor-version":[{"id":4673,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4672\/revisions\/4673"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}