você está aqui: Home  → Arquivo de Mensagens

Criando backups incrementais usando rsync e hardlinks

Colaboração: Marcelo Gonçalves Diotto

Data de Publicação: 09 de março de 2011

Há algum tempo estou testando ferramentas de backups para o linux, já testei várias ferramentas de backup e a que mais tinha me agradado até o momento era a rdiff-backup.

O rdiff-backup é uma ferramenta de backup diferencial que, na primeira vez que é executada realiza um espelho do diretório a ser copiado (algo similar ao rsync), nas próximas vezes que ele é executado ele realiza uma comparação entre o último backup feito e os dados atuais, realizando somente um backup das diferenças, com isso economiza-se espaço do servidor e pode-se ter a possibilidade de restaurar o backup de vários dias diferentes de seus dados, algo parecido com o que o TimeMachine do Mac faz.

O problema é que, embora eficiente, o rdiff-backup depende do software instalado tanto no cliente quando no servidor e normalmente suas versões não são compatíveis, sendo assim muitas vezes torna-se necessário baixar uma versão específica e compilá-la manualmente.

Outro problema é que a restauração de dados antigos não é são simples, é necessário utilizar o próprio rdiff-backup para isso e a restauração é um pouco demorada.

Não contente resolvi fazer alguns testes de backups diferenciais usando o rsync e links simbólicos. Com isso criei uma ferramenta denominada bkptool que é capaz de realizar backups diferenciais usando o recurso de hardlinks e com o rsync trabalhando pra fazer a sincronização.

O intuito da ferramenta é bem simples, basicamente você deve rodá-la passando três parametros, como no exemplo a seguir:

  # bkptool /var/www/ /backup/ www

O primeiro parâmetro indica a pasta a ser feito o backup

O segundo parâmetro indica o destino do backup (neste caso o mapeamento via NFS de meu NAS)

O terceiro é uma indicação do id do backup

Toda vez que o comando de backup for executado será criada uma pasta dentro do destino com o nome <id>-<ano>-<mes>-<dia>-<hora>-<minuto>-<segundo>. Para o comando do exemplo acima, seriam criadas pastas como:

  www.2011-02-24-14-16-46
  www.2011-02-25-13-48-29

Deste modo quando houver a necessidade de restaurar um backup é necessário simplesmente acessar a pasta do respectivo dia e copiar seu conteúdo de volta ao destino, sem a necessidade de programas adicionais.

Download do bkptool: http://www.diotto.net/downloads/bkptool

Segue abaixo o código fonte do mesmo:

  #!/usr/bin/env bash
  ORIGEM=$1
  DESTINO=$2
  NOME=$3
  QTDE=${4:-60}
  CONTADOR=0
  PLATFORM=$(uname)
  if [ "$ORIGEM" == "" -o "$DESTINO" == "" -o "$NOME" == "" ]; then
        echo "bkptool - Ferramenta de Realização de Backups Diferenciais"
        echo
        echo "$0    [qtde=30]"
        echo
        echo " - Origem            : pasta a ser feito o backup"
        echo " - Destino           : pasta de destino do backup"
        echo " - Id                : identificador do backup, deve ser apenas uma palavra"
        echo " - Qtde (opcional)   : quantidade de backups anteriores (alám do atual) que devem ser mantidos na pasta de destino (Padrão: 30)"
        echo
        exit 1
  fi
  if [ ! -d $ORIGEM ]; then
        echo "Pasta de origem \"$ORIGEM\" inexistente"
        exit 1
  fi
  if [ ! -d $DESTINO ]; then
        echo "Pasta de destino \"$DESTINO\" inexistente"
        exit 1
  fi
  ULTIMO_BACKUP=`find $DESTINO -maxdepth 1 -name "$NOME.*" | sort -nr | head -n 1`
  find $DESTINO -maxdepth 1 -name "$NOME.*" | sort -nr | tail -n +`expr $QTDE + 1` | while read antigo; do
        rm -rf "$antigo"
  done
  ID=`date +%Y-%m-%d-%H-%M-%S`
  BACKUP_ATUAL="$DESTINO/$NOME.$ID"
  echo "- Criando pasta $BACKUP_ATUAL"
  mkdir $BACKUP_ATUAL
  if [ "$ULTIMO_BACKUP" != "" ]; then
        echo "- Copiando pasta $ULTIMO_BACKUP para $BACKUP_ATUAL"
        if [ "$PLATFORM" == "FreeBSD" ]; then
                pasta=$(pwd)
                cd $ULTIMO_BACKUP
                pax -rwl -pe . $BACKUP_ATUAL
                cd $pasta
        else
                cp -al $ULTIMO_BACKUP/. $BACKUP_ATUAL
        fi
  fi
  echo "- Executando rsync de $ORIGEM para $BACKUP_ATUAL"
  rsync -a --delete $ORIGEM/ $BACKUP_ATUAL

