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
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!
Esta configuração é escalável em 2 servidores, mas você precisará encontrar outra maneira para replicação MySQL se fizer isso.
Nenhum painel de controle como ISPConfig, CPanel, etc…
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 multiverseAgora 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.255Agora 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-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
# 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-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
# 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-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
# 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-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
# 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-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
# 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-allhostsecho 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
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.