Maneira correta de criar um espelho rsyncable comprimido de um diretório?

2

Eu gostaria de criar um espelho compactado de alguns diretórios de tal forma que ele possa ser rsynced novamente, tanto do destino original quanto para um destino remoto.

Eu posso fazer isso de maneira ineficiente em duas etapas:

rsync -a /source/ /compressed-mirror/
gzip --recursive --rsyncable --force /compressed-mirror/
# later: rsync -a /compressed-mirror/ remote:/another-compressed-mirror/

O problema é que, se eu executar novamente o primeiro rsync para atualizar o espelho, ele precisará copiar e gzipar todos os arquivos de origem novamente, mesmo que apenas alguns deles tenham sido alterados.

Pergunta: Existe alguma outra maneira de fazer isso que minimize a quantidade de transferência de dados e o uso do disco rígido necessário a cada atualização?

Notas:

  • Eu não estou preso no gzip para compactação - eu escolhi apenas porque ele permite que os arquivos compactados sejam rsynced.

  • O objetivo do espelho compactado local é minimizar o tempo de "rede para cima" necessário para fazer o rsync no espelho remoto, já que a conexão à Internet e o estado de energia da máquina de origem (um laptop) não são confiáveis . Algumas partes do espelho local são criptografadas antes do rsync para o espelho remoto. O espelho remoto é então versionado com rsnapshot e carregado para outro servidor remoto através de uma conexão de internet muito mais estável.

Atualizações / ideias:

  • Use a compactação do sistema de arquivos (consulte os comentários do cas), mas isso força o rsync a compactar novamente os arquivos ao transferi-los para o servidor remoto, o que parece redundante.
  • Mantenha o diretório rsync'd descompactado. Cada vez que o rsync o atualiza, registre os arquivos que foram alterados. Para cada arquivo alterado, crie individualmente uma cópia compactada (ou exclua-a) no espelho compactado. Mas a próxima ideia faz a mesma coisa com mais eficiência:
  • Mantenha uma lista de caminhos de arquivo e tamanhos de arquivo (ou somas de verificação) na origem. Em cada atualização, faça uma nova lista e compare-a com a lista antiga. Para cada arquivo alterado, crie individualmente uma cópia compactada (ou exclua) no primeiro espelho compactado usando gzip < source/path/file > mirror/path/file.gz . Esta parece ser a solução mais eficiente até agora.
por Oleg 21.07.2016 / 01:42

1 resposta

1

A maneira mais eficiente de manipular seu requisito pode ser NÃO compactar o destino do espelho intermediário. Isso permitirá que rsync use seu algoritmo delta entre o host local e remoto para transferir apenas dados alterados. (O algoritmo delta não se aplica ao copiar entre dois diretórios no mesmo host, no entanto.)

# Any changed files will be copied completely, even if only one byte changed
rsync -a --delete /source/ /mirror/

# Only copy changed parts of changed files
rsync -az --delete /mirror/ remote:/mirror/

A solução mais eficiente (em termos de acesso ao disco rígido local e rede intermediária) seria dispensar completamente o espelho local e copiar diretamente da sua origem para o destino remoto:

# Only copy changed parts of changed files
rsync -az --delete /source/ remote:/mirror/
    
por 17.12.2016 / 01:24