Balanço de Cargas em Apache com FreeBSD

Autor: Sergio Turpín
Data: 27 de Maio de 2003


Introdução

Neste documento nos vamos a centrar no conhecido Balanço de Cargas de Apache. Para que tenham os mínimos problemas possíveis, explicarei duas formas (entre variadas que há) de realizar Equilíbrio de Cargas; uma delas com DNS Circular e a outra com mod_rewrite. Por enquanto a principal vantagem que obtemos é que podemos realizá-lo com qualquer sistema, já seja *BSD, Linux, Solaris, etc...

Objetivo

O que pretendemos fazer, é distribuir as solicitações de centos de usuários que estão acedendo simultaneamente a um mesmo servo, em várias máquinas de características básicas e mesma informação, de tal forma que se diminua de um 15 a um 20% a carga de CPU em tarefas de procesamiento requerido. Também não há que descartar outras alternativas, para alguns lhes resultará também viável; podemos pilhar-nos um servo de alto rendimento, como pode ser o Sun Fire 15k Server (large) e poupar-nos de montar dois ou três máquinas para dita tarefa. O que nos vai a fastidiar um pelín, são os 50 quilos que nos pede SUN por ela ;-)

Software usado

As provas deste doc, foram realizadas com três máquinas:

FreeBSD 4.7-STABLE FreeBSD 4.7-RELEASE Slackware Linux 8.1
Apache 1.3.27
Bind-8.3.4.
Apache 1.3.26
Bind-8.3.3.
Apache 1.3.26
Bind-9.2.1.

Podeis ver a variedade de versões que utilizei.

Caso um: DNS Circular

Partimos da idéia que temos um domínio em internet, e três direções IP públicas com suas respectivas máquinas. Para que não tenha nenhuma equivocación, nem problemas referentes ao entendimiento de direções IP "xxx.xx.x.xxx"; vou pôr um exemplo real com meu domínio e minhas direções IP.

Domínio: servidoresonline.com
Direções IP:   217.26.241.1,   217.26.241.2,   217.26.241.3

Bem, agora temos que entrar na configuração de named em cada máquina, e vamos configurar as seguintes entradas DNS:

www0   IN   A  217   26.241.1
www1   IN   A  217   26.241.2
www2   IN   A  217   26.241.3

Posteriormente temos que meter uma segunda entrada DNS para que nos resolva www.servidoresonline.com sobre entradas canónicas em cada uma das máquinas e em ordem rotatorio.

www   IN   CNAME   www0.servidoresonline.com
      IN   CNAME   www1.servidoresonline.com
      IN   CNAME   www2.servidoresonline.com

Com isto já temos o balanço de cargas de apache com DNS Circular, como podeis ver é bastante singelo e rápido de montar.

Caso dois: mod_rewrite

Estou seguro que quase todos vocês conoceis mod_rewrite, ou ao menos habeis ouvido falar dele. Para que não se fique ninguém rezagado, diríamos que este módulo de apache o que faz é reenrutar as solicitações que chegam dos usuários, a outras máquinas (estas máquinas são as que vamos utilizar para realizar o balanço).

A idéia seria a seguinte: o DNS nos enruta o tráfico das solicitações dos usuários a uma sóla máquina, e desde esta máquina e com ajuda de mod _rewrite redireccionamos as solicitações a outros servos que são os que vão compartir nossa carga.

Bem!, agora que sabemos que é mod_rewrite e qual é um de seus funcionamentos principais, estamos prontos para sua configuração. Vamos partir (igual que o exemplo anterior), temos o mesmo domínio e mesmas direções IP, o que temos que fazer é decidir onde vamos instalar o DNS principal, já que nessa máquina vai ser onde tenhamos apache junto a mod _rewrite. Com isto quero dizer que não faz defeituosa ter configurado mod_rewrite nos três servos, só no que faça de principal e leve o/os domínio/vos que queiramos balançar.

Por defeito mod_rewrite vem configurado com apache, e tenho de dizer-vos que é um módulo robusto mas um tanto complicado. O que vamos fazer primeiro, é verificar se o módulo esta carregado no arquivo de configuração:

# cat /usr/local/etc/apache/httpd.conf | grep mod_rewrite
LoadModule rewrite_module     libexec/apache/mod_rewrite.so
AddModule mod_rewrite.c

Se obtemos estas duas lineas, sabemos que o módulo está carregado por apache, o seguinte que temos que fazer é ativar mod_rewrite pondo na configuração global de apache (/usr/local/etc/apache/httpd.conf) o seguinte:

RewriteEngine On

Após ativar nosso módulo, o que temos que fazer é utilizar a directiva RewriteMap para indicar-lhe, que script é o que leva definido as direções IP de nossos servos. Ponho-vos um pequeno exemplo de um script realizado em Perl, chamemo-lo script.pl:

#!/usr/bin/perl -w
use strict;
my($count,$srv);
while()
{
$count++;
$srv =$count %3;
print "http://www$srv.servidoresonline.com/$_";
}

O seguinte seria mediante a directiva RewriteMap especificar-lhe a mod _rewrite dito script para que saiba qual é o arquivo que deve que ir lendo:

RewriteMap taylor prg:/nosso/arquivo/script.pl

Uma vez temos o mod_rewrite carregado, e com seu script definido, já só nos fica utilizar todo isto com a directiva RewriteRule para rotar entre as direções IP disponíveis. O que em realidade faz é pegar as direções entrantes e as re-escreve em função do que vai gerando taylor (osea script.pl):

RewriteRule ^/(.+)$ ${taylor:$1} %[P,L]

Para o que tenha experiência em linguagens de programação como C, Perl, PHP, etc... são simples coincidências de expressões regulares. Recomendo-vos encarecidamente que visiteis a Página de mod_rewrite para que veais a quantidade de configurações que podeis realizar, e alguns exemplos práticos.

Mas claro, o exemplo que expliquei é para fazê-lo em todo o servo, e algum de vocês vos perguntardes... é possível fazê-lo para um só domínio?, a resposta é "Sim", e a melhor forma para entendê-lo é mediante um exemplo, vamos reunir todas as especificaciones arriba nomeadas:

< VirtualHost 217.26.241.1 >
ServerName servidoresonline.com
ServerAlias www.servidoresonline.com
DocumentRoot /home/httpd/html/
RewriteEngine on
RewriteLog /var/log/httpd/servidoresonline.com-rewrite
RewriteLogLevel 9
RewriteMap taylor prg:/nosso/arquivo/script.pl
RewriteRule ^/(.+)$ ${taylor:$1} %[P,L]
< /VirtualHost >

Crio que é bastante singelo, não?... espero que o disfruteis!! ;-)

Despedida

Me gostaria agradecer a koji e todos os usuários de eldemonio .org seu esforço e vontade para desenvolver documentos tão excepcionais para usuários de Internet. Vi crescer e evoluir esta página desde suas mais sinceros e humildes começos, até o que é hoje em dia... obrigado a todos vocês! :-)


.:: Eu nunca digo NÃO - Sergio Turpín ::.
1
Hosted by www.Geocities.ws