Cluster Web · 6 min read · Oct 08, 2025

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

14. Espelhamento de arquivos web e de e-mail com rsync (web1, web2)

Esta é a parte complicada. Dependendo do tipo de site(s) que você colocará no cluster, a técnica usada para espelhar arquivos web pode ser diferente.

Consideraremos web1.example.com como o mestre, web2.example.com irá sincronizar com web1.example.com.

Isso pode criar problemas em alguns casos. Se você tiver um site onde os usuários podem enviar arquivos, você não quer que eles sejam enviados para web2.example.com porque os dois servidores não estarão sincronizados.

No meu caso, redireciono todas as páginas onde os usuários podem enviar dados para a porta HTTP 81, que é encaminhada apenas para um servidor, web1.example.com. Se o servidor mestre falhar, todo o tráfego da porta 81 é encaminhado para o servidor de fallback, web2.example.com, e o espelhamento é temporariamente interrompido.

O redirecionamento pode ser feito no arquivo apache vhost.conf:

[...]
Redirect /admin http://www.example.com:81/webmail
[...]

Se você tiver muitos uploads de arquivos feitos por usuários, pode considerar usar um NFS com balanceamento de carga:

https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat

14.1 Instalar rsync

apt-get install rsync

14.2 Criar as Chaves em web2.example.com

Agora criamos o par de chaves privada/pública em web2.example.com:

mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key

Você verá algo como isto:

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [pressione enter aqui]
Enter same passphrase again: [pressione enter aqui]
Your identification has been saved in /root/rsync/mirror-rsync-key.
Your public key has been saved in /root/rsync/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@web2

É importante que você não insira uma frase de senha, caso contrário, o espelhamento não funcionará sem interação humana, então simplesmente pressione enter!

Em seguida, copiamos nossa chave pública para web1.example.com:

scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/vmail/

A chave pública mirror-rsync-key.pub deve agora estar disponível em /home/vmail no web1.example.com.

14.3 Configurar web1.example.com

web1.example.com

Agora faça login via SSH como vmail (não root!) e faça isto:

login vmail

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keys

Ao fazer isso, anexamos o conteúdo de mirror-rsync-key.pub ao arquivo /home/vmail/.ssh/authorized_keys. /home/vmail/.ssh/authorized_keys deve parecer semelhante a isto:

(Ainda como webmaster! em web1.example.com)

vi ~/.ssh/authorized_keys

ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@web2

Agora queremos permitir conexões apenas de web2.example.com, e o usuário que se conecta deve ser permitido usar apenas rsync, então adicionamos

command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty

logo no início de /home/vmail/.ssh/authorized_keys:

command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
web2

Agora criamos o script /home/vmail/rsync/checkrsync que rejeita todos os comandos, exceto rsync em web1.example.com.

(Ainda fazemos isso como vmail!)

mkdir ~/rsync
vi ~/rsync/checkrsync

#!/bin/sh




case "$SSH_ORIGINAL_COMMAND" in
        *\&*)
                echo "Rejected"
                ;;
        *\(*)
                echo "Rejected"
                ;;
        *\{*)
                echo "Rejected"
                ;;
        *\;*)
                echo "Rejected"
                ;;
        *\<*)
                echo "Rejected"
                ;;
        *\`*)
                echo "Rejected"
                ;;
        rsync\ --server*)
                $SSH_ORIGINAL_COMMAND
                ;;
        *)
                echo "Rejected"
                ;;
esac

chmod 700 ~/rsync/checkrsync

14.4 Testar rsync automatizado

web2.example.com

Primeiro, precisamos informar ao rsync quais arquivos não queremos sincronizar (como o gráfico do monit!)

vi /root/exclude_www.txt

e fazê-lo parecer assim:

 /example/web/monit/
 /example/web/monitoring/
 /example/ssl/
 /yoursite/ssl/ 

e agora para o e-mail:

vi /root/exclude_mail.txt

/rsync/
/.ssh/
#if you use my monitoring script, see next page
server1_was_down/
.bash_history/
.bash_logout/
.bashrc/
.mysql_history/
.profile/
.viminfo/

Agora devemos testar em web2.example.com se podemos espelhar web1.example.com sem ser solicitado pela senha do vmail. Fazemos isso:

(Fazemos isso como root!)

web2.example.com

rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_www.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/var/www/ /var/www/

seguido por:

rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_mail.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/home/vmail/ /home/vmail/

Agora você deve ver que o espelhamento ocorre sem ser solicitado por uma senha:

receiving file list ... done
sent 71 bytes  received 643 bytes  476.00 bytes/sec
total size is 64657  speedup is 90.56

14.5 Criar um cron job

Primeiro, criaremos um script que garantirá que, se por algum motivo web1.example.com ficar fora do ar, o rsync será interrompido e que o root terá que reiniciar manualmente o processo.

A razão pela qual temos que fazer isso é porque web2.example.com assumirá web1.example.com para e-mail se ele ficar fora do ar. Novos e-mails serão recebidos em web2.example.com durante esse período, então digamos que web1.example.com volte online uma hora depois, todos os novos e-mails durante esse período de tempo seriam excluídos em web2.example.com por causa do comando rsync –delete. Veremos abaixo como sincronizar ambos os servidores se isso acontecer.

Por enquanto, vamos escrever esse script.

Em web2.example.com

vi /root/rsync_web1

#!/bin/bash
# Script para rsync dados web e e-mail entre 2 servidores balanceados
# Copyright (c) 2008 blogama.org
# Este script está licenciado sob a GNU GPL versão 2.0 ou superior
# ---------------------------------------------------------------------
### Este script tem 2 propósitos ###
### 1) Verificar conexão na porta 25 com o servidor mestre e então rsync e-mail ###
### 2) Verificar conexão na porta 80 com o servidor mestre e então rsync dados www ###
### Para ser modificado ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"

###### Não faça modificações abaixo ######
### Binários ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### Para restaurar ao original quando o problema for corrigido ###
if [ $1 ]; then
  if [ $1=="fix" ]; then
    if [ -f smtp_down.txt ]; then
      rm /root/smtp_down.txt
    fi
    if [ -f www_down.txt ]; then
      rm /root/www_down.txt
    fi
  fi
fi
####################SMTP####################
### Se já notificado sobre problema SMTP, saia ###
cd /root
if [ -f smtp_down.txt ]; then
  exit 1;
fi
### Verifique se o servidor 1 está respondendo no SMTP. Se sim, rsync e-mail ###
### Se o servidor 1 estiver fora do ar, não pode rsync --delete servidor 2 com 1 ###
### Deve resincronizar servidor1 com 2 (sem excluir) e executar /root/sync fix ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $SMTPPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  $RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_mail.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $MAILRSYNCUSER@$MASTERSERVERIP:$MAILDIR $MAILDIR
else
  echo "Servidor 1 fora do ar. Sincronização de e-mail não está mais funcionando" > /root/smtp_down.txt
  $MAIL -s "Servidor 1 fora do ar porta 25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### Se já notificado sobre problema HTTP, saia ###
cd /root
if [ -f http_down.txt ]; then
  exit 1;
fi
### Verifique se o servidor 1 está respondendo no HTTP. Se sim, rsync dados www ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $WEBPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  $RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_www.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $WWWRSYNCUSER@$MASTERSERVERIP:$WWWDIR $WWWDIR
else
  echo "Servidor 1 fora do ar. Sincronização WWW não está mais funcionando" > /root/http_down.txt
  $MAIL -s "Servidor 1 fora do ar porta 80" $EMAIL < /root/http_down.txt
fi

E torne este arquivo executável:

chmod +x /root/rsync_web1

Claro que você pode colocar o que quiser nesses arquivos ;) Se você não colocar a barra, ele ignorará a palavra-chave recursivamente (ex: *.gz), se você colocar a barra, é para um local preciso (ex: /example/ssl/).

Agora adicionamos o script ao nosso crontab fazendo o seguinte:

crontab -e

e adicione esta linha:

[...]
*/5 * * * * /root/rsync_web1  >/dev/null 2>&1
[...]

Isso irá executá-lo a cada 5 minutos, claro que você pode mudar isso conforme suas necessidades.

14.6 E se web1.example.com estiver fora do ar

De maneira geral, se web1.example.com estiver fora do ar, você deve:

  1. rsync WEB1 PARA WEB2 sem o comando –delete:

web1.example.com

rsync -avz [email protected]:/var/www/ /var/www/
rsync -avz [email protected]:/home/vmail/ /home/vmail/

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.