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

  1. 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.

  2. Esta configuración es escalable sobre 2 servidores, pero necesitarás encontrar otra forma para la replicación de MySQL si lo haces.

  3. No hay panel de control como ISPConfig, CPanel, etc…

  4. 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 multiverse

Ahora 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.255

Ahora 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-allhosts

echo 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-allhosts

echo 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-allhosts

echo 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-allhosts

echo 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-allhosts

echo 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-allhosts

echo 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

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.