Segue o resultado de uma brincadeira que acabou atendendo a um ambiente de produção. A solução é bem simples e pouco sofisticada. Conforme citado, surgiu de uma brincadeira minha.
Cenário: servidores exportando backup local para compartilhamento NFS. O servidor NFS envia o backup automaticamente para HD externo, quando este é plugado.
Requerido: servidor NFS e clientes devidamente configurados. Se necessário, lance no Google e aprenda. (site:
Viva o Linux) || (site:
Guia do Hardware) servidor nfs
De acordo com a criatividade de cada um, deve existir N maneiras de fazer o proposto. Segue uma delas:
- Primeiro script (backup_semanal.sh): exporta backup local para compartilhamento NFS e mantém histórico organizado de até uma semana. Pode ser ajustado de acordo com a criatividade.
- Segundo script (backup_auto.sh): exporta backup do servidor NFS para HD externo quando este for "espetado" no servidor. Também mantém histórico organizado de até dois backups na mídia externa. Pode ser ajustado de acordo com a criatividade.
Para os clientes, é necessário agendar na crontab do usuário root (ou, outro que tenha recebido permissão) o backup para ser executado em um determinado horário do dia (ou da noite).
Exemplo:
# crontab -e
00 19 * * * /path_do_script/backup_semanal.sh
Para o servidor NFS, onde será colocado a mídia externa, o agendamento é feito para executar a cada 10 minutos, a fim de detectar se a mídia foi plugada. Este tempo pode ser alterado conforme sua necessidade.
O horário que o backup pode ser startado deve ser calculado, considerando o término do backup dos clientes:
# crontab -e
*/10 * * * * /path_do_script/backup_auto.sh
Os backups devem ser executados no mesmo dia, ou essa diferença deve ser tratada no script
Havendo recursos, não vejo problemas que este backup seja agendado para executar durante o dia. Para isso, basta ajustar os horários no crontab.
backup_semanal.sh (clientes):
#!/bin/bash
SEM_ANT=$(expr $(date +%W) - 1)
DIA_ATU=$(date +%u)
OLD1=$(expr $(date +%u) + 3)
OLD2=$(expr $(date +%u) - 3)
SEM_ATU="semana$(date +%W)"
SEM_ANT="semana$(expr $(date +%W) - 1)"
DIR_BACKUP="/DIRETORIO/A/SER/COPIADO"
##LIMPEZA, MANTENDO HISTÓRICO DE 7 DIAS
if [ $DIA -eq 7 ] ; then
rm -rf /mnt/backup_externo/$SEM_ANT
fi
rm -rf /mnt/backup_externo/$SEM_ANT/$DIA
#COPIA DO DIA
mkdir -p /mnt/backup_externo/$SEM_ATU/$DIA_ATU
cp -r $DIR_BACKUP /mnt/backup_externo/$SEM_ATU/$DIA_ATU
backup_auto.sh (servidor NFS):
## ORIGEM RECEBE A LISTA DE COMPARTILHAMENTOS NFS
ORIGEM="server1 server2 server3"
## CHEGUEI A USAR 7 HDS, SENDO 1 POR DIA DA SEMANA. OS HDS FORAM ROTULADOS DE ACORDO COM O DIA
## CONSULTE e2label, ntfslabel OU A FERRAMENTA REFERENTE AO FILESYSTEM APLICADO NO HD EXTERNO.
DEVICE=$(blkid | grep "BACKUP$(date +%u)" | awk -F: '{print $1}')
ROTULO=$(blkid | grep "BACKUP$(date +%u)" | awk -F"LABEL=" '{print $2}' | awk -F'"' '{print $2}' | awk -F'"' '{print $1}')
DIA=$(date +%u)
OLD1=$(expr $(date +%u) + 3)
OLD2=$(expr $(date +%u) - 3)
SEM_ATU="semana$(date +%W)"
SEM_ANT="semana$(expr $(date +%W) - 1)"
## OPCIONALMENTE PODE SER USADA A LIMPEZA AQUI E NÃO ATRAVÉS DOS CLIENTES
## EXEMPLO COMENTADO ONDE SE MANTÉM HISTÓRICO DE 3 DIAS APENAS
#if [ $DIA -le 3 ] ; then
# rm -rf /sharenfs/{server1,server2,server3}/$SEM_ANT/$OLD1
#fi
#if [ $DIA -ge 3 ] ; then
# rm -rf /sharenfs/{server1,server2,server3}/$SEM_ATU/$OLD2
#fi
#if [ $DIA -eq 7 ] ; then
# rm -rf /sharenfs/{server1,server2,server3}/$SEM_ANT
#fi
## CONTROLE SE O BACKUP JÁ FOI EFETUADO
if [ -e /var/run/backup$DIA ] ; then
echo "arquivo /var/run/backup$DIA existe" > /tmp/log_bkp
exit
fi
## SÓ FAZ O BACKUP SE O ROTULO DA MIDIA CORRESPONDER AO DIA
test "$ROTULO" = "BACKUP$(date +%u)"
if [ $? -eq 0 ] ; then
rm -rf /var/run/backup*
touch /var/run/backup$DIA
mkdir -p /externo/1
mount $DEVICE /externo/1
rm -rf /externo/1/backup_old
if [ -e /externo/1/backup ] ; then
mv /externo/1/backup /externo/1/backup_old
fi
mkdir -p /externo/1/backup
for i in $ORIGEM ; do
mkdir -p /externo/1/backup/$i/$SEM_ATU
cp -r /sharenfs/$i/$SEM_ATU/$DIA /externo/1/backup/$i/$SEM_ATU
done
umount /externo/1
fi
Seguem algumas correções/adições:
-Correção na dork de busca sobre servidor NFS (foi perdida com a formatação):
(site:vivaolinux.com.br) || (site:hardware.com.br) servidor nfs
-Afim de não precisar se preocupar com o horário que irá plugar o hd externo, é possível adicionar uma verificação para saber se a cópia dos clientes terminou ou não. Basta usar a mesma lógica de verificação feita no servidor para saber se o backup do dia já foi copiado para o hd externo.
Para isso, os clientes irão criar um arquivo de controle no compartilhamento fornecido pelo servidor. O servidor verifica neste(s) arquivos se os clientes já terminaram de copiar, se não terminaram o script do servidor é finalizado. (se não conseguir mande o ponto que travou pra que possa ser ajudado)
-Outro ponto que ainda pode ser acrescentado é adicionar uma entrada para enviar email ou sms para o admin assim que o backup terminar. (ver
http://www.vivaolinux.com.br/artigo/Enviar-email-pelo-terminal-com-mutt ou
http://www.vivaolinux.com.br/artigo/Monitorar-servidores-e-enviar-alertas-por-e-mail-e-SMS)
Abraços e espero que ajude.