Melhor maneira de copiar milhões de arquivos entre 2 servidores


39

Tenho aproximadamente 5 milhões de arquivos pequenos (5-30k) em um único diretório que gostaria de copiar para outra máquina na mesma rede de gigabit. Eu tentei usar o rsync, mas ele diminuiria a velocidade de rastreamento após algumas horas de execução, presumo que o rsync precise verificar o arquivo de origem e destino toda vez?

Meu segundo pensamento seria usar o scp, mas queria obter opiniões externas para ver se havia uma maneira melhor. Obrigado!


O gargalo é provavelmente o sistema de arquivos do lado receptor. A maioria dos sistemas de arquivos acaba sendo exponencialmente mais lenta quanto mais arquivos você coloca em um único diretório (ou seja, toda vez que o rsync adiciona um novo arquivo no lado de recebimento, o lado de recebimento fica mais lento na parte restante da transferência). Muitos sistemas de arquivos mais antigos não podem conter mais de 32 mil arquivos em um único diretório.
Mikko Rantalainen

Respostas:


41

Algo assim 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, pois você está em uma rede gigabit.


É necessário compactá-lo ou o ssh comprime o fluxo de qualquer maneira? Ou pode ser feito para fazê-lo?
Thilo

11
O ssh comprimirá o fluxo se você passar "-C". Em uma lan, eu não me incomodaria em comprimir o fluxo; pela Internet eu provavelmente usaria, a menos que já estivesse compactado.

6
Pessoalmente, eu deixaria o gzip ativado: mesmo em Ethernet de gigabit, é muito improvável que o gargalo seja a CPU.
Benji XVI

6
@ BenjiXVI, o gargalo certamente será a CPU, pois gzipsó será executada em um único núcleo. Você pode esperar razoavelmente cerca de 30 MB / s com o nível de compactação padrão de 6 - mas isso não maximizará a Ethernet Gigabit.
syneticon-dj

2
usar pbzip2? ...
Apache

19

Tenho certeza de que você tem todos os CINCO MILHÕES de arquivos em um único diretório, lançando muitas ferramentas em um tizzy. Não estou surpreso que o rsync não tenha lidado com isso normalmente - é uma situação "única". Se você descobrir uma maneira de estruturar os arquivos em algum tipo de estrutura de diretório, 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 na rede). Em seguida, volte a unidade e use o rsync para manter as coisas atualizadas.


6
+1 para mover unidade fisicamente, é muito mais rápido desta forma
Robert Gould

11
É melhor do que copiar tudo em uma unidade de salto e ir e voltar ...
VirtuosiMedia

De @RobertGould Let uso IPoAC como nosso protocolo de transmissão: "D
coolcat007

12

