A melhor maneira de copiar milhões de arquivos entre dois servidores

38

Tenho cerca de 5 milhões de pequenos arquivos (5-30k) em um único diretório que gostaria de copiar para outra máquina na mesma rede gigabit. Eu tentei usar rsync, mas iria abrandar para um rastreamento depois de algumas horas de execução, eu suponho devido ao fato de que o rsync tem que verificar a fonte & arquivo de destino de cada vez?

Meu segundo pensamento seria usar scp, mas queria sair de opinião para ver se havia uma maneira melhor. Obrigado!

    
por 2 revs, 2 users 100%noaheverett 16.11.2012 / 00:08

17 respostas

40

Algo como isso deve funcionar bem:

tar c some/dir | gzip - |  ssh host2 tar xz

Talvez também omita o gzip e o sinalizador "z" para extração, já que você está em uma rede gigabit.

    
por 22.01.2009 / 04:48
18

Tenho certeza de que o fato de você ter todos os arquivos FIVE MILHÕES em um único diretório irá deixar muitas ferramentas em estado de confusão. Eu não estou surpreso que o rsync não tenha lidado com isso graciosamente - é uma situação bastante "única". Se você pudesse descobrir uma maneira de estruturar os arquivos em algum tipo de estrutura de diretórios, tenho certeza de que as ferramentas de sincronização padrão, como o rsync, seriam muito mais responsivas.

No entanto, apenas para dar alguns conselhos reais - talvez uma solução seria mover a unidade fisicamente para a máquina de destino temporariamente para que você possa fazer uma cópia dos arquivos no servidor real (não através da rede). Em seguida, mova a unidade de volta e use o rsync para manter as coisas atualizadas.

    
por 22.01.2009 / 04:41
11

Para copiar milhões de arquivos em um comutador gigabit (em um ambiente confiável), você também pode usar uma combinação de netcat (or nc) e tar , conforme já sugerido pelo usuário55286. Isto irá transmitir todos os arquivos como um arquivo grande (veja Cópia rápida de arquivos - Linux! (39 GBs) ).

# requires netcat on both servers
nc -l -p 2342 | tar -C /target/dir -xzf -   # destination box
tar -cz /source/dir | nc Target_Box 2342    # source box
    
por 11.02.2013 / 17:13
5

Tivemos cerca de 1 milhão de arquivos em um diretório (cerca de 4 anos de arquivos).

E usamos o robocopy para mover arquivos para o diretório AAAA / MM (cerca de 35 a 45.000 arquivos por mês) .. colocamos o script robocopy em um arquivo .bat assim:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT08
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT08
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT09
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT09

breves notas .. /ns /nc /nfl /np é para evitar o inchaço do arquivo de log com informações adicionais /log+... é gravar informações resumidas no arquivo de log.

/minage and /maxage is to copy files modified with in that date range. 

por exemplo, arquivos modificados > = 01 / nov / 2008 (inclusive) para arquivos modificados < 01 / Dez / 2008 (não incluso)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT08

/mov para mover os arquivos

então vem o diretório de origem

então vem o diretório de destino (os diretórios serão criados em tempo real quando necessário).

Demorou cerca de 40 a 60 minutos para 1 mês de transferência (cerca de 35 a 45.000 ficheiros) Acreditamos que demora cerca de 12 horas ou menos por 1 ano de transferência.

Usando o Windows Server 2003.

Todas as coisas são registradas no arquivo de log ... Hora de início, Hora de término e Número de arquivos copiados.

Robocopy salvou o dia.

    
por 26.01.2011 / 11:33
4

Você sabe, eu adicionei mais 1 à solução de tar, mas - dependendo do ambiente - há uma outra idéia que ocorre. Você pode pensar em usar dd (1) . A questão da velocidade com algo assim é que são necessários muitos movimentos para abrir e fechar um arquivo, o que você fará cinco milhões de vezes. Em você poderia garantir que estes são atribuídos contiguosamente, você poderia dd-los em vez disso, o que reduziria o número de movimentos da cabeça por um fator de 5 ou mais.

    
por 22.01.2009 / 05:03
4

Eu prefiro usar lz4 como ferramenta de compressão mais rápida no momento. A opção SSH -c arcfour128 usa um algoritmo de criptografia mais rápido que o padrão. [1]

Portanto, a transferência de diretórios é parecida com:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'

Por favor, note que no Debian lz4 o comando é lz4c e no CentOS é lz4.

    
por 17.03.2017 / 14:14
3
O

Robocopy é excelente para coisas como esta. Ele tentará novamente após o tempo limite da rede e também permitirá que você defina um intervalo entre pacotes agora para inundar o tubo.

[Editar]

Observe que este é um aplicativo somente para Windows.

    
por 22.01.2009 / 04:45
3

Eu sei que isso pode ser estúpido - mas você pensou em apenas copiá-los em um disco externo e levá-lo para o outro servidor? Pode realmente ser a solução mais eficiente e simples.

    
por 22.01.2009 / 05:40
3

Estamos investigando esse problema atualmente. Precisamos transferir cerca de 18 milhões de arquivos pequenos - cerca de 200 GB no total. Conseguimos o melhor desempenho usando o XCopy simples, mas ainda demorou muito tempo. Cerca de 3 dias de 1 servidor para outro, cerca de 2 semanas para uma unidade externa!

