Copiando arquivos enormes entre duas máquinas remotas - Eficientemente

6

Eu tenho um script de shell que continua copiando arquivos enormes (2 GB a 5 GB) entre sistemas remotos. A autenticação baseada em chave é usada com o encaminhamento de agentes e tudo funciona. Por ex: digamos que o shell script está rodando na máquina-A e copiando arquivos da máquina-B para a máquina-C.

"scp -Cp -i private-key ssh_user@source-IP:source-path ssh_user@destination-IP:destination-path"

Agora, o problema é o processo em que o sshd está continuamente recebendo cargas de CPU.
Por exemplo: top -c na máquina de destino (ou seja, máquina-C) mostra

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                         
14580 ssh_user  20   0 99336 3064  772 R 85.8  0.0   0:05.39 sshd: ssh_user@notty                                                            
14581 ssh_user  20   0 55164 1984 1460 S  6.0  0.0   0:00.51 scp -p -d -t /home/binary/instances/instance-1/user-2993/

Isso resulta em média de alta carga.

Eu acredito que o scp está levando muito CPU porque está criptografando / descriptografando dados. Mas eu não preciso de transferência de dados criptografados porque tanto a máquina B quanto a máquina C estão em uma LAN.

Quais outras opções eu tenho? Eu considerei 'rsync'. Mas a página man do rsync diz:

GENERAL
       Rsync  copies files either to or from a remote host, or locally on the current host (it does not support copying files between two
       remote hosts).

Editar 1: já estou usando ssh cipher = arcfour128. Pouco melhora, mas isso não resolve o meu problema.

Editar 2: Existem outros binários (minha principal aplicação) sendo executados nas máquinas e alta média de carga, fazendo com que eles tenham um desempenho ruim.

    
por Varun 30.04.2012 / 12:26

7 respostas

10

Esse problema pode ser resolvido com rsync . Pelo menos esta solução deve ser competitiva em termos de desempenho.

Primeiro, rsync pode ser chamado de um dos sistemas remotos para superar a limitação na incapacidade de copiar diretamente entre dois sistemas remotos.

Segundo, a criptografia / descriptografia pode ser evitada executando rsync no modo Daemon Access em vez do modo Remote Shell Access.

No modo de acesso ao daemon rsync não encapsula o tráfego por meio de uma conexão ssh. Em vez disso, ele usa seu próprio protocolo em cima do TCP.

Normalmente, você executa o daemon do rsync de inet.d ou stand-alone. De qualquer forma, isso requer acesso root a um dos sistemas remotos. Supondo que o acesso root não esteja disponível, ainda é possível iniciar o daemon.

Iniciar o daemon rsync como um usuário não privilegiado na máquina de destino

ssh -i private_key ssh_user@destination-IP \
       "echo -e 'pid file = /tmp/rsyncd.pid\nport = 1873' > /tmp/rsyncd.conf

ssh -i private_key ssh_user@destination-IP \
       rsync --config=/tmp/rsyncd.conf --daemon

Copie os arquivos

ssh -i private_key ssh_user@source_ip \
       "rsync [OPTIONS] source-path \
              rsync://ssh_user@destination-IP:1873:destination-path"
    
por 30.04.2012 / 12:44
8

A solução de menor sobrecarga estaria usando o netcat:

destination$ nc -l -p 12345 > /path/destinationfile
source$ cat /path/sourcfile | nc desti.nation.ip.address 12345

(alguma versão do netcat não precisa do sinalizador "-p" para a porta)

Tudo isso faz é enviar os dados não criptografados, não autenticados pela rede de um PC para o outro. Claro que não é a maneira mais "confortável" de fazê-lo.

Outras alternativas estariam tentando alterar a codificação ssh (ssh -c) ou usando o ftp.

PS: rsync funciona bem com máquinas remotas, mas é usado principalmente em combinação com ssh, então não há aceleração aqui.

    
por 30.04.2012 / 12:38
3

Se a criptografia não for uma preocupação, crie um daemon NFS em C e monte o diretório em B . Use rsync em B , mas especifique os caminhos do diretório local.

Ignorando qualquer que seja o seu caso de uso envolvendo A , basta prefixar ssh user@B rsync... ao comando.

Transfere dados sem sobrecarga de criptografia e transfere apenas os arquivos diferentes.

Além disso, o FTP foi criado com transferências de servidor para servidor de terceiros como um recurso de protocolo.

    
por 30.04.2012 / 12:58
1

Você pode usar um método de baixa criptografia: você pode usar rsync --rsh="ssh -c arcfour" para aumentar a velocidade. Eu meus testes, estou esperando discos e não mais a conexão de rede. E use o rsync, é bom!

    
por 30.04.2012 / 12:37
0

Experimente o uníssono. É a melhor opção para sincronizar arquivos.

    
por 30.04.2012 / 13:19
0

Talvez você ache link interessante.

Ele paraleliza as transferências de dados entre dois hosts. Preste especial atenção ao ponto nr. 5 e se adaptar de acordo com suas necessidades.

    
por 30.04.2012 / 13:35
0

Sei que isso precisaria de um pouco de trabalho, mas o DRDB funcionaria para você? É como um RAID baseado em rede e manter dois servidores em sincronia é muito mais fácil com ele se o caso for semelhante ao seu, pelo menos se você precisar apenas do servidor A para copiar para o servidor B e não também de B para A o tempo todo.

    
por 30.04.2012 / 14:28