Los métodos usados fueron dos
3.1 DNS Round Robin
DNS RR es una forma de hacer “rotar” en una “ronda” de números IP que corresponden a un mismo servidor. Para ello se configura el archivo de zona de la siguiente manera:
@ IN SOA ....
...
...
; zona del cluster
cluster0 IN A 192.168.1.150
cluster1 IN A 192.168.1.151
cluster2 IN A 192.168.1.152
; el cluster
cluster 60 IN A 192.168.1.150
60 IN A 192.168.1.151
60 IN A 192.168.1.152
; eof
Y configurar Apache a todos los servidores (cluster0-2) de la siguiente manera:
# /etc/httpd/conf/httpd.conf
...
....
...
NameVirtualHost <ip>
<VirtualHost <nombre_cluster> >
DocumentRoot <ruta1>
CustomLog <ruta_log> vcommon
</VirtualHost>
<VirtualHost cluster.dominio>
DocumentRoot <ruta2>
CustomLog <ruta_log> vcommon
</VirtualHost>
# eof
Reiniciar Apache y Named en todas las máquinas
Al hacer entonces
nslookup cluster.dominio
el servidor responderia
Name: cluster.dominio
Address: 192.168.1.150
Name: cluster.dominio
Address: 192.168.1.151
Name: cluster.dominio
Address: 192.168.1.152
(puede darse un orden distinto, por ejemplo, 192.168.1.152 primero).
Al escribir entonces en el navegador de algún cliente Web de la intranet:
http://cluster.dominio
Respondería cualquiera de los tres, dependiendo cual este primero en el DNS, sin reescribir el URL en el cliente.
El sistema del DNS Round Robin no es una forma de compartir carga entre servidores, sino una forma de destinar iguales conexiónes entre varias máquinas. No hay un balance de carga ni tampoco comparten carga entre ellas. Es el sistema más básico y efectivo.
3.2 URL Rewriting (tambien llamado Proxy Round Robin)
Este método es totalmente distinto a DNS RR, pero muy similar en su implementación. Por tanto, hay que modificar la zona del dominio, borrar el Round Robin (pero conservar los registros de cluster0, cluster1 y cluster2) y en vez de eso:
@ IN SOA .....
...
...
cluster IN A 192.168.1.150
O sea, que cluster.dominio apunte solo hacía un número IP.
Reiniciar Named.
No tocar a cluster1 y cluster2 en Apache.
Ahora, configurar a cluster0 (jefe de clusters) en Apache con lo siguiente:
# /etc/httpd/conf/httpd.conf
...
...
...
NameVirtualHost 192.168.1.150
<VirtualHost cluster0.dominio>
DocumentRoot /var/www/cluster0
CustomLog /var/log/httpd/cluster0
</VirtualHost>
# lo siguiente hace el truco del URL-REWRITE
<VirtualHost cluster.dominio>
RewriteEngine on
RewriteMap lb prg:/var/www/balance.pl
RewriteRule ^/(.+)$ $ [P,L]
</VirtualHost>
# EOF
Las opciones [P,L] significan: [P] : (Proxy) Inicializa el modulo de proxy y fuerza una peticion [L] : (Last) Detiene el proceso de reescritura de reglas.
Ahora crear un archivo en PERL o cualquier otro lenguaje scripting en la ruta indicada en la linea “RewriteMap lb”. En este caso, /var/www
El archivo de ejemplo que coloco es balance.pl que es el siguiente:
#!/usr/bin/perl
# balance.pl - programa de balance de carga
# hijacked de la documentacion de Apache
$| = 1;
$name = "cluster";
$first = ;
$last = 2;
$domain = "dominio"; # nombre dominio
$cnt = ;
while (<STDIN>) {
$cnt = (($cnt+1) % ($last+1-$first));
$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
print "http://$server/$_";
}
EOF
Darle permisos de ejecucion (chmod +x balance.pl).
Que es lo que hace este script? Al hacer Enter (al ejecutarlo de la linea de comando) devuelve:
# /var/www/balance.pl
http://cluster0.dominio <enter>
http://cluster1.dominio <enter>
http://cluster2.dominio <enter>
http://cluster0.dominio <enter>
...
Que es precisamente lo que se necesita: que Apache reescriba las reglas que van dirigidas a
http://cluster.dominio hacia
http://cluster.dominio.
Todo esto gracias a la RewriteRule
ANTES DE REINICIAR APACHE LEER LO SIGUIENTE!
Libproxy no esta configurado por defecto en Apache, asi que hay que agregar un “par” de líneas a httpd.conf en cluster0
...
LoadModule proxy_module modules/libproxy.so
Addmodule mod_proxy.c
<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On
CacheRoot "/var/cache/httpd"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor .1
CacheDefaultExpire 1
</IfModule>
...
(NOTA: es posible solamente dejar la linea ProxyVia On. El resto de las opciones indica la cantidad de páginas que puede hacer cache, tamaño del cache (en Mb), y la fecha de expiración del cache).
Ahora SI reiniciar Apache.
Y probar.