Maneira mais rápida de transferir 55 GB de imagens para um novo servidor

64

Atualmente, tenho dois servidores CentOS. Preciso saber como e qual a maneira mais rápida seria "tar" o diretório de imagens e SCP-lo?

Essa é a maneira mais rápida que acabei de sugerir, porque a tarar está demorando para sempre ... Executei o comando:

tar cvf imagesbackup.tar images

E eu ia dar uma olhada.

Deixe-me saber se existe uma maneira mais rápida. Eu tenho acesso remoto / SSH às duas máquinas.

Andrew Fashion
fonte
12
Sneakernet?
Nick T

Respostas:

98

Em vez de usar o tar para gravar em seu disco local, você pode gravar diretamente no servidor remoto pela rede usando ssh.

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

Qualquer sequência que segue o comando "ssh" será executada no servidor remoto em vez do logon interativo. Você pode canalizar a entrada / saída de e para esses comandos remotos através do SSH como se fossem locais. Colocar o comando entre aspas evita qualquer confusão, especialmente ao usar o redirecionamento.

Ou, você pode extrair o arquivo tar diretamente no outro servidor:

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

Observe a -Copção raramente usada . Significa "mudar para este diretório antes de fazer qualquer coisa".

Ou talvez você queira "puxar" do servidor de destino:

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

Observe que a <(cmd) construção é nova no bash e não funciona em sistemas mais antigos. Ele executa um programa e envia a saída para um canal e substitui esse canal no comando como se fosse um arquivo.

Eu poderia facilmente ter escrito o acima, da seguinte maneira:

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

Ou da seguinte maneira:

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

Ou então, você pode evitar algumas mágoas e usar o rsync:

server1$ rsync -az ./path server2:/destination/

Por fim, lembre-se de que a compactação dos dados antes da transferência reduzirá sua largura de banda, mas em uma conexão muito rápida, a operação poderá levar mais tempo . Isso ocorre porque o computador pode não ser capaz de compactar rápido o suficiente para acompanhar: se a compactação de 100 MB levar mais tempo do que o necessário para enviar 100 MB, será mais rápido enviá-lo sem compactação.

Como alternativa, você pode considerar a tubulação para compactar com gzip (em vez de usar a opção -z) para poder especificar um nível de compactação. Foi minha experiência que, em conexões de rede rápidas com dados compactáveis, o uso de gzip no nível 2 ou 3 (o padrão é 6) fornece a melhor taxa de transferência geral na maioria dos casos. Igual a:

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"
tylerl
fonte
O Rsync funcionou perfeitamente - comprime rapidamente, copia pastas inteiras, retoma em links quebrados. Tudo em um comando simples. Adoro. Estas são as opções que eu achei úteis: z: compactar r: recurse = copiar a subpasta v: verbose. Meu exemplo comando rsync: rsync -azvr / src-path / username @ dest_server: / dest / path /
Bastion
68

Eu ficaria tentado a sincronizá-lo sozinho - ele faz compressão e lida bem com a perda de links.

Chopper3
fonte
14
O rsync é exatamente a ferramenta certa.
Rich
4
+1 - Sim rsync!
Evan Anderson
11
+1, apenas para acumular. Além disso, eu realmente gosto de rsync.
Steven segunda-feira
11
Mas ao usar rsync terá de comprimir dados manualmente de qualquer maneira (se você deseja armazenar seus dados comprimidos)
wlk
Como você pode armazenar os arquivos compactados com rsync?
Dolan Antenucci
12

Se você apenas os aumentar e nada mais, isso desperdiçará toneladas de tempo com apenas um ganho de velocidade mínimo.

Portanto, simplesmente ordenar os arquivos com os comutadores cvf custará efetivamente o tempo necessário para ler todas as imagens de 55 GB e gravá-las novamente em disco. (Efetivamente, será desperdiçado ainda mais tempo, pois haverá uma sobrecarga considerável).

Há apenas uma vantagem que você ganha aqui: a sobrecarga para o upload de muitos arquivos está sendo reduzida. Você poderá obter tempos de transferência mais rápidos se compactar as imagens (mas como acredito que elas já estejam em um formato compactado, isso não ajudará muito). Apenas mais perda de tempo de computação.

A maior desvantagem da transferência de um enorme arquivo de alcatrão por fio é que, se algo der errado, isso pode significar que você precisa recomeçar.

Eu usaria dessa maneira:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

No novo servidor