Por meio de outro processo, precisávamos duplicar o servidor. Isso foi feito com a Acronis. Demorou cerca de 3 horas !!!

Nós investigaremos isso mais um pouco. A sugestão dd acima provavelmente forneceria resultados semelhantes.

    
por 05.02.2010 / 17:44
2

Já recebemos toneladas de boas sugestões, mas queríamos incluir Além da comparação . Recentemente, transferi cerca de 750.000 arquivos entre 5 KB e 20 MB de um servidor para outro por meio de um comutador gigabit. Nem sequer soluçou. Concedido demorou um pouco, mas eu esperaria que com tantos dados.

    
por 22.01.2009 / 06:23
1

Eu vejo como um zip- > copy- > unzip executa

ou qualquer que seja o seu sistema de compactação / arquivo favorito.

    
por 22.01.2009 / 04:44
1

Empacote-os em um único arquivo antes de copiá-lo, depois descompacte-os novamente depois de copiá-lo.

    
por 22.01.2009 / 04:44
1

Em uma situação semelhante, tentei usar o tar para agrupar os arquivos. Escrevi um script minúsculo para enviar a saída do comando tar até a máquina de destino diretamente em um processo de recebimento de tar, que separava os arquivos.

A abordagem de tar quase dobrou a taxa de transferência em comparação com scp ou rsync (YMMV).

Aqui estão os comandos tar. Você precisará ativar os comandos r criando arquivos .rhosts nos diretórios iniciais de cada máquina (remova-os depois que a cópia estiver concluída, pois são problemas de segurança notórios). Note também que, como de costume, o HP-UX é estranho - enquanto o resto do mundo usa 'rsh' para o comando shell remoto, o HP-UX usa 'remsh'. "Rsh" é uma espécie de concha restrita no jargão da HP.

box1> cd source_directory; tar cf - . | remsh box2 "cd target_directory; tar xf - "

O primeiro comando tar cria um arquivo chamado ‘-’, que é um token especial que significa “saída padrão” nesse caso. O arquivo criado contém todos os arquivos no diretório atual (.) Mais todos os subdiretórios (o tar é recursivo por padrão). Este arquivo é enviado para o comando remsh que o envia para a máquina box2. Na caixa 2, primeiro altero para o diretório de recebimento adequado e, em seguida, extraio de '-' ou 'entrada padrão' dos arquivos recebidos.

Eu tinha 6 desses comandos tar funcionando simultaneamente para garantir que o link da rede estivesse saturado de dados, embora eu suspeite que o acesso ao disco possa ter sido o fator limitante.

    
por 17.03.2009 / 01:42
1

Ignore o sistema de arquivos.

Você é capaz de desmontar essa partição que os arquivos vivem nela ou montá-la somente para leitura? Faça isso, então algo como:

dd if=/dev/PARTITION | ssh username@host "dd of=diskimage.bin"

Você pode montar o diskimage.bin como um dispositivo de loopback no lado do destino e copiar arquivos dele para o sistema de arquivos de destino real ou talvez usar as ferramentas adequadas para voltar a colocá-lo em uma partição vazia no lado do destino (perigoso, mas provavelmente possível, embora eu nunca tenha feito isso.)

Se você for realmente corajoso, pode dd voltar diretamente para uma partição no lado do destino. Eu não recomendo isso.

    
por 26.11.2014 / 01:05
0

você pode tentar o seguinte (pode estar em lotes de arquivos)

  • tar o lote de arquivos
  • gzip-los
  • copie usando scp se possível
  • gunzip
  • descompactar os arquivos
por 22.01.2009 / 04:51
0

Como sugerido por sth você poderia tentar tar sobre ssh.

Se você não precisar de criptografia (originalmente você usou o rsync, mas não mencionou que era o rsync + ssh) você poderia tentar o tar sobre o netcat para evitar a sobrecarga do ssh.

É claro que você também pode reduzir o tempo que leva usando o método gzip ou outro método de compressão.

    
por 22.01.2009 / 04:58
0

Há algo mais a considerar. Tente isto:

  • Crie um VHD, dimensionado dinamicamente
  • Monte, possivelmente como um diretório
  • Defina o atributo 'compactar disco inteiro'

Ao fazer isso, NÃO há sobrecarga para a iteração ou compactação do diretório, porque isso foi feito no momento em que os arquivos foram gravados. Existe apenas um arquivo para mover - o VHD.

No Windows, configurei o tamanho do pacote TCP padrão para ser maior, como 16348. Isso significa menos sobrecarga no cabeçalho IP.

Uma coisa que eu me deparei, porém, é que é melhor manter o tamanho dos arquivos abaixo de 100 Mb para uma rede ou transferência USB. Eu uso o Rar.exe para isso - para dividir os arquivos.

Funciona como um campeão. Este é o equivalente de 'dd' no Linux. O conceito de montar um sistema de arquivos compactado em um diretório também é normal para o Linux, então a mesma lógica se aplica. Você deve garantir que todos os arquivos sejam fechados antes que a operação inicie, como nos outros métodos.

Isso tem a vantagem de tornar possível colocar uma cota de tamanho em uma pasta. Se o VHD é um tamanho fixo, ultrapassar esse limite não derrubará o servidor, apenas causará um erro ao criar ou gravar o arquivo.

Um VHD formatado como NTFS pode lidar com milhões de arquivos em uma pasta também.

    
por 26.11.2014 / 00:52

Tags