ti-enxame.com

Melhorando o desempenho do backup do rsync

Quais são as melhores técnicas para melhorar o rsync sobre o espelhamento do SSH entre caixas Unix, assumindo que um sistema sempre terá a cópia principal e o outro sistema sempre terá uma cópia recente (menos de 48hrs antigas)

Além disso, o que teria de fazer para escalar essa abordagem para lidar com dezenas de máquinas recebendo um impulso dessas mudanças?

8
sal

Se :

  • O tempo de modificação dos seus arquivos está certo
  • Os arquivos não são realmente grandes
  • Nenhum push pode ser perdido (ou há algum tipo de processamento de backlog)

Você pode usar find -ctime ou file -cnewer Para fazer uma lista de arquivo alterado desde a última execução e copiar apenas os arquivos modificados (apenas um empurrão diferencial glorificado).

Isso se traduzia muito bem para vários hosts: basta fazer um alcatrão diferencial na fonte e descontar em todos os anfitriões.

Dá-lhe algo assim:

find -type f -cnewer /tmp/files_to_send.tar.gz > /tmp/files_to_send.txt
tar zcf /tmp/files_to_send.tar.gz --files-from /tmp/files_to_send.txt 
for Host in Host1 Host2 Host3 ...
do
    cat /tmp/files_to_send.tar.gz | ssh $Host "tar xpf -"
done

O script tem te refinado, mas você recebe a ideia.

6
Steve Schnepp

Presumindo que os dados que você já não está compactado, girando com compressão (-z) provavelmente ajudará a transferir a velocidade, ao custo de alguma CPU em qualquer extremidade.

4
pjz

o rsync tem uma maneira de fazer desconectado cópias. Em outras palavras, o rsync pode (conceitualmente) diff uma árvore de diretório e produza um arquivo patch que você então pode aplicar em qualquer número de arquivos que são idênticos à fonte original.

Requer que você invoca rsync com o mestre e espelho com --write-batch; produz um arquivo. Você então transfere este arquivo para qualquer número de outros alvos e você então aplique o lote a cada uma dessas metas usando --read-batch.

Se você mantiver uma cópia local do último estado rsynced (isto é, uma cópia do que os espelhos parecem agora) na mesma máquina que o mestre, você pode gerar esse "patch" no mestre sem sequer entrar em contato com qualquer espelho:

No mestre:

rsync --write-batch=my-batch.rsync /master/data /current/mirror

Adicione quaisquer outras opções que você deseja. Isso fará duas coisas:

  1. Vai fazer /current/mirror Mude para refletir /master/data
  2. Vai criar um arquivo de patch binário (ou arquivo em lote) chamado my-batch.rsync para uso posterior.

Transferir o my-batch.rsync arquivo do mestre para todos os seus espelhos e, em seguida, nos espelhos, aplique o patch por assim dizer:

rsync --read-batch=my-batch.rsync /local/mirror

Benefícios dessa abordagem:

  • mestre não é inundado
  • não há necessidade de coordenar/ter acesso ao mestre/espelho (s) ao mesmo tempo
  • pessoas diferentes com diferentes privilégios podem fazer o trabalho no mestre e espelho (s).
  • não há necessidade de ter um TCP canal (ssh, netcat, o que for; o arquivo pode ser enviado via e-mail ;-))
  • espelhos offline podem ser sincronizados mais tarde (basta trazê-los on-line e aplicar o patch)
  • todos os espelhos garantidos são idênticos (desde que aplicam o mesmo "patch")
  • todos os espelhos podem ser atualizados simultaneamente (desde o --read-batch é apenas CPU/Io intensivo no próprio espelho)
2
mogsie

Se você está transferindo arquivos muito grandes com muitas alterações, use as opções --inplace e --whole-file, eu uso estes para o meu 2GB VM imagens e ajudou muito (principalmente Como o protocolo RSYNC não estava fazendo muito com a passagem de dados incrementais com esses arquivos). Eu não recomendo essas opções para a maioria dos casos.

use --stats para ver como seus arquivos estão sendo transferidos usando o protocolo incremental RSYNC.

2
gbjbaanb

Outra estratégia é tornar o ssh e o rsync mais rápido. Se você estiver passando por uma rede confiável (leia: privado), criptografando a carga real não é necessária. Você pode usar HPN SSH . Esta versão do SSH só criptografa a autenticação. Além disso, a versão 3 do rsync começa a transferir arquivos ao criar a lista de arquivos. Esta é claro, é uma enorme economia de tempo sobre a versão do rsync 2. Eu não sei se é isso que você estava procurando, mas espero que ajude. Além disso, o RSYNC suporta multicasting de alguma forma, embora eu não fingirá entender como.

2
Jackalheart

Quando você está rsyncing como método de backup, o maior problema que você vai se deparar será se você tiver muitos arquivos que você está fazendo backup. O rsync pode lidar com arquivos grandes sem um problema, mas se o número de arquivos que você estiver fazendo backup, fica muito grande, então você notará que o rsync não será concluído em um período de tempo razoável. Se isso acontecer, você precisará quebrar o backup em partes menores e, em seguida, loop sobre essas partes, e.

find /home -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n 1 -I {} -- rsync -a -e ssh {} [email protected]:/backup/

ou turar o conjunto de arquivos para reduzir o número de arquivos.

Quanto a ter dezenas de máquinas recebendo um espelho dessas mudanças, depende de quão fresco o backup precisa ser. Uma abordagem seria espelhar as mudanças no servidor principal para o servidor de backup e, em seguida, os outros servidores puxarem as alterações do servidor de backup por um daemon do rsync no servidor de backup inicial e, em seguida, agendando os outros servidores para puxar um pouco Diferentes tempos ou por ter um script use o ssh sem senha para se conectar a cada um dos servidores e dizer-lhes para puxar uma nova cópia do backup que ajudaria a evitar o esmagador do seu servidor de backup inicial - mas se você vai para o máximo que vai depender Em quantas outras máquinas você tem uma cópia do backup.

2
Rodney Amato