quarta-feira, 2 de fevereiro de 2011

Tipos de backup: Da arte de se guardar arquivos

Esses últimos dias passei por uma situação em que precisei formatar o meu notebook. Na hora de formatar, me lembrei que precisava fazer backup de vários arquivos que eu tinha guardados dentro do notebook. Em vista disso, passei várias horas copiando todos os arquivos que eu precisava para uma unidade externa antes de eu realmente poder iniciar o procedimento de formatação. Se eu tivesse backups dos meus dados, isso não seria necessário.

Muitas pessoas deveriam saber mais sobre backups pois, um dia ou outro, elas podem vir a precisar de um backup, e os motivos podem ser os mais diversos como perda ou falha do dispositivo de armazenamento, corrompimento do arquivo atual, verificação de versões anteriores, entre outras. Mas o mais importante é que com um backup de seus arquivos, você pode ficar menos preocupado com uma ocasional perda de arquivos.

Fazer um backup é simples. Você vai, copia os arquivos que você usa para outro lugar e pronto, está feito o backup. Mas e se eu alterar um arquivo? E se eu excluir acidentalmente um arquivo? E se o arquivo atual corrompeu? Bem, é aí que a coisa começa a ficar mais legal. É nessa hora que entram as estratégias de backup.Vamos falar delas com mais detalhes abaixo ...
Tipos de backup: Da arte de se guardar arquivos

Antes de mais nada, é importante decidir o que será guardado e o que não será, já que dependendo da situação, os backups poderão se tornar demorados e ocupar muito espaço...




Arquivos armazenados em mídias removíveis, que podem ser facilmente reconstruídos por ferramentas do sistema, temporários ou mesmo arquivos que possam ser danosos ao backup deveriam ser mantidos fora dessa seleção. Eu penso que arquivos do usuário e arquivos de configuração personalizados são os melhores candidatos à passarem por uma rotina de backup, o que também não impede que, em determinadas ocasiões, possa ser feito um backup de toda a pasta do usuário ou mesmo do sistema inteiro.

Decidido isso, é necessário decidir o método de backup que será aplicado. Inicialmente, existem três formas de se fazer backup: Backup completo, Integral e Diferencial.

Backup Completo

O backup completo é simplesmente fazer a cópia de todos os arquivos para o diretório de destino (ou para os dispositivos de backup correspondentes), independente de versões anteriores ou de alterações nos arquivos desde o último backup. Este tipo de backup é o tradicional e a primeira idéia que vêm à mente das pessoas quando pensam em backup: guardar TODAS as informações.

Outra característica do backup completo é que ele é o ponto de início dos outros métodos citados abaixo. Todos usam este backup para assinalar as alterações que deverão ser salvas em cada um dos métodos.

A vantagem dessa solução é a facilidade para localizar arquivos que porventura devam ser restaurados. A grande desvantagem dessa abordagem é que leva-se muito tempo fazendo a cópia de arquivos, quando poucos destes foram efetivamente alterados desde o último backup.

Backup Incremental

Primeiramente, os backups incrementais são muito mais eficientes que os backups completos. Isto acontece porque um backup incremental só efetivamente copia os arquivos que foram alterados desde o último backup efetuado (incremental ou diferencial). Todo backup incremental se inicia a partir de um backup completo e a partir dele pode se criar os backups incrementais. Para restaurar os arquivos, você precisará do backup mais atual e de todos os backups anteriores desde o último backup completo.

A vantagem dessa solução é a economia tanto de espaço de armazenamento quanto de tempo de backup, já que o backup só será feito dos arquivos alterados desde o último backup. A desvantagem é que para procurar e restaurar os arquivos, se gasta muito tempo recriando a estrutura original, que se encontra espalhada entre vários backups diferentes, o que pode tornar o processo lento e suscetível à riscos, se houver algum problema em um dos backups incrementais entre o backup completo e o último backup incremental.

Backup Diferencial

Da mesma forma que o backup incremental, o backup diferencial também só copia arquivos alterados desde o último backup. No entanto, a diferença deste para o integral é o de que cada backup diferencial mapeia as alterações em relação ao último backup completo.

