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.


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.


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.

4

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


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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.