Cluster Web · 10 min read · Sep 10, 2025

O Cluster Web Perfeito com Balanceamento de Carga e Alta Disponibilidade com 2 Servidores Executando Xen no Ubuntu 8.04 Hardy Heron

O Cluster Web Perfeito com Balanceamento de Carga e Alta Disponibilidade com 2 Servidores Executando Xen no Ubuntu 8.04 Hardy Heron

Introdução

Este é um copy paste do meu site: blogama.org

Neste howto, construiremos um cluster web com balanceamento de carga e alta disponibilidade em 2 servidores reais com Xen, heartbeat e ldirectord. O cluster fará http, mail, DNS, banco de dados MySQL e será completamente monitorado. Isso é atualmente usado em um servidor de produção com alguns sites.

O objetivo deste tutorial é alcançar balanceamento de carga e alta disponibilidade com o menor número possível de servidores reais e, claro, com software de código aberto. Mais servidores significam mais custo de hardware e hospedagem.

A maioria das informações que você encontrará aqui foi copiada / colada de uma dúzia de howtos, muitos deles do howtoforge.com, mas alguns detalhes importantes foram modificados para tornar isso possível e para juntar tudo.

Aqui está uma lista rápida de serviços e aplicativos que serão instalados:

  • Apache
  • MySQL + phpmyadmin
  • Postfix (SMTP) com configuração de usuários baseada na web e Spamassassin
  • Courier (IMAP & POP) e squirrelmail
  • Bind (servidor DNS)
  • Munin e monit para monitoramento baseado na web
  • Scripts caseiros para monitoramento

O que você precisa

2 servidores com dual lan, pelo menos 7 IPs. Os IPs serão usados assim:

  • 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 será separado dos balanceadores de carga e servidores web. Eu não tentei, mas acredito que seria possível colocar balanceadores de carga no Dom0.

Sugiro pelo menos 2GB de RAM e discos rígidos RAID 1 ou 10 para um servidor de produção.

Limitações

  1. Isso funcionou para mim. Não significa que funcionará para você, mas fique tranquilo que o howto é 100% testado para funcionar em um servidor de produção e teste!

  2. Esta configuração é escalável em 2 servidores, mas você precisará encontrar outra maneira para replicação MySQL se fizer isso.

  3. Nenhum painel de controle como ISPConfig, CPanel, etc…

  4. Alguns sites podem quebrar a replicação MySQL Master para Master. Aconteceu comigo com o Drupal, mas eu consertei desativando o cache ou definindo um tempo mínimo de vida do cache. Por favor, leia isso antes de prosseguir:

A: A replicação MySQL atualmente não suporta nenhum protocolo de bloqueio entre mestre e escravo para garantir a atomicidade de uma atualização distribuída (entre servidores). Em outras palavras, é possível que o cliente A faça uma atualização no co-mestre 1, e, enquanto isso, antes que se propague para o co-mestre 2, o cliente B poderia fazer uma atualização no co-mestre 2 que faz a atualização do cliente A funcionar de maneira diferente do que funcionou no co-mestre 1. Assim, quando a atualização do cliente A chega ao co-mestre 2, ela produz tabelas que são diferentes do que você tem no co-mestre 1, mesmo após todas as atualizações do co-mestre 2 também terem se propagado. Isso significa que você não deve encadear dois servidores juntos em um relacionamento de replicação bidirecional, a menos que tenha certeza de que suas atualizações podem ocorrer de forma segura em qualquer ordem, ou a menos que cuide de atualizações fora de ordem de alguma forma no código do cliente.

1. Instalando o Ubuntu

Faça uma instalação básica do Ubuntu 8.04 LTS edição servidor.

Se você quiser instalar com RAID 1 de software, por favor, leia este howto que escrevi:

Instalar Ubuntu 8.04 com RAID 1 de software

2. Instalando o Xen

Você pode executar o Xen a partir de arquivos de imagem ou de uma partição dedicada. Ambos têm prós e contras.

A partir de arquivos de imagem, a I/O do disco é mais lenta, mas é mais fácil fazer backups e gerenciar. É o contrário ao trabalhar em uma partição.

O que sugiro fazer é começar com um arquivo de imagem e terminar com uma partição quando sua configuração estiver finalizada. Dessa forma, você pode fazer backups de seus arquivos de imagem e reverter se necessário ao testar.

Para instalar em arquivos de imagem, consulte este ótimo tutorial do mestre do howto Falko:

Instalando Xen em um Servidor Ubuntu 8.04 (Hardy Heron) a partir dos Repositórios do Ubuntu

Para instalar diretamente em uma partição (minha versão modificada do howto do Falko):

XEN de Alto Desempenho em um Sistema Servidor Ubuntu Hardy Heron (8.04) AMD64 ou i386

Você precisa fazer 2 domínios Xen em cada servidor (dom01 e dom02 são Dom0 ou controlador de VM):

servidor #1 - dom01.example.com