Para copiar milhões de arquivos em um switch de gigabit (em um ambiente confiável), você também pode usar uma combinação de netcat (or nc)e tar, como já sugerido pelo usuário55286. Isso transmitirá todos os arquivos como um arquivo grande (consulte Fast File Copy - 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

Hoje em dia, com mais e mais coisas testando o IPv6 primeiro, talvez seja necessário usar a opção -4 com o comando nc nas duas extremidades para fazê-lo funcionar em uma LAN IPv4 "antiga".
BeowulfNode42

5

Tínhamos cerca de 1 milhão de arquivos em um diretório (cerca de 4 anos em 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 de robocopy em um arquivo .bat como este:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02

breves notas .. /ns /nc /nfl /npé evitar inchar o arquivo de log com informações adicionais /log+...é escrever 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 inclusos)

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

/mov para mover os arquivos

então vem o diretório de origem

em seguida, vem o diretório de destino (os diretórios serão criados dinamicamente, conforme necessário).

Demorou cerca de 40 a 60 minutos para um mês de transferência (cerca de 35-45.000 arquivos). Acreditamos que leva cerca de 12 horas ou menos para um ano de transferência.

Usando o Windows Server 2003.

Todo o material é registrado no arquivo de log ... Hora de início, Hora de término e Número de arquivos copiados.

Robocopy salvou o dia.


Atualmente, a robocopy possui o switch / MT [: n] para fazer cópias multithread com n threads (padrão 8) para obter o mesmo efeito apenas melhor e não depender de intervalos de datas e permite uma única linha de comando, em vez de uma por thread. Embora o interruptor MT não está disponível no Windows 2003.
BeowulfNode42

4

Você sabe, eu adicionei a solução de alcatrão com +1, mas - dependendo do ambiente - há outra idéia que ocorre. Você pode pensar em usar o dd (1) . O problema da velocidade com algo assim é que são necessários muitos movimentos de cabeça para abrir e fechar um arquivo, o que você fará cinco milhões de vezes. Para garantir que eles sejam atribuídos de forma contígua, você pode adicioná-los, o que reduziria o número de movimentos da cabeça em um fator de 5 ou mais.


4

Eu prefiro usar o lz4 como a ferramenta de compactaçã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ório se parece com:

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

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


A criptografia / descriptografia do ssh pode ser um gargalo devido ao uso da CPU na fonte ou na CPU de destino e à natureza de thread único de quase todas as implementações ssh. É uma LAN de gigabit privada, portanto, não há necessidade de criptografar.
precisa saber é o seguinte

3

Robocopy é ótimo para coisas assim. Ele tentará novamente após o tempo limite da rede e também permite que você defina um atraso de intervalo entre pacotes para agora trocar o tubo.

[Editar]

Observe que este é um aplicativo somente para Windows.


Supondo que você esteja nas janelas, é claro. O bom do robocopy é que o aplicativo é responsável pela iteração dos arquivos. O problema com os utilitários unix é que você pode ficar sem espaço no shell expandindo os nomes.
Martin Beckett

3

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


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 antigo simples, mas ainda demorou muito tempo. Cerca de 3 dias de um servidor para outro, cerca de 2 semanas para uma unidade externa!

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

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


2

Já existem muitas boas sugestões, mas queria lançar o Beyond Compare . Recentemente, transferi cerca de 750.000 arquivos entre 5 KB e 20 MB de um servidor para outro por um switch de gigabit. Nem sequer soluçou. Concedido que demorou um pouco, mas eu esperaria isso com tantos dados.


1

Eu veria como um zip-> copiar-> descompacta

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


sim compactá-los em um arquivo seria uma boa idéia também
Robert Gould

mesmo apenas um arquivo tar
Joel Coehoorn

1

Empacote-os em um único arquivo antes de copiá-lo e descompacte-o novamente após a cópia.


1

Em uma situação semelhante, tentei usar o tar para agrupar os arquivos. Eu escrevi um pequeno script para canalizar a saída do comando tar diretamente para a máquina de destino diretamente para um processo tar de recebimento que desagregava os arquivos.

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

Aqui estão os comandos tar. Observe que você precisará ativar os comandos r criando arquivos .rhosts nos diretórios pessoais de cada máquina (remova-os depois que a cópia estiver concluída - eles são problemas de segurança notórios). Observe também que, como sempre, o HP-UX é estranho - enquanto o resto do mundo usa 'rsh' para o comando de shell remoto, o HP-UX usa 'remsh'. 'rsh' é algum tipo de shell restrito 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' neste caso. O arquivo morto criado contém todos os arquivos no diretório atual (.) Mais todos os subdiretórios (o tar é recursivo por padrão). Este arquivo morto é canalizado para o comando remsh que o envia para a máquina box2. Na caixa 2, primeiro mudo para o diretório de recebimento adequado, depois extraio de '-' ou 'entrada padrão' os arquivos recebidos.

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


1

Ignore o sistema de arquivos.

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

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

Em seguida, você pode montar diskimage.bincomo 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 costurá-lo novamente 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, poderá ddfazê-lo diretamente em uma partição no lado do destino. Eu não recomendo isso.


0

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

  • tar o lote de arquivos
  • aperte-os
  • copie usando scp, se possível
  • gunzip
  • descompactar os arquivos

0

Como sugerido por sth, você pode tentar tar sobre ssh.

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

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


0

Há algo mais a considerar. Tente o seguinte:

  • Crie um VHD, de tamanho dinâmico
  • Monte-o, 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 de diretório, porque isso foi feito no momento em que os arquivos foram gravados. Há apenas um arquivo para mover - o VHD.

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

Uma coisa que me deparei é que é melhor manter os tamanhos de arquivo abaixo de 100 Mb para uma transferência de rede ou USB. Eu uso o Rar.exe para isso - para dividir os arquivos.

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

Isso tem o benefício adicional de tornar possível colocar uma cota de tamanho em uma pasta. Se o VHD for de 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 também pode lidar com milhões de arquivos em uma pasta.

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.