O processo de rsync é interrompido abruptamente durante o backup por SSH

3

Eu tenho um script de backup rsync para transferir dados entre dois servidores Ubuntu (localizados em diferentes países). Os dados que estão sendo armazenados em backup são muito grandes em termos de número de arquivos. É aproximadamente 17GB no tamanho totalmente. O script é executado no servidor receptor . Então, é basicamente um pull . Autenticação de chave pública-privada usada para login.

O script funciona bem; o backup vem acontecendo com sucesso há muitos meses.

Ultimamente, nos últimos 6 dias, os backups não foram concluídos. O processo de rsync é executado por cerca de 45 minutos ou mais. E então acaba. Eu não tenho ideia do porquê de parar. Do que eu posso ver, ele nem sequer conclui a construção e a verificação da lista de arquivos. Eu tenho a saída cron direcionada para um arquivo de log. No log, tudo que vejo é: receiving file list ... done . Mas eu posso ver que nada foi transferido para o destino de backup.

Se eu executar o script manualmente, após cerca de 45 minutos, só vejo isso: ./sync.sh: line 51: 9078 Killed $RSYNC $OPTIONS $SOURCE $DESTINATION

Como e onde vejo o motivo da falha? Como sei qual servidor está realmente matando o processo, o remetente ou o destinatário?

A máquina pull (onde o script é executado) é uma caixa low-end . É uma VM KVM com 256MB de RAM. Então, eu estou querendo saber se o edifício da estrutura de arquivos está ocupando muita memória RAM, causando assim um erro OOM. Mas como eu verifico se este é o caso? Além disso, não houve aumento significativo de arquivos para causar uma falha súbita.

Alguma dica seria apreciada.

Obrigado.

Atualização 1

Como sugerido por @APZ, adicionei mais alguns sinalizadores verbosos (3 no total) e executei o script manualmente, redirecionando a saída para um arquivo. Aqui está a saída no final:

(.... lots of file names....)
received 5795917 names
done
recv_file_list done
get_local_name count=5795917 /storage/  <======== Reached here after about 40 minutes. Was stuck here for about 10 minutes or so.
[Receiver] _exit_cleanup(code=14, file=main.c, line=788): about to call exit(14)

rsync: fork failed in do_recv: Cannot allocate memory (12)
rsync error: error in IPC code (code 14) at main.c(788) [Receiver=3.0.9]

Para responder @TimHaegele, até onde eu sei, o host da VM (Prometeus / IperWeb) não faz nenhuma limitação de CPU, IO ou qualquer coisa. Eu poderia perguntar a eles, no entanto. Eles são extremamente bem avaliados.

Minha instalação do Ubuntu na VM tem 512 MB de swap configurados. Talvez eu possa aumentar isso para dizer 2 GB ou mais? O espaço em disco não é um problema.

Quando o rsync está em execução, esta é a saída de free -m :

             total       used       free     shared    buffers     cached
Mem:           239        236          2          0          0          3
-/+ buffers/cache:        232          7
Swap:          511        510          1

Com base nessa evidência, ainda faria diferença alterar as configurações do Daemon do SSH, conforme sugerido?

Atualização 2

O consenso parece ser que pouca memória é o problema. Então, eu adicionei um novo arquivo de swap de 2GB e o ativei. Então, agora eu tenho um total de 2,5 GB de swap.

Depois, executei o script novamente (manualmente). Desta vez, durou mais de 90 minutos. Estava transferindo os arquivos até esse momento. Mas então, de repente, o processo desistiu. Nos logs, vejo que terminou com o seguinte erro:

Invalid packet at end of run (4330026) [sender]
[generator] _exit_cleanup(code=12, file=io.c, line=1532): about to call exit(12)
rsync error: protocol incompatibility (code 2) at main.c(695) [sender=3.0.7]
rsync: writefd_unbuffered failed to write 23 bytes to socket [generator]: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(1532) [generator=3.0.9]
[receiver] _exit_cleanup(code=19, file=main.c, line=1316): about to call exit(19)
rsync error: received SIGUSR1 (code 19) at main.c(1316) [receiver=3.0.9]

Como você pode ver, a máquina do remetente tem 3.0.7 e o receptor (extrator) possui 3.0.9. Eu não entendi bem qual é o erro.

Enquanto isso, vi o comentário do @ APZ e modifiquei meu script para substituir --delete-after por --delete-delay . Eu estou correndo novamente agora. Voltarei com atualizações.

Atualização 3

Adicionando mais troca e usando --delete-delay em vez de --delete-after parece ter feito o truque. O cron job regular parece estar funcionando corretamente também.

Além disso, eu segui este artigo para fazer o rsync rodar com o sudo na máquina de envio. Isso também removeu os avisos Permission denied (13) durante a transferência.

Obrigado pela ajuda, todos.

P.S .: Todos os que participaram neste Q & A deram sugestões úteis. Infelizmente, só posso marcar uma resposta correta.

    
por Anjan 29.01.2013 / 16:13

2 respostas

3

Como ponteiros, sugiro olhar para os logs do rsync no lado do servidor. Além disso, tente o modo detalhado de rysnc:

-v, --verbose This option increases the amount of information you are given during the transfer. By default, rsync works silently. A single -v will give you information about what files are being transferred and a brief summary at the end. Two -v options will give you information on what files are being skipped and slightly more information at the end. More than two -v options should only be used if you are debugging rsync.

    
por 29.01.2013 / 20:57
2

A VM KVM, onde o script rsync é executado, é controlada por um Hoster que limita os recursos como IO, CPU-Time, etc?

Tentando responder sua pergunta, sugiro que:

Execute o sync.sh em um host com mais recursos que 256MB e seja controlado por você mesmo e veja se ele é executado com sucesso. Se sim, a origem do seu problema é o cliente.

Seconde, e um pouco obscuro, mas vale a pena um teste em tempo diferente.

Além de reduzir os tempos limite :

Use uma configuração de desconexão mais agressiva em / etc / ssh / sshd_config no servidor como:

ClientAliveInterval 5
ClientAliveCountMax 3
    
por 29.01.2013 / 22:28