Autor: Sergio Turpín
Data: 27 de Maio de 2003
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...
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 ;-)
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.
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.
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!! ;-)
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! :-)