Backup remoto + Backup automático para HD externo

Publicado por Sergio Napolitano em 18/04/2014

[ Hits: 5.536 ]

 


Backup remoto + Backup automático para HD externo



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:
  1. 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.
  2. 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

Outras dicas deste autor

Safe Port por site específico

Leitura recomendada

Como evitar problemas ao usar o Bacula

Clonezilla - Alternativa ao Norton Ghost

MEO Cloud - Como sincronizar arquivos fora da pasta local "MEOCloud"

Backup incremental com rsync

Como atualizar seu Linux Mint sem perder nada

  

Comentários
[1] Comentário enviado por napolitano em 19/04/2014 - 12:50h

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.



Contribuir com comentário