Servidor web · 10 min read · Sep 10, 2025
El Clúster Web Perfecto Balanceado y de Alta Disponibilidad con 2 Servidores Ejecutando Xen en Ubuntu 8.04 Hardy Heron
El Clúster Web Perfecto Balanceado y de Alta Disponibilidad con 2 Servidores Ejecutando Xen en Ubuntu 8.04 Hardy Heron
Introducción
Esta es una copia de mi sitio: blogama.org
En este tutorial construiremos un clúster web balanceado y de alta disponibilidad en 2 servidores reales con Xen, heartbeat y ldirectord. El clúster manejará http, correo, DNS, base de datos MySQL y estará completamente monitoreado. Esto se utiliza actualmente en un servidor de producción con un par de sitios web.
El objetivo de este tutorial es lograr balanceo de carga y alta disponibilidad con la menor cantidad de servidores reales posible y, por supuesto, con software de código abierto. Más servidores significan más costos de hardware y alojamiento.
La mayor parte de la información que encontrarás aquí ha sido copiada / pegada de una docena de tutoriales, muchos de ellos de howtoforge.com, pero algunos detalles importantes han sido modificados para hacer esto posible y para juntar todo.
Aquí hay una lista rápida de servicios y aplicaciones que se instalarán:
- Apache
- MySQL + phpmyadmin
- Postfix (SMTP) con configuración de usuarios basada en web y Spamassassin
- Courier (IMAP y POP) y squirrelmail
- Bind (servidor DNS)
- Munin y monit para monitoreo basado en web
- Scripts caseros para monitoreo
Lo que necesitas
2 servidores con doble LAN, al menos 7 IPs. Las IPs se utilizarán de la siguiente manera:
- dom01.example.com : 192.168.1.100
- dom02.example.com : 192.168.1.101
- lb1.example.com : 192.168.1.102
- lb2.example.com : 192.168.1.103
- web1.example.com : 192.168.1.104
- web2.example.com : 192.168.1.105
- example.com : 192.168.1.106
- yousite.com (opcional) : 192.168.1.107
Dom0 estará separado de los balanceadores de carga y los servidores web. No lo he probado, pero creo que sería posible poner balanceadores de carga en Dom0.
Sugiero al menos 2GB de RAM y discos duros RAID 1 o 10 para un servidor de producción.
Limitaciones
Esto funcionó para mí. No significa que funcionará para ti, pero ten la seguridad de que el tutorial está 100% probado para funcionar en un servidor de producción y de prueba.
Esta configuración es escalable sobre 2 servidores, pero necesitarás encontrar otra forma para la replicación de MySQL si lo haces.
No hay panel de control como ISPConfig, CPanel, etc…
Algunos sitios web pueden romper la replicación de MySQL Master a Master. Me sucedió con Drupal, pero lo solucioné desactivando la caché o estableciendo un tiempo mínimo de vida de la caché. Por favor, lee esto antes de continuar:
A: La replicación de MySQL actualmente no soporta ningún protocolo de bloqueo entre maestro y esclavo para garantizar la atomicidad de una actualización distribuida (entre servidores). En otras palabras, es posible que el cliente A realice una actualización en el co-maestro 1, y mientras tanto, antes de que se propague al co-maestro 2, el cliente B podría realizar una actualización en el co-maestro 2 que haga que la actualización del cliente A funcione de manera diferente a como lo hizo en el co-maestro 1. Así, cuando la actualización del cliente A llegue al co-maestro 2, producirá tablas que son diferentes de lo que tienes en el co-maestro 1, incluso después de que todas las actualizaciones del co-maestro 2 también se hayan propagado. Esto significa que no debes encadenar dos servidores en una relación de replicación bidireccional a menos que estés seguro de que tus actualizaciones pueden ocurrir de manera segura en cualquier orden, o a menos que te ocupes de las actualizaciones desordenadas de alguna manera en el código del cliente.
1. Instalando Ubuntu
Realiza una instalación básica de la edición de servidor de Ubuntu 8.04 LTS.
Si deseas instalar con RAID 1 de software, por favor lee este tutorial que escribí:
Instalar Ubuntu 8.04 con RAID 1 de software
2. Instalando Xen
Puedes ejecutar Xen desde archivos de imagen o desde una partición dedicada. Ambos tienen pros y contras.
Desde archivos de imagen, la E/S de disco es más lenta, pero es más fácil hacer copias de seguridad y gestionar. Es al revés cuando trabajas en una partición.
Lo que sugiero hacer es comenzar con un archivo de imagen y terminar con una partición cuando tu configuración esté terminada. De esta manera, puedes hacer copias de seguridad de tus archivos de imagen y revertir si es necesario al probar.
Para instalar en archivos de imagen, por favor consulta este gran tutorial del maestro de howto Falko:
Instalando Xen en un servidor Ubuntu 8.04 (Hardy Heron) desde los repositorios de Ubuntu
Para instalar directamente en una partición (mi versión modificada del tutorial de Falko):
XEN de Alto Rendimiento en un Sistema de Servidor Ubuntu Hardy Heron (8.04) AMD64 o i386
Necesitas hacer 2 dominios Xen en cada servidor (dom01 y dom02 son Dom0 o controlador de VM):
servidor #1 - dom01.example.com
lb1.example.com (256MB RAM - 5GB HD es suficiente)
ip : 192.168.1.102
web1.example.com
(entre más RAM, mejor, mantén 512MB para Dom0)
ip : 192.168.1.104
servidor #2 - dom02.example.com
lb2.example.com (256MB RAM - 5GB HD es suficiente)
ip : 192.168.1.103
web2.example.com (entre más RAM, mejor, mantén 512MB para Dom0)
ip : 192.168.1.105
3. Creando Puentes Xen para transferencias de datos locales (opcional)
Por defecto, solo una tarjeta de red está habilitada en la máquina virtual con Xen. Para transferencias locales como rsync, replicación de MySQL y copias de seguridad, utilizo un cable cruzado de gigabit entre los 2 servidores. No es necesario, pero ahorrará costos de ancho de banda y la replicación será más rápida.
Por favor, consulta este tutorial para crear un puente xen:
Creando nuevos puentes xen en Ubuntu 8.04
En este tutorial, la IP utilizada en la segunda tarjeta de red (cruzada) será la siguiente:
- dom01.example.com : 192.168.0.100
- dom02.example.com : 192.168.0.101
- lb1.example.com : 192.168.0.102
- lb2.example.com : 192.168.0.103
- web1.example.com : 192.168.0.104
- web2.example.com : 192.168.0.105
4. Preparación de nodos (dom01, dom02, lb1, lb2, web1, web2)
4.1 Instalando el servidor openssh y VIM
Ejecuta:
sudo su apt-get install vim ssh openssh-server
4.2 Actualizando los repositorios
mv /etc/apt/sources.list /etc/apt/sources.list.bak
vi /etc/apt/sources.list
Haz que sources.list se vea así:
#
# deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
#deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
# Consulta http://help.ubuntu.com/community/UpgradeNotes para cómo actualizar a
# versiones más nuevas de la distribución.
deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
## Actualizaciones de corrección de errores importantes producidas después de la liberación final de la
## distribución.
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
## N.B. el software de este repositorio NO ESTÁ SOPORTADO en absoluto por el equipo de Ubuntu,
## y puede no estar bajo una licencia gratuita. Por favor, asegúrate de tus
## derechos para usar el software. Además, ten en cuenta que el software en
## universe NO RECIBIRÁ revisión ni actualizaciones del equipo de seguridad de Ubuntu.
deb http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
## N.B. el software de este repositorio NO ESTÁ SOPORTADO en absoluto por el equipo de Ubuntu,
## y puede no estar bajo una licencia gratuita. Por favor, asegúrate de tus
## derechos para usar el software. Además, ten en cuenta que el software en
## multiverse NO RECIBIRÁ revisión ni actualizaciones del equipo de seguridad de Ubuntu.
deb http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
## Descomenta las siguientes dos líneas para agregar software del repositorio 'backports'
## N.B. el software de este repositorio puede no haber sido probado tan
## extensamente como el contenido en la liberación principal, aunque incluye
## versiones más nuevas de algunas aplicaciones que pueden proporcionar características útiles.
## Además, ten en cuenta que el software en backports NO RECIBIRÁ revisión
## ni actualizaciones del equipo de seguridad de Ubuntu.
# deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
# deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
## Descomenta las siguientes dos líneas para agregar software del repositorio 'partner' de Canonical.
## Este software no es parte de Ubuntu, pero es
## ofrecido por Canonical y los respectivos vendedores como un servicio a los usuarios de Ubuntu.
# deb http://archive.canonical.com/ubuntu hardy partner
# deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverseAhora haz:
apt-get update
apt-get upgrade
4.3 Modificaciones
/bin/sh es un enlace simbólico a /bin/dash, sin embargo, necesitamos /bin/bash, no /bin/dash. Por lo tanto, hacemos esto:
ln -sf /bin/bash /bin/sh
Desactivaremos AppArmor (en dom01 y dom02) haciendo lo siguiente:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
5. Configuración de red (dom01, dom02, lb1, lb2, web1, web2)
5.1 Configurando IPs
Para editar la configuración de red en Ubuntu, haz:
vi /etc/network/interfaces
Ahora haremos cada configuración de red una por una. Asumo que usas 2 tarjetas de red, eth0 es la que está conectada a Internet y eth1 la que tiene el cable cruzado. No escribiré el archivo de configuración individualmente, solo para dom01.example.com, por favor modifica de acuerdo a esta lista:
dom01.example.com
dom01.example.com
eth0 : 192.168.1.100
eth1 : 192.168.0.100
dom02.example.com
eth0 : 192.168.1.101
eth1 : 192.168.0.101
lb1.example.com
eth0 : 192.168.1.102
eth1 : 192.168.0.102
lb2.example.com
eth0 : 192.168.1.103
eth1 : 192.168.0.103
web1.example.com
eth0 : 192.168.1.104
eth1 : 192.168.0.104
web2.example.com
eth0 : 192.168.1.105
eth1 : 192.168.0.105
Ejemplo de configuración de red de dom01.example.com:
Haz que el archivo /etc/network/interfaces se vea así:
# Este archivo describe las interfaces de red disponibles en tu sistema
# y cómo activarlas. Para más información, consulta interfaces(5).
# La interfaz de red de loopback
auto lo
iface lo inet loopback
# La interfaz de red principal conectada a Internet
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
# La interfaz de red secundaria conectada por un cable cruzado en el otro servidor
auto eth1
iface eth1 inet static
address 192.168.0.100
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255Ahora guarda el archivo y haz:
/etc/init.d/networking restart
5.2 Nombre de host
vi /etc/hosts
y haz que se vea así, de lo contrario tendrás problemas con ldirectord más adelante:
dom01.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho dom01.example.com > /etc/hostname
/etc/init.d/hostname.sh start
dom02.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 dom02.example.com dom02
192.168.1.100 dom01.example.com dom01
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho dom02.example.com > /etc/hostname
/etc/init.d/hostname.sh start
lb1.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 lb1.example.com lb1
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho lb1.example.com > /etc/hostname
/etc/init.d/hostname.sh start
lb2.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 lb2.example.com lb2
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.104 web1.example.com web1
192.168.1.105 web2.example.com web2
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho lb2.example.com > /etc/hostname
/etc/init.d/hostname.sh start
web1.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 web1.example.com web1
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.105 web2.example.com web2
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho web1.example.com > /etc/hostname
/etc/init.d/hostname.sh start
web2.example.com
127.0.0.1 localhost.localdomain localhost
127.0.1.1 web2.example.com web2
192.168.1.100 dom01.example.com dom01
192.168.1.101 dom02.example.com dom02
192.168.1.102 lb1.example.com lb1
192.168.1.103 lb2.example.com lb2
192.168.1.104 web1.example.com web1
# Las siguientes líneas son deseables para hosts capaces de IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhostsecho web2.example.com > /etc/hostname
/etc/init.d/hostname.sh start
6. Instalación de software (dom01, dom02, lb1, lb2, web1, web2)
Ejecuta:
apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++ build-essential
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.