Como posso acelerar as transferências de arquivos entre storage arrays?

4

Eu tenho dois grandes arrays de armazenamento de diferentes fornecedores, cada um com cerca de 10Gb / s de largura de banda disponível para leitura / gravação. Eu preciso mover vários TB's de arquivos de um para o outro. Cada um fala NFS e CIFS. Atualmente usando cp ou scp ou rsync, a interface GbE do host intermediário se torna o gargalo, já que tenho que ler de uma matriz e gravar na outra. Não há nenhum host em qualquer matriz que eu possa fazer login para cortar o intermediário. Eu tenho muitos hosts que poderiam fornecer largura de banda adicional, se eu pudesse fazer algo como:

  rsync [src] [dest] --parallel-hosts=host1,host2,host3,host4

Existe uma solução simples para isso?

    
por Mark Maxham 18.08.2010 / 20:59

4 respostas

1

Um truque que eu uso para paralelizar coisas como essa é fazer isso em duas etapas - primeiro gerar uma lista de arquivos a serem transferidos, depois dividir essa lista e depois dividir o trabalho em várias máquinas.

Você pode fazer isso com o rsync com algo parecido com isto:

  • primeiro execute rsync com --itemize-changes (isso apenas vasculha os sistemas de arquivos e gera uma lista de arquivos que seriam copiados etc)
  • processa a saída --itemize-changes para extrair os nomes dos arquivos e dividir a lista em partes
  • executa cada parte em um processo de rsync separado (ou em uma máquina separada) usando o rsync com --files-from = chunkXX

Isso ajuda maciçamente para sistemas de arquivos de rede (NFS, Lustre, etc) onde você normalmente não consegue obter desempenho suficiente de um único processo / máquina de rsync.

Ainda demora um tempo para percorrer os sistemas de arquivos para compará-los, mas a movimentação real dos dados pode ser muito rápida. Além disso, coisas como cpio e cp tendem a superar o rsync para movimentação de dados brutos.

Outra opção que eu uso com bastante frequência é fazer um simples find -type f /src e depois dividir essa lista de arquivos e alimentá-la no cpio em vários hosts.

Adoraria saber uma maneira mais simples / rápida de fazer isso ...

    
por 19.08.2010 / 03:09
3

Se as duas matrizes de armazenamento não conversarem diretamente entre si, a melhor opção seria criar uma máquina especialmente construída com conexões de alta largura de banda. Até mesmo uma nova estação de trabalho relativamente barata com um par de NICs de 10 GbE pode gerar muita largura de banda se a rede de suporte e os storage arrays puderem utilizá-la.

    
por 18.08.2010 / 21:04
1

Você deve conversar com seus fornecedores de armazenamento para determinar se os controladores podem falar diretamente uns com os outros. Se não construir ou alugar um nó intermidado de alta largura de banda. Meu palpite é que existe uma maneira de fazer os dois arrays serem legais e rodar o clone com os controladores.

    
por 18.08.2010 / 23:45
0

Se você não consegue encontrar uma maneira de os controladores falarem uns com os outros (como outros já mencionaram), você pode tentar fazer isso:

No seu servidor destino , execute o seguinte comando:

$ nc -l -p 9999 | tar xvzf -

Em seguida, no seu servidor source , execute o seguinte comando:

$ tar cvzf - <SOURCEFILES> | nc -q 1 <DST_SERVER> 9999

A vantagem disso é que evita qualquer sobrecarga de criptografia que o SSH / rsync ofereça, assim você terá um pouco de aumento de velocidade. Isso também comprime e descompacta os servidores de origem e destino in-stream, acelerando o processo de transferência às custas de alguns ciclos de CPU.

Boa sorte!

    
por 19.08.2010 / 03:05

Tags