Como o backup diferencial é feito com base nas alterações desde o último backup completo, a cada alteração de arquivos, o tamanho do backup vai aumentando, progressivamente. Em determinado momento pode ser necessário fazer um novo backup completo pois nesta situação o backup diferencial pode muitas vezes ultrapassar o tamanho do backup integral.

Em relação ao backup completo, ele é mais rápido e salva espaço e é mais simples de restaurar que os backups incrementais. A desvantagem é que vários arquivos que foram alterados desde o último backup completo serão repetidamente copiados.

Backup Delta

Este tipo de backup armazena a diferença entre as versões correntes e anteriores dos arquivos. Este tipo de backup começa a partir de um backup completo e, a partir daí, a cada novo backup são copiados somente os arquivos que foram alterados enquanto são criados hardlinks para os arquivos que não foram alterados desde o último backup. Esta é a técnica utilizada pela Time Machine da Apple e por ferramentas como o rsync.

A grande vantagem desta técnica é que ao fazer uso de hardlinks para os arquivos que não foram alterados, restaurar um backup de uma versão atual é o equivalente à restaurar o último backup, com a vantagem que todas as alterações de arquivos desde o último backup completo são preservadas na forma de histórico. A desvantagem deste sistema é a dificuldade de se reproduzir esta técnica em unidades e sistemas de arquivo que não suportem hardlinks.

Melhor Solução



Não existe uma solução perfeita em termos de backup. As quatro formas têm suas vantagens e desvantagens e cabe a cada administrador escolher a forma que menos impacta no funcionamento das máquinas. Em situações onde ocorrem poucas alterações de arquivos, uma situação de backup diferencial pode ser uma boa pedida enquanto em situações em que muitos arquivos são alterados seguidas vezes, uma solução baseada no backup delta pode ser uma excelente opção. Cabe a você decidir!

Usando o rsync para fazer backup

Depois dessa explicação, vamos para a prática!

Alguns devem conhecer a ferramenta rsync para fazer transferências e sincronia de pastas de arquivos. O rsync é um grande aliado na hora de fazer backups ou quando é necessário sincronizar duas pastas com um grande volume de arquivos. Ele permite sincronizar o conteúdo de duas pastas, transferindo apenas as modificações. Ele não trabalha apenas comparando arquivo por arquivo, mas também comparando o conteúdo de cada um. Se apenas uma pequena parte do arquivo foi alterada, o rsync transferirá apenas ela, sem copiar novamente todo o arquivo.

Como vimos anteriormente, existem diversas formas de se fazer backup de arquivos, e todas elas podem ser reproduzidas facilmente usando o rsync. Veja abaixo cada uma das formas:

Backup completo:


rsync -av --delete origem bk_completo
Backups incrementais:


rsync -av --delete origem bk_completo rsync -aWPv --delete --compare-dest=bk_completo origem bk_inc_1 rsync -aWPv --delete --compare-dest=bk_inc_1 origem bk_inc_2 ... e assim por diante ...
Backups diferenciais:


rsync -av --delete origem bk_completo rsync -aWPv --delete --compare-dest=bk_completo origem bk_inc_1 rsync -aWPv --delete --compare-dest=bk_completo origem bk_inc_2 ... e assim por diante ...
Backup Delta:


rsync -av --delete origem bk_completo rsync -aPv --delete --link-dest=bk_completo origem bk_inc_1 rsync -aPv --delete --link-dest=bk_inc_1 origem bk_inc_2
Onde cada parâmetro significa:

-a - Significa arquivar e inclui uma série de parâmetros para percorrer diretórios, copiar links simbólicos, preservar permissões, datas de modificação, proprietário, grupo e ainda preserva arquivos que representam dispositivos ou fifos.

-W - Copia arquivos por inteiro, desconsiderando o algoritmo delta-xfer.

-P - Faz com que o rsync continue transmissões interrompidas e e mostre o status para cada arquivo.

--compare-dest=DIR - O rsync utiliza o diretório DIR como base para verificar alterações nos arquivos. Caso haja arquivos novos ou alterados, somente estes são copiados.

--link-dest=DIR - O rsync utiliza o diretório DIR como base para verificar alterações nos arquivos. Caso os arquivos sejam novos ou alterados, estes são copiados. Caso contrário, são criados hard links para os arquivos originais do diretório DIR.

