Permitindo que vários rsyncs simultâneos sejam tocados juntos

1

Todo dia eu preciso copiar N arquivos de um local de origem para um espelho em um horário específico (onde N é muito grande). Digamos que eu diga a várias CPUs para executar um rsync simultaneamente em um subconjunto dos arquivos (a largura de banda da rede e do disco não é um problema). Idealmente, cada CPU seria responsável por um subconjunto separado dos N arquivos, mas, na prática, às vezes é difícil garantir isso. (Alguns dos arquivos de origem podem ser "reivindicados" por mais de uma CPU.) Como resultado, às vezes, o rsync I e o rsync J tentarão copiar o arquivo F ao mesmo tempo.

Usando rsync -avz --delete --temp-dir=/tmp remote:/path/to/source/ /path/to/dest/ , digamos que os rsyncs I e J vêem essa situação para começar:

/path/to/source/:
    FileA
    FileB
    FileC

/path/to/dest/:
    FileA

Cada rsync acha que precisa copiar os arquivos B e C, e cada um começa a fazer isso, primeiro para /tmp/name_of_source_file.temp_suffix . Digamos que eu termine primeiro e mova seu arquivo temporário para /path/to/dest/FileB . Agora a situação é:

/path/to/dest/:
    FileA
    FileB

/tmp/:
    FileB.rsyncJsuffix

Agora, o rsync J termina de copiar, mas gera um erro quando tenta mover sua versão do FileB para /path/to/dest/ , porque já existe outro arquivo B que ele não viu quando foi iniciado.

Uma das várias opções do rsync de alguma forma lida com essa situação? Idealmente, eu gostaria de uma opção que diga ao rsync: "Acredite em si mesmo. Você não pode fazer nada errado. Sinta-se à vontade para sobrescrever qualquer coisa que seu pequeno coração desejar." para que não se queixasse do FileB que apareceu de repente no meio da execução.

Pensamentos?

    
por dg99 01.06.2011 / 23:38

2 respostas

0

Eu não sei por que você está rodando rsyncs de maneira que você está rodando, mas se eu fosse você eu consideraria seriamente outras formas de resolver o problema que não envolvem ter múltiplos rsyncs escrevendo para a mesma árvore de arquivos ao mesmo tempo.

Isto é da página man do rsync na seção --temp-dir:

If you are using this option for reasons other than a shortage of disk space, you may wish to combine it with the --delay- updates option, which will ensure that all copied files get put into subdirectories in the destination hierarchy, awaiting the end of the transfer. If you donât have enough room to duplicate all the arriving files on the destination partition, another way to tell rsync that you arenât overly concerned about disk space is to use the --partial-dir option with a relative path; because this tells rsync that it is OK to stash off a copy of a single file in a subdir in the destination hierarchy, rsync will use the partial-dir as a staging area to bring over the copied file, and then rename it into place from there. (Specifying a --par- tial-dir with an absolute path does not have this side-effect.)

    
por 02.06.2011 / 00:49
-1

Dado que você tem alguma estrutura de diretório com alguns diretórios vazios, e alguns arquivos e você quer sua cópia de arquivamento - o que eu tentaria é executar o rsync com o paralelo:

  1. recriar a mesma estrutura de diretório

find /source/dir -type f|parallel mkdir -p dest/dir/{//}

  1. arquivos rsync:

find /source/dir -type f|parallel rsync -a {} /dest/dir/{}

  1. execute um rsync para obter dirs vazios e verifique se tudo está bem

rsync -av /source/dir /dest/dir

    
por 09.01.2015 / 22:47

Tags