transfere muitos arquivos similares sobre o ssh

2

Um serviço em um servidor linux só é capaz de fazer backups completos, onde cada backup é um arquivo .tar (sem compactação). Muitos conteúdos do arquivo não mudam de dia para dia. Cada tamanho de arquivo .tar é de cerca de 3 GB (aumentando lentamente de dia para dia).

Eu quero transferir os backups para outro servidor, que os arquiva. A transferência é feita pela internet.

Um requisito é que os backups não sejam alterados (o resultado é novamente uma lista de arquivos .tar, cuja soma md5 ainda é idêntica aos arquivos originais no servidor).

Atualmente, estou usando o rsync para transferir os arquivos, o que funciona muito bem, mas todos os arquivos são transferidos com o tamanho total. Tanto quanto eu sei rsync faz algum tipo de deduplicação em transferências, mas apenas em um nível por arquivo (certo?).

Existe alguma maneira de transferir alguns arquivos semelhantes através de uma conexão SSH sem retransmitir pedaços idênticos dos arquivos (então algum tipo de reduplicação), que

  • não requer acesso de gravação no servidor (não é necessário descompactar os arquivos tar)
  • é tolerante a perdas de conexão (não deixa arquivos temporários em abortos e detecta arquivos não transmitidos corretamente)
  • é capaz de retomar a transferência após perdas de conexão (não retransmitir todos os arquivos se a conexão for interrompida)
  • não requer ferramentas adicionais no servidor (além do conjunto de ferramentas unix padrão incluindo rsync)
  • ainda usa uma conexão SSH iniciada pelo cliente para a transferência
por muffel 23.07.2015 / 11:55

2 respostas

2

Uma coisa que você pode fazer é (no lado de recepção) copiar o último arquivo de backup para o novo nome antes de iniciar o rsync. Então, ele transferirá apenas os diffs entre o que você tem e o que você deve ter.

Se você fizer isso, tenha cuidado se tiver rsync -u (somente atualização, com base no registro de data e hora) para garantir que sua cópia seja mais antiga que o novo arquivo de origem.

    
por 23.07.2015 / 12:14
2

Uma ideia possível, a partir de Roland (Cybso) Tapken , é usar rsync --fuzzy com diretórios por data

Put the archive in directories named by the date and called current.tar and parent.tar, where parent.tar is a hardlink to the previous current.tar. In conjunction with --hard-links this should work, since the Levenshtein Distance of current.tar and parent.tar is below 25 (actually it is 3). Of course, source and target filesystems have to support hardlinks, and you must ensure that parent.tar is transmitted before current.tar.

Eu interpreto isso como (completamente não testado):

cd $backups
dir=$(date +%s)
latest=$(ls | tail -n 1)   # N.B. we control names in this directory!
mkdir $dir
ln $latest/01-current.tar $dir/01-parent.tar
$do_backup > $dir/02-current.tar
rsync -arz --fuzzy --hard-links ./ $server/backups/

A linha rsync acima pode ser executada novamente se falhar e deve continuar de onde parou. Eu nomeei os arquivos no diretório diário com prefixos numéricos para encorajar a transferência do arquivo principal primeiro. Eu propositalmente não incluí o --delete , para que os diretórios totalmente transferidos pudessem ser removidos com segurança do cliente e os backups permanecessem no servidor.

Você deve acabar com uma estrutura de diretórios como esta:

$backups
  1437502724
    02-current.tar-\
  1437589112       |
    01-parent.tar--/
    02-current.tar---\
  1437675488         |
    01-parent.tar----/
    02-current.tar

onde as linhas de conexão indicam links físicos (ou seja, o mesmo inode).

    
por 23.07.2015 / 14:27