--delete - Faz com que, caso um arquivo seja deletado na origem, ele seja apagado do backup.

Script Completo

Para facilitar as coisas, eu escrevi um script de backup que implementa as quatro soluções citadas:


#!/bin/bash

# timemachine - Um script para fazer backups
# Vindemiatrix Almuredin

TIPO=$1
ORIGEM=$2
DESTINO=$3
TIME=$(date +"%d-%m-%Y_%H:%M:%S")

# Função que cria um backup completo e cria os links simbólicos full e current
completo() {
  rsync -av --delete $ORIGEM $DESTINO/bk-full-$TIME >> $DESTINO/backup.log
  ln -sv $DESTINO/bk-full-$TIME $DESTINO/current >> $DESTINO/backup.log
  ln -sv $DESTINO/bk-full-$TIME $DESTINO/full >> $DESTINO/backup.log
}

# Função que cria um backup incremental a partir da versão current
incremental() {
  if [ -d $DESTINO/current ] then
    rsync -aWPv --delete --compare-dest=$DESTINO/current $ORIGEM $DESTINO/bk-inc-$TIME >> $DESTINO/backup.log
    ln -sv $DESTINO/bk-inc-$TIME $DESTINO/current >> $DESTINO/backup.log
  else
    echo "Crie pelo menos um backup completo!"
    exit -1
  fi
}

# Função que cria um backup diferencial a partir da versão full
diferencial() {
  if [ -d $DESTINO/current -a -d $DESTINO/full ] then
    rsync -aWPv --delete --compare-dest=$DESTINO/full $ORIGEM $DESTINO/bk-diff-$TIME >> $DESTINO/backup.log
    ln -sv $DESTINO/bk-diff-$TIME $DESTINO/current >> $DESTINO/backup.log
  else
    echo "Crie pelo menos um backup completo!"
    exit -1
  fi
}

# Função que cria um backup delta a partir da versão current
delta() {
  if [ -d $DESTINO/current ] then
    rsync -aWPv --delete --link-dest=$DESTINO/current $ORIGEM $DESTINO/bk-delta-$TIME >> $DESTINO/backup.log
    ln -s $DESTINO/bk-delta-$TIME $DESTINO/current >> $DESTINO/backup.log
  else
    echo "Crie pelo menos um backup completo!"
    exit -1
  fi
}

comousar() {
  echo "timemachine versão 0.1a" 
  echo "Copyright (C) 2011 by Eduardo Rolim."
  echo ""
  echo "timemachine comes with ABSOLUTELY NO WARRANTY.  This is free software, and you"
  echo "are welcome to redistribute it under certain conditions.  See the GNU"
  echo "General Public Licence for details."
  echo "" echo "timemachine é um programa capaz de fazer backup de pastas de diversas formas"
  echo "utilizando o rsync como base."
  echo "Veja mais sobre o script em http://tocadoelfo.blogspot.com"
  echo ""
  echo "Uso: timemachine [OPCAO] ORIGEM DESTINO"
  echo "Opções"
  echo " -f  cria um backup completo de ORIGEM para dentro de destino"
  echo " -i  cria um backup incremental de ORIGEM a partir do backup mais recente, dentro de DESTINO"
  echo " -d  cria um backup diferencial de ORIGEM a partir do backup completo, dentro de DESTINO"
  echo " -r  cria um backup estilo Apple Time Machine ORIGEM a partir do backup mais recente, dentro de DESTINO"
  echo ""
}

case $1 in
  -f )
    completo
    exit
    ;;

  -i )
    incremental
    exit
    ;;
    
  -d )
    diferencial
    exit
    ;;
    
  -r )
    delta
    exit
    ;;
    
  -h )
    comousar
    exit
    ;;
esac
comousar
Bom, é isso pessoal. Espero que este post ajude bastante! Até um outro post!

Referências:

http://www.bench3.com/2010/01/different-types-of-backup-full.html

http://blog.interlinked.org/tutorials/rsync_time_machine.html

http://blog.jphoude.qc.ca/2007/12/01/simple-incremental-backup-rsync-ssh/

http://www.linuxquestions.org/questions/linux-server-73/theory-behind-full-differential-and-incremental-backups-647568/

http://en.wikipedia.org/wiki/Backup