md5sum /images/* > md5sum_new.txt

E então apenas diff. E como o scp suporta compactação em tempo real, não há necessidade de arquivos separados.

Editar

Manterei as informações MD5, pois foram úteis para o OP. Mas um comentário me atingiu com uma nova visão. Assim, um pouco de pesquisa forneceu essa informação útil. Observe que o assunto aqui é SFTP e não diretamente SCP .

Ao contrário do FTP, o SFTP adiciona sobrecarga à transferência de arquivos. À medida que um arquivo é transferido entre cliente e servidor, ele é dividido em pequenos pedaços chamados "pacotes". Por exemplo, suponha que cada pacote tenha 32 KB. O protocolo SFTP faz uma soma de verificação em cada arquivo de 32 KB à medida que é enviada e inclui essa soma de verificação junto com esse pacote. O receptor obtém esse pacote e descriptografa os dados e, em seguida, verifica a soma de verificação. A soma de verificação em si é "mais forte" que a soma de verificação CRC32. (Como o SFTP usa uma soma de verificação de 128 bits ou superior, como MD5 ou SHA, e como isso é feito em todos os pacotes, há uma verificação de integridade muito granular que é realizada como parte da transferência.) Assim, o protocolo é mais lento (devido às despesas gerais adicionais), mas a conclusão bem-sucedida de uma transferência significa, de fato,

ritmo
fonte
Muito obrigado, o que o md5sum está fazendo? e o que é diff? Obrigado, realizando agora!
Andrew Fashion
2
md5sum (ou md5) obtém uma soma de verificação dos arquivos. Diff procura diferenças nos arquivos (man diff). A soma de verificação cria uma string, um hash, que se o arquivo for alterado em trânsito ... um pouco invertido, um erro ... não corresponderá quando você o fizer novamente do outro lado. Para arquivos grandes, você tem uma chance maior de erros. É por isso que, quando você vê sites que permitem o download de arquivos .iso, eles geralmente possuem uma soma de verificação MD5 para comparar o arquivo baixado e garantir que ele corresponda e não esteja corrompido.
Bart Silverstrim
3
O scp é criptografado e garante a integridade da linha. Ainda há uma pequena chance de os dados estarem corrompidos na memória ou no disco, é claro, mas isso é muito raro.
Ryan Bair
11
A sobrecarga das somas de verificação SFTP realmente importa em algum sentido prático? Eu não posso imaginar isso. 4 bytes para cada 32768 não parecem significativos. Isso é 128 kB por GB. Chamar isso de "mais lento" parece exagerar em qualquer coisa, exceto em um sentido teórico chato.
Sublinhado #
8

Além da sugestão de md5sum de Pacey, eu usaria o seguinte:

No destino: nc -w5 -l -p 4567 | tar -xvf -

Então na fonte: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

Ainda é um tar / untar, e não há criptografia, mas é direto para o outro servidor. Inicie os dois em conjunto ( -w5oferece 5 segundos de graça.) E observe-o. Se a largura de banda estiver apertada, adicione -z ao alcatrão nas duas extremidades.

SmallClanger
fonte
11
Eu acho que é o contrário primeiro ele tem de executar no destino (para abrir o socket) e, em seguida, na fonte (a expedição)
Dimitrios Mistriotis
no lugar do servidor de destino, basta colocar [email protected]?
Andrew Fashion
Não, apenas o IP. O netcat não está usando um protocolo que não seja o TCP :) Este comando também será o mais rápido de todos os comandos fornecidos acima. Há exatamente uma leitura por arquivo na fonte, o tráfego mínimo exato da rede para transferir os arquivos e exatamente uma gravação por arquivo no destino. Se você tiver ciclos de CPU sobressalentes, adicionar o sinalizador -z (para compactação) acelerará ainda mais, pois menos dados de rede precisam ser transferidos.
Jeff McJunkin
@ user36845 - Verdadeiro. Eu não estava sugerindo uma cronologia com a encomenda acima, mas você está certo, o soquete precisará ser aberto primeiro. Vou editá-lo para esclarecer. :)
SmallClanger
Tenho certeza de por que ssh / scp foram tampando fora a 125 MB / s para 133MB / s, mas netcat pode canalizar esses dados em facilmente (mesmo link) ~ 380MB / s
ThorSummoner
1

Um ponto - nem todos os hosts têm o rsync e os hosts podem ter versões diferentes do tar. Por esse motivo, pode-se recomendar como primeira porta de chamada usando o cpio frequentemente negligenciado.

Você pode cpio over ssh para fazer replicação ad-hoc de estruturas de arquivos / diretórios entre hosts. Dessa forma, você tem um controle mais preciso sobre o que é enviado, visto que precisa "alimentar" o cpio, nom-nom. Também é mais portátil para argumentos, o cpio não muda muito - esse é um ponto importante se você estiver cuidando de vários hosts em um ambiente heterogêneo.

Exemplo de cópia / exportação / home e subdiretórios para host remoto:

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

O acima copia o conteúdo de / export / home e quaisquer subdiretórios para / export / home no host remoto.

Espero que isto ajude.

Rowley
fonte
Ele mencionou que eram duas caixas CentOS, para que eles tivessem versões compatíveis com tar e rsync. Ferramentas como o rsync foram criadas para substituir ferramentas como o cpio :). Você não pode "continuar" com o cpio, pelo menos sem saber de onde exatamente deseja começar e filtrar sua descoberta conforme apropriado. O que é uma sobrecarga desnecessária de tempo. Dito isto, informações úteis para caixas 'antigas' do UNIX :) #
Rafiq Maniar 02/12/2010
Sim, isso cmmand me perdeu haha
Andrew Moda
1

Eu você tem acesso ssh, você tem acesso rsync.

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

ou

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

Se você receber um erro como "erro rsync: alguns arquivos não puderam ser transferidos (código 23) em main.c (977) [remetente = 2.6.9]", verifique seu usuário e grupos entre os servidores; você pode ter uma incompatibilidade.

Use a opção rsync "-z" se desejar que o rsync comprima a transferência. Esta opção usará mais CPU, mas menos largura de banda, portanto, esteja ciente disso.

Existe uma opção "--progress" que fornece uma porcentagem de transferência, o que é legal se você gosta desse tipo de coisa.

quinnr
fonte
0

Eles estão em uma rede compartilhada em vez de precisar da Internet para transferir arquivos? NFS ou FTP pode ser muito mais rápido que a sobrecarga do SCP, embora você perca a criptografia durante a transferência.

Tex
fonte
servidores diferentes em locais remotos
Andrew Fashion
0

Ou você sempre pode usar tubos de alcatrão:

(cd /path && tar -cjf - * ) | ssh user@host 'tar -xjf - -C /path'

'j' = bzip2, você pode usar 'z' para gzip ou --lzma se o seu tar o suportar.

OneOfOne
fonte