O rsync --inplace grava no arquivo inteiro ou apenas nas partes que precisam ser atualizadas? (para backups btrfs + rsync)

21

Eu estava lendo vários guias sobre como combinar snapshots btrfs e rsync para criar uma solução de backup eficiente com o histórico. No entanto, tudo depende se rsync --inplacemodifica apenas as partes dos arquivos que realmente foram alteradas ou se substitui o arquivo inteiro sequencialmente. Se ele grava o arquivo inteiro, parece que o btrfs sempre criará uma nova cópia do arquivo, o que tornaria a idéia muito menos eficiente.

Petr Pudlák
fonte
Como ele saberia se pode evitar a gravação no arquivo inteiro? Não é necessário ler o arquivo inteiro primeiro, para descobrir o que mudou?
Mehrdad
2
@ Mehrdad sim, mas ler o todo não é um problema. Se rsyncler o arquivo inteiro e depois procurar e atualizar apenas as partes necessárias, o btrfs copiará apenas esses blocos atualizados. Mas se rsyncler e gravar o arquivo inteiro, será um problema.
Petr Pudlák
11
O @Mehrdad rsyncnão apenas sabe que pode evitar gravar o arquivo inteiro, mas consegue fazê-lo sem copiá-lo completamente na rede. Pequeno programa inteligente.
Gunther Piez

Respostas:

31

Se você passar o rsync dois caminhos locais, o padrão será usar "--whole-file" e não a transferência delta. Então, o que você está procurando é "--no-whole-file". Você também obtém transferência delta se solicitou '-c'.

Veja como você pode verificar:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Em seguida, toque em um arquivo e sincronize novamente

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Você pode verificar se reutilizou o inode com "ls -li", mas observe que ele enviou 64K bytes inteiros. Tente novamente com --no-whole-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Agora você enviou apenas 494 bytes. Você pode usar o strace para verificar se algum arquivo foi gravado, mas isso mostra que pelo menos foi utilizado o delta-transfer.

Observe (veja os comentários) que, para sistemas de arquivos locais, --whole-fileé assumido (consulte a página de manual do rsync). Por outro lado, através de uma rede --no-whole-fileé assumido, então --inplacepor si só se comportará como --inplace --no-whole-file.

sem data
fonte
Por que não --inplaceimplica --no-whole-file?
Geremia
De --no-whole-filequalquer maneira, o padrão não é ?
Geremia 8/08
2
@ Geremia não se os dois caminhos forem locais. E meu exemplo mostra que --inplaceisso não implica --no-whole-filena versão do rsync que eu estava usando em 2013, mas você pode repetir esse experimento com sua própria versão do rsync.
dataless
Bem, inplacenão se trata de 'procurar blocos iguais / diferentes', é apenas sobrescrever o arquivo existente imediatamente, a partir do deslocamento 0. (caso contrário, uma cópia temporária é criada, e somente então o arquivo de destino antigo é excluído e a cópia temporária renomeada Provavelmente, é considerado "mais seguro" manter o arquivo antigo o maior tempo possível, se o processo for interrompido. Claro que isso é pior para desempenho, consumo máximo de armazenamento (pense em arquivos grandes), possivelmente fragmentação ...) ...
Frank Nocke
11
Eu diria que o contrário --no-whole-filesempre implica --inplace, caso contrário, a maior parte de seu ganho de desempenho teria desaparecido. Porém, não foi possível encontrar isso documentado ...
Frank Nocke 27/02
15

Aqui está a resposta definitiva, eu acho, citando a parte correta do manual:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.
fuujuhi
fonte
4

--inplacesubstitui apenas as regiões que foram alteradas. Sempre use-o ao escrever no Btrfs.

Gabriel
fonte
E você tem uma evidência que mostra que ela não substitui outras partes dos arquivos?
Petr Pudlák
O mesmo se aplica ao ZFS?
ewwhite
@whwhite: Como o ZFS é COW (cópia na gravação) como o BTRFS, então sim.
Geremia 02/03
@ PetrPudlák -vvvmostra pular blocos correspondentes
Tom Hale
3

O algoritmo de transferência delta do rsync trata se o arquivo inteiro é transmitido ou apenas as partes que diferem. Esse é o comportamento padrão ao sincronizar novamente um arquivo entre duas máquinas para economizar largura de banda. Isso pode ser substituído pelo --whole-file(ou -W) para forçar rsynca transmissão do arquivo inteiro.

--inplacetrata se rsync, durante a transferência, criará um arquivo temporário ou não. O comportamento padrão é criar um arquivo temporário. Isso fornece uma medida de segurança: se a transferência for interrompida, o arquivo existente na máquina de destino permanecerá intacto / intocado. --inplacesubstitui esse comportamento e diz rsyncpara atualizar o arquivo existente diretamente. Com isso, você corre o risco de ter um arquivo inconsistente na máquina de destino se a transferência for interrompida.

Mike T.
fonte
2

Na página do manual:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Isso me leva a acreditar que ele escreve sobre o arquivo por inteiro - eu imagino que seria quase impossível para o rsync funcionar de outra maneira.

Laxsnor
fonte
2
Depois de determinar quais partes precisam ser atualizadas, ele pode procurar essas partes e atualizá-las, em vez de gravar o arquivo inteiro.
Petr Pudlák
0

O trabalho teórico sobre o rsync no local é descrito neste artigo .

Referência do artigo: D. Rasch e R. Burns. Rsync no local: sincronização de arquivos para dispositivos móveis e sem fio. Conferência Técnica Anual da USENIX, faixa FREENIX, 91-100, USENIX, 2003.

No link:

... Modificamos a implementação rsync existente para oferecer suporte à reconstrução no local.

Abstract: [...] modificamos o rsync para operar em dispositivos com restrição de espaço. Os arquivos no host de destino são atualizados no mesmo armazenamento que a versão atual do arquivo ocupa. Os dispositivos com restrição de espaço não podem usar o rsync tradicional porque requer memória ou armazenamento para a versão antiga e a nova do arquivo. Os exemplos incluem a sincronização de arquivos em telefones celulares e PCs portáteis, com pequenas memórias. O algoritmo rsync no local codifica a representação compactada de um arquivo em um gráfico, que é classificado topologicamente para obter a propriedade no local. [...]

Portanto, esses parecem ser os detalhes técnicos do que o rsync --inplace está fazendo. De acordo com o início do artigo:

Modificamos o rsync para que ele execute tarefas de sincronização de arquivos com reconstrução no local. [...] Em vez de usar espaço temporário, as alterações no arquivo de destino ocorrem no espaço já ocupado pela versão atual. Esta ferramenta pode ser usada para sincronizar dispositivos onde o espaço é limitado.

Como fica claro na resposta da @ dataless , isso implica que você --inplaceestá usando o mesmo espaço de armazenamento, mas ainda pode copiar o arquivo inteiro nesse espaço. Especificamente, quando são feitas cópias de / para sistemas de arquivos locais, o rsync assume a --whole-fileopção. Mas quando está em sistemas de rede, por outro lado, assume a --no-whole-fileopção.

user92979
fonte
11
Hum, então qual é a resposta?
Xen2050 18/01/19
Me desculpe. Eu não estava prestando atenção suficiente. Com a resposta da @ dataless, isso deve esclarecer as coisas.
Diagon