Transferindo milhões de arquivos de um servidor para outro

15

Eu tenho dois servidores. Um deles possui 15 milhões de arquivos de texto (cerca de 40 GB). Estou tentando transferi-los para outro servidor. Pensei em compactá-los e transferir o arquivo, mas percebi que essa não é uma boa ideia.

Então, eu usei o seguinte comando:

scp -r usrname@ip-address:/var/www/html/txt /var/www/html/txt

Mas notei que esse comando apenas transfere cerca de 50.000 arquivos e a conexão é perdida.

Existe alguma solução melhor que me permita transferir toda a coleção de arquivos? Eu pretendo usar algo como rsynctransferir os arquivos que não foram transferidos quando a conexão foi perdida. Quando outra interrupção de conexão ocorresse, eu digitaria o comando novamente para transferir arquivos, ignorando aqueles que já foram transferidos com sucesso.

Isso não é possível com scp, porque sempre começa no primeiro arquivo.

yuli chika
fonte

Respostas:

33

Como você diz, use rsync:

rsync -azP /var/www/html/txt/ username@ip-address:/var/www/html/txt

As opções são:

-a : enables archive mode, which preserves symbolic links and works recursively
-z : compress the data transfer to minimise network usage
-P : to display a progress bar and enables you to resume partial transfers

Como @aim diz em sua resposta, verifique se você tem um rastreamento /no diretório de origem (em ambos também está bem).

Mais informações na página do manual

garethTheRed
fonte
1
Sugiro adicionar a -hbandeira para usar unidades legíveis por humanos. E se você quiser mais verbosidade, você tem algumas opções: -ie / ou -v/ -vv.
precisa saber é o seguinte
2
Geralmente, há muito pouco motivo para nem sempre usar o rsync em vez do scp. Seu uso básico é o mesmo e oferece muitos recursos úteis adicionais.
Pimlottc
se sshnão é uma opção para você e você não precisa ou quer a criptografia, você pode tentar o meu script s3.amazonaws.com/skaperen/rsend
Skaperen
7

Basta usar o rsync sobre ssh!

rsync -av username@ip:/var/www/html/txt /var/www/html/

Na página do manual:

-a , - archive : Isso é equivalente a -rlptgoD. É uma maneira rápida de dizer que você deseja recursão e deseja preservar quase tudo (com -H sendo uma omissão notável). A única exceção à equivalência acima é quando --files-from é especificado, caso em que -r não está implícito.

-v , - verbose : Esta opção aumenta a quantidade de informações que você recebe durante a transferência. Por padrão, o rsync funciona silenciosamente. Um único -v fornecerá informações sobre quais arquivos estão sendo transferidos e um breve resumo no final. As duas opções -v fornecerão informações sobre quais arquivos estão sendo ignorados e um pouco mais de informações no final. Mais de duas opções -v devem ser usadas apenas se você estiver depurando o rsync.

Observe como eu usei barras no final das pastas - é importante .

alvo
fonte
Você provavelmente deve adicionar mais informações sobre o significado da barra final. Na rsyncpágina do manual: "Uma barra final na fonte altera esse comportamento para evitar a criação de um nível de diretório adicional no destino. Você pode pensar em uma fonte final / na origem como significando" copiar o conteúdo deste diretório "em vez de" copie o diretório pelo nome ", mas nos dois casos os atributos do diretório que contém são transferidos para o diretório que contém o destino".
usar o seguinte código
... e o significado das bandeiras -av?
precisa
0

Use o lftp, muito mais rápido que o rsync e o melhor para espelhar sites (muitos arquivos pequenos). Também pode transferir em paralelo usando várias conexões:

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'

Se uma conexão quebrar, ela será reconectada e continuará. Se você interromper a transferência, ela ignorará os arquivos existentes e continuará.

http://lftp.yar.ru/

Mihajlo
fonte
0

Outra maneira é canalizar um arquivo tar (opcionalmente compactado) sobre o ssh:

tar -czf - ./* | ssh other.host.foo "cd /tmp; tar -xzf-"
jmullee
fonte