Espero que esta ferramenta seja útil e também peço que, quem encontrar bugs ou tiver melhorias a sugerir me enviem para que eu implante em novas versões.



 

 

Veja a relação completa dos artigos de Marcelo Gonçalves Diotto

Opinião dos Leitores

Anderson Angelote
06 Fev 2013, 12:04
Gostei do script, mas se a solução for para um servidor de backup, já fica difícil controlar, neste caso recomendo uma solução bem simples que é o BackupPc.
Tem um guia de como instalar em: http://blog.angelote.com.br/?p=75
Flavio Lopes
07 Jul 2011, 18:40
Olá,
Artigos são sempre bons para estimular o pensamento e propiciar um novo ponto de vista sobre um determinado assunto.

Não é uma crítica, absolutamemnte, mas a melhor ferramenta da atualidade para backups (e para fazê-lo de forma profissional), sem dúvida é o Bacula (www.bacula.org).

Porque estou dizendo isto? Supondo que dentro do diretório que você quer fazer o Backup, você queira excluir determinado(s) arquivo(s) e/ou diretório(s), como quem está usando seu script deveria fazer?


Carlos Dias
13 Mar 2011, 12:29
O comando "pax" qual a função dele?
Evandro Neves
13 Mar 2011, 12:27
Esse artigo é praticamente uma cópia de http://lovato.com.br/2011/02/utilizando-o-rsync-para-fazer-backup-estilo-time-machine/

Eu usei o link acima para fazer a mesma coisa em meu computador.
Francisco Neto
13 Mar 2011, 03:47
Olá

deixo a minha sugestão de uso, faubackup.

utilizo ele com o rsync (para fazer o espelho) e o faubackup para fazer o backup diferencial.

tem dado certo...recomendo.

abraço.
Francisco.
Pedro Matos
10 Mar 2011, 17:30
Excelente ferramenta, estou usando um script enorme para fazer esse mesmo trabalho e de forma mais trabalhosa.

Porem esta dando erro no CentOS:

bkptool: line 49: syntax error: unexpected end of file

O que posso fazer?
Marcelo Oliveira
10 Mar 2011, 11:02
Uso atualmente o pdumpfs para isso. Normalmente com um hd externo. Mas agora que estou migrando p/ servidores virtuais com ESXi4 nao tenho mais acesso a portas usbe e-sata. Por isso, estou pesquisando outra ferramentaspara fazer o mesmo trabalho. Achei pdumpfs-rsync mas este deu erro aqui, logo no primeiro teste e e perdi a fé. Esta ferramenta portanto caiu do céu ou melhor da Dicas-L.
Vou testar e breve. Parabéns pela implementação. Abraço
Marco D Andrade
09 Mar 2011, 21:18
Este conceito é extremamente interessante e pratico!

A alguns natais passados, eu tirei este coelho da cartola, para uma replicação de banco PostgreSQL, e me surpreendi ao encontrar uma solução já documentada com estes requisitos.

http://rsnapshot.org/

E o ponto mais interessante de todos é que mesmo em replicações de grandes arquivos o rsync faz o correto tratamento e separação!

Mas como já é sabido. A vantagem do *nix é a simplicidade com que se ligam os recursos!

Parabens pela eficiência e simplicidade com que você fez sua implementação!!

Marco Antonio
Thiago
09 Mar 2011, 14:57
Olá,

esse script pode ser usado para um backup completo do HD, e como seria para restaurar os dados nesse caso?

obrigado
Rômulo
09 Mar 2011, 07:04
Em:
echo " - Qtde (opcional) : quantidade de backups anteriores (alám do atual) que devem ser mantidos na pasta...

corrigir para: ...(além do atual)...
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script