lb1.example.com (256MB RAM - 5GB HD é suficiente)
ip : 192.168.1.102

web1.example.com

(o mais de RAM, melhor, mantenha 512MB para Dom0)

ip : 192.168.1.104

servidor #2 - dom02.example.com

lb2.example.com (256MB RAM - 5GB HD é suficiente)
ip : 192.168.1.103

web2.example.com (o mais de RAM, melhor, mantenha 512MB para Dom0)
ip : 192.168.1.105

3. Criando Pontes Xen para transferências de dados locais (opcional)

Por padrão, apenas um cartão de rede está habilitado na máquina virtual com Xen. Para transferências locais, como rsync, replicação MySQL e backups, eu uso um cabo crossover gigabit entre os 2 servidores. Não é necessário, mas economizará custos de largura de banda e a replicação será mais rápida.

Por favor, consulte este howto para criar ponte xen:

Criando novas pontes xen no Ubuntu 8.04

Neste howto, o IP usado no segundo cartão de rede (crossover) será o seguinte:

  • 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. Preparação do nó (dom01, dom02, lb1, lb2, web1, web2)

4.1 Instalando o servidor openssh e VIM

Execute:

sudo su apt-get install vim ssh openssh-server

4.2 Atualizando os repositórios

mv /etc/apt/sources.list /etc/apt/sources.list.bak
vi /etc/apt/sources.list

Faça o sources.list parecer assim:

#
# 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
# Veja http://help.ubuntu.com/community/UpgradeNotes para como atualizar para
# versões mais novas da distribuição.
deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
## Atualizações de correção de bugs importantes produzidas após o lançamento final da
## distribuição.
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. software deste repositório é TOTALMENTE NÃO SUPORTADO pela equipe do Ubuntu,
## e pode não estar sob uma licença livre. Por favor, certifique-se de seus direitos de usar o software. Além disso, por favor, note que o software no
## universo NÃO receberá revisão ou atualizações da equipe de segurança do 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. software deste repositório é TOTALMENTE NÃO SUPORTADO pela equipe do Ubuntu,
## e pode não estar sob uma licença livre. Por favor, certifique-se de seus direitos de usar o software. Além disso, por favor, note que o software no
## multiverse NÃO receberá revisão ou atualizações da equipe de segurança do 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
## Descomente as duas linhas a seguir para adicionar software do repositório 'backports'
## N.B. software deste repositório pode não ter sido testado tão
## extensivamente quanto o contido no lançamento principal, embora inclua
## versões mais novas de alguns aplicativos que podem fornecer recursos úteis.
## Além disso, por favor, note que o software em backports NÃO receberá revisão
## ou atualizações da equipe de segurança do 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
## Descomente as duas linhas a seguir para adicionar software do repositório 'partner' da Canonical. Este software não faz parte do Ubuntu, mas é
## oferecido pela Canonical e pelos respectivos fornecedores como um serviço para os usuários do 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

Agora faça:

apt-get update
apt-get upgrade

4.3 Modificações

/bin/sh é um symlink para /bin/dash, no entanto, precisamos de /bin/bash, não /bin/dash. Portanto, fazemos o seguinte:

ln -sf /bin/bash /bin/sh

Desativaremos o AppArmor (em dom01 e dom02) fazendo o seguinte:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove

5. Configuração de rede (dom01, dom02, lb1, lb2, web1, web2)

5.1 Configurando IPs

Para editar a configuração de rede no Ubuntu, faça:

vi /etc/network/interfaces

Agora faremos cada configuração de rede uma a uma. Eu assumo que você usa 2 cartões de rede, eth0 é o que está conectado à internet e eth1 o que está com o cabo crossover. Não vou escrever o arquivo de configuração individualmente, apenas para dom01.example.com, por favor, modifique de acordo com 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

Exemplo de configuração de rede de dom01.example.com:

Faça o arquivo /etc/network/interfaces parecer assim:

# Este arquivo descreve as interfaces de rede disponíveis em seu sistema
# e como ativá-las. Para mais informações, veja interfaces(5).
# A interface de rede de loopback
auto lo
iface lo inet loopback
# A interface de rede primária conectada à 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
# A interface de rede secundária conectada por um cabo crossover no outro 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

Agora salve o arquivo e faça:

/etc/init.d/networking restart

5.2 Nome do host

vi /etc/hosts

e faça parecer assim, caso contrário, você terá problemas com ldirectord mais tarde:

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
# As linhas a seguir são desejáveis para hosts compatíveis com 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
# As linhas a seguir são desejáveis para hosts compatíveis com 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
# As linhas a seguir são desejáveis para hosts compatíveis com 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
# As linhas a seguir são desejáveis para hosts compatíveis com 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
# As linhas a seguir são desejáveis para hosts compatíveis com 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
# As linhas a seguir são desejáveis para hosts compatíveis com 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. Instalação de software (dom01, dom02, lb1, lb2, web1, web2)

Execute:

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

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.