Backup incremental com rsync e hardlinks
Esse artigo permanece aqui por motivos históricos. O script é funcional mas recomendo a utilização do aplicativo rsnapshot que provê funcionalidade similiar com muito mais recursos. Atualizado em 13/12/2012
Desde que assinei um VPS onde hospedo esse site e outros projetos pessoais eu venho enrolando para implementar algum tipo de backup. Meu objetivo é ter uma cópia de segurança dos sites e arquivos de configuração do servidor. Queria algo bem simples então apostei no rsync, por SSH eu sincronizava os diretórios remotos para meu disco local.
Tudo jóia até eu fazer vários backups e ver como aquilo ia consumindo espaço em disco. A cada novo backup, poucos arquivos mudavam mas eu sempre copiava tudo. Eu precisava é de um backup incremental para resolver o problema, para isso acabei montando um script que usa o rsync e a opção -l do cp para gerar hardlinks. Um hardlink não é nada mais do que um link para um inode já existente no disco, assim o hardlink e o arquivo alvo são o mesmo arquivo no file system. Sendo o mesmo arquivo eu economizo espaço.
O que o script faz é procurar um backup anterior no disco, se ele encontra cria um novo diretório feito apenas de hardlinks para esse backup anterior. Depois disso rodamos o rsync contra esse novo diretório, dessa maneira atualizamos o que foi modificado desde o último backup. Para que o novo backup reflita exatamente o que esta no servidor na data atual, rodamos o rsync com a opção --delete que remove do destino arquivos não existentes na origem.
Simples e bem eficiente, abaixo um exemplo da economia:
1 2 3 4 | |
O backup 20080907 foi o primeiro feito com rsync e tem 59MB. Para o backup 20081026 eu rodei novamente o rsync sem criar hardlinks, ou seja baixei todo o conteúdo novamente mais as diferenças, fiz 65MB de download. Para o último backup eu usei o script com hardlinks, baixei apenas a diferença em relação ao último backup, como o texto mostra, apenas 14MB. Para melhorar a coisa, o script também remove backups muito antigos.
Convencido da utilidade? Vamos ao script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | |
O que você deve configurar são as 4 primeiras variáveis.
SERVERé o servidor de onde iremos tirar esse backup.DIRS_TO_COPYé uma lista de diretórios a serem copiados desse servidor, os diretórios devem ser separados por espaço.BACKUP_DIRé o destino local do backup.RETENTIONé a retenção dos backups em dias. Backups mais antigos do que esse número serão deletados no final do script.
Para automatizar a tarefa você pode criar um job na cron. Vale lembrar que você vai precisar ter acesso via SSH sem senha ao servidor alvo dos backups para que fique 100% automático.
Comentários