quarta-feira, 11 de fevereiro de 2009

Como configurar um Loadbalanced alta disponibilidade em Cluster com Apache

Este tutorial mostra como criar dois nós no servidor Web Apache em cluster que fornece alta disponibilidade. No Apache criaremos uma carga balanciada em cluster que divide-se entre os dois pedidos recebidos nodos do apache. Porque não queremos que a carga balanceada a tornar-se um ponto de falha, temos de proporcionar alta disponibilidade para a carga balanciada, também. Por isso a nossa carga balanciada irá consistir no fator das duas cargas balanceadas nos nodos que monitoram simultaneamente usando alta disponibilidade, e se uma carga balanceada falhar, o outro assume silenciosamente.

A vantagem de utilizar uma carga balanceada comparada a usar DNS round robin é que cuida da carga sobre o servidor web nodos e envia pedidos diretos para o nó com menor carga, e também cuida de conexões / sessões. Muitas aplicações web (por exemplo, fórum software, carrinhos de compras, etc) fazem uso de sessões.


Para esta configuração, temos quatro nodos (Apache dois nós e duas cargas balanceada nos nós) e cinco endereços IP: um para cada nó e um endereço IP virtual que será partilhado pela carga balanceada dos nodos e utilizados para as solicitações HTTP.


Vou usar a seguinte configuração aqui:


  • Apache node 1: webserver1.example.com (webserver1) - IP address: 192.168.0.101; Apache document root: /var/www

  • Apache node 2: webserver2.example.com (webserver2) - IP address: 192.168.0.102; Apache document root: /var/www

  • Load Balancer node 1: loadb1.example.com (loadb1) - IP address: 192.168.0.103

  • Load Balancer node 2: loadb2.example.com (loadb2) - IP address: 192.168.0.104

  • Virtual IP Address: 192.168.0.105 (used for incoming requests)

Veja a figura abaixo como exemplo:







Neste tutorial vou usar o Debian Sarge para todos os quatro nós. Eu presumo que você tenha instalado uma base instalação Debian em todos os quatro nós, e que você tenha instalado o Apache webserver1 e webserver2, com o / var / www sendo o documento raiz do site principal.

Quero dizer em primeiro lugar, que esta não é a única forma de criar um sistema desse tipo. Há muitas maneiras de configura, mas esta foi a base da minha configuração.


1: Ativar IPVS sobre a carga balanceada:


Primeiro temos de permitir IPVS em nossa carga balanceadas. IPVS (IP Virtual Server) implementa o transporte da camada de balanceamento de carga dentro do kernel do Linux, chamado Layer-4 switching.

loadb1/loadb2:

echo ip_vs_dh >> /etc/modules
echo ip_vs_ftp >> /etc/modules
echo ip_vs >> /etc/modules
echo ip_vs_lblc >> /etc/modules
echo ip_vs_lblcr >> /etc/modules
echo ip_vs_lc >> /etc/modules
echo ip_vs_nq >> /etc/modules
echo ip_vs_rr >> /etc/modules
echo ip_vs_sed >> /etc/modules
echo ip_vs_sh >> /etc/modules
echo ip_vs_wlc >> /etc/modules
echo ip_vs_wrr >> /etc/modules


Então fazemos assim:


loadb1/loadb2:

modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr



Se você receber erros, então muito provavelmente o seu kernel não foi compilado com IPVS, você irá precisar compilar um novo kernel com IPVS (ou instalar uma imagem do kernel com suporte IPVS) agora.



2: Instalar Ultra Monkey On The Load Balancers



O que é o Ultra Monkey ?

É um projecto para a criação de carga balanceada e serviços disponíveis em uma rede local utilizando componentes de código aberto sobre o sistema operacional Linux .



Para instalar Ultra Monkey, temos que editar /etc/apt/sources.list, agora e adicionar estas duas linhas (não retire os outros repositórios):

vi /etc/apt/sources.list

deb http://www.ultramonkey.org/download/3/ sarge main deb-src http://www.ultramonkey.org/download/3 sarge main



Segue como instalar:

loadb1/loadb2:

apt-get update


loadb1/loadb2:

apt-get install ultramonkey



Irá aparecer a mensagem de atenção:


  ¦ libsensors3 not functional                                               ¦   ¦                                                                          ¦   ¦ It appears that your kernel is not compiled with sensors support. As a   ¦   ¦ result, libsensors3 will not be functional on your system.               ¦   ¦                                                                          ¦   ¦ If you want to enable it, have a look at "I2C Hardware Sensors Chip      ¦   ¦ support" in your kernel configuration.                                   ¦


Pode ignorar e seguir conforma abaixo:


Do you want to automatically load IPVS rules on boot?
<-- No

Select a daemon method.
<-- none


3: Habilitar o pacote de Load Balancers


A carga balanceada deve ser capaz de rotear o tráfego para o Apache nodos. Por isso, temos de permitir que os pacotes sejam encaminhados para o balanceamento. Adicione as seguintes linhas ao arquivo /etc/sysctl.conf:



loadb1/loadb2:

vi /etc/sysctl.conf

# Enables packet forwarding net.ipv4.ip_forward = 1


Em seguida, faça o seguinte:


sysctl -p


4: Configurar heartbeat e ldirectord


Agora temos que criar três arquivos de configuração para heartbeat. Eles devem ser idênticos em loadb1 e loadb2!


loadb1/loadb2:

vi /etc/ha.d/ha.cf

logfacility        local0 bcast        eth0                # Linux mcast eth0 225.0.0.1 694 1 0 auto_failback off node        loadb1 node        loadb2 respawn hacluster /usr/lib/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster



Importante: Como nodenames temos de utilizar a saída:


uname -n


on loadb1 and loadb2.

loadb1/loadb2:

vi /etc/ha.d/haresources

loadb1        \         ldirectord::ldirectord.cf \         LVSSyncDaemonSwap::master \         IPaddr2::192.168.0.105/24/eth0/192.168.0.255


Logo após faça

uname -n

Irá aparecer:

loadb1

Importante: Não importa se você criou o arquivo no loadb1 ou loadb2! Após IPaddr2 colocamos o endereço IP virtual 192.168.0.105.

loadb1/loadb2:

vi /etc/ha.d/authkeys

auth 3 3 md5 somerandomstring



somerandomstring: é uma senha que os dois heartbeat daemons, usam para autenticar um com o outro. Você tem a escolha entre três mecanismos de autenticação. Eu uso md5 como é o mais segur.

/etc/ha.d/authkeys deve ser lido apenas pelo root:


loadb1/loadb2:

chmod 600 /etc/ha.d/authkeys


ldirectord: É o verdadeira balanceador. O que vamos fazer é configurar os nossas dois carga balanceada (loadb1.example.com e loadb2.example.com) em um ativo / passivo na configuração, o que significa que temos uma carga balanceada ativa, e os outros é um hot-standby e torna-se activo se a uma falha na ativa. Para fazê-la funcionar, temos de criar ldirectord o arquivo de configuração /etc/ha.d /ldirectord.cf o que mais uma vez deve ser idêntica em loadb1 e loadb2.



loadb1/loadb2:

vi /etc/ha.d/ldirectord.cf


checktimeout=10 checkinterval=2 autoreload=no logfile="local0" quiescent=yes virtual=192.168.0.105:80         real=192.168.0.101:80 gate         real=192.168.0.102:80 gate         fallback=127.0.0.1:80 gate         service=http         request="ldirector.html"         receive="Test Page"         scheduler=rr         protocol=tcp         checktype=negotiate


virtual = a linha virtual, colocamos nosso endereço IP virtual (192.168.0.105 neste exemplo)

real = linhas que lista os endereços IP dos nossos Apache nodos (192.168.0.101 e 192.168.0.102 neste exemplo).

request = linha que lista o nome de um arquivo em webserver1 e webserver2 que ldirectord irá pedir várias vezes para ver se webserver1 e webserver2 ainda estão vivos. Este arquivo (que vão criar mais adiante) deve conter a seqüência de caracteres listados na

receive = linha.

Depois teremos que criar o sistema de inicialização no heartbeat e remover o start do ldirectord, porque o ldirectord será iniciado pelo heartbeat.


loadb1/loadb2:

update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 .
update-rc.d -f ldirectord remove


Finalmento o start será feito pelo heartbeat


loadb1/loadb2:

/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start


5: Testando o Load Balancers


Vamos verificar se as duas cargas balanceadas estão funcionando como esperamos:


loadb1/loadb2:

ip addr sh eth0


A carga balanceada ativa deve listar o endereço IP virtual (192.168.0.105):


2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000     link/ether 00:16:3e:40:18:e5 brd ff:ff:ff:ff:ff:ff     inet 192.168.0.103/24 brd 192.168.0.255 scope global eth0     inet 192.168.0.105/24 brd 192.168.0.255 scope global secondary eth0   

O hot-standby deve mostrar isto:


2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000     link/ether 00:16:3e:50:e3:3a brd ff:ff:ff:ff:ff:ff     inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0


loadb1/loadb2:

ldirectord ldirectord.cf status

Saída com a participação ativa carga balanceada:


ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1455




Saída sobre o hot-standby:


ldirectord is stopped for /etc/ha.d/ldirectord.cf



loadb1/loadb2:

ipvsadm -L -n


Saída partição ativa:


IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn TCP  192.168.0.105:80 rr   -> 192.168.0.101:80             Route   0      0          0   -> 192.168.0.102:80             Route   0      0          0   -> 127.0.0.1:80                 Local   1      0          0



Saída partição hot-standby:


IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn


loadb1/loadb2:

/etc/ha.d/resource.d/LVSSyncDaemonSwap master status


Saída partição ativa:


master running (ipvs_syncmaster pid: 1591)

Saída partição hot-standby:


master stopped



PS: Se o obteve sucesso no seu teste, agora vamos o Apache dois nodos.


6: Configurar o Apache com Dois Nodes


Finalmente, devemos configurar nosso cluster Apache nodos webserver1.example.com e webserver2.example.com a aceitar pedidos sobre o endereço IP virtual 192.168.0.105.


webserver1/webserver2:

apt-get install iproute


Adicionar a seguinte configuração dentro de /etc/sysctl.conf


webserver1/webserver2:

vi /etc/sysctl.conf

# Enable configuration of arp_ignore option net.ipv4.conf.all.arp_ignore = 1 # When an arp request is received on eth0, only respond if that address is # configured on eth0. In particular, do not respond if the address is # configured on lo net.ipv4.conf.eth0.arp_ignore = 1 # Ditto for eth1, add for all ARPing interfaces #net.ipv4.conf.eth1.arp_ignore = 1 # Enable configuration of arp_announce option net.ipv4.conf.all.arp_announce = 2 # When making an ARP request sent through eth0 Always use an address that # is configured on eth0 as the source address of the ARP request.  If this # is not set, and packets are being sent out eth0 for an address that is on # lo, and an arp request is required, then the address on lo will be used. # As the source IP address of arp requests is entered into the ARP cache on # the destination, it has the effect of announcing this address.  This is # not desirable in this case as adresses on lo on the real-servers should # be announced only by the linux-director. net.ipv4.conf.eth0.arp_announce = 2 # Ditto for eth1, add for all ARPing interfaces #net.ipv4.conf.eth1.arp_announce = 2

Em seguida, execute o seguinte:


webserver1/webserver2:

sysctl -p


Adicione o endereço IP virtual em /etc/network/interfaces


webserver1/webserver2:

vi /etc/network/interfaces

auto lo:0 iface lo:0 inet static   address 192.168.0.105   netmask 255.255.255.255   pre-up sysctl -p > /dev/null


Em seguida, execute o seguinte:


webserver1/webserver2:

ifup lo:0


Finalmente, temos de criar o arquivo ldirector.html. Este arquivo é solicitado pela Load Balancers nos dois nodos repetidamente para que eles possam ver se o Apache nos dois ainda estão sendo veiculados. Parto do princípio de que o documento raiz do site principal apache sobre webserver1 e webserver2 é /var/www, portanto, nós criamos o arquivo /var/www/ldirector.html


webserver1/webserver2:

vi /var/www/ldirector.html

Test Page


Mais Testes

Você já pode acessar o web site que está hospedado pelo Apache nos dois nodos http://192.168.0.105 escrevendo em seu navegador.

Agora, pare o Apache em ambos webserver1 ou webserver2. Você deve, ainda assim, consultar o site sobre a carga balanceada http://192.168.0.105 porque direciona os pedidos para o trabalho Apache nó. Claro, se você quer parar todos os Apaches, então o seu pedido falhará.

Agora vamos assumir que é o nosso ativo loadb1 com carga balanceada , e loadb2 é o hot-standby. Agora parar heartbeat em loadb1:


loadb1:

/etc/init.d/heartbeat stop


Aguarde alguns segundos e, em seguida, tente novamente http://192.168.0.105 no seu navegador. Você ainda deve ver o seu site porque loadb2 tomou o papel ativo agora.


Ative novamente o heartbeat no nó loadb1


loadb1:

/etc/init.d/heartbeat start


Se você também passou esses testes e, em seguida, o cluster loadbalanced Apache está funcionando como esperado. Divirta-se!

Nenhum comentário: