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@web2Agora 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-ptylogo 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@
web2Agora 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"
;;
esacchmod 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.5614.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
fiE 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:
- 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/
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.