Como usar rsync para sincronizar arquivos entre servidores

1. Introdução ao rsync e seus fundamentos

O rsync (remote synchronization) é uma ferramenta de código aberto amplamente utilizada para transferir e sincronizar arquivos entre diretórios locais e remotos. Desenvolvido originalmente por Andrew Tridgell e Paul Mackerras, tornou-se o padrão de fato para sincronização eficiente em ambientes Unix/Linux.

Seu principal diferencial é o algoritmo delta: em vez de transferir arquivos inteiros, o rsync divide os arquivos em blocos, calcula checksums e transfere apenas as diferenças. Isso reduz drasticamente o tráfego de rede e o tempo de operação, especialmente em arquivos grandes com pequenas alterações.

Os casos de uso mais comuns incluem:
- Backups incrementais de servidores de produção
- Migrações entre datacenters ou provedores de nuvem
- Deploy de aplicações web e atualizações de código
- Replicação de logs e dados entre clusters

2. Instalação e configuração básica do rsync

O rsync está disponível nos repositórios padrão da maioria das distribuições Linux. Para instalar:

# Debian/Ubuntu
sudo apt update && sudo apt install rsync

# RHEL/CentOS/Fedora
sudo yum install rsync        # ou sudo dnf install rsync

# Verificar versão
rsync --version

O rsync depende do SSH para comunicação remota segura. Configure chaves SSH para autenticação sem senha:

# Gerar par de chaves (se ainda não existir)
ssh-keygen -t ed25519 -f ~/.ssh/servidor_rsync

# Copiar chave pública para o servidor remoto
ssh-copy-id -i ~/.ssh/servidor_rsync.pub usuario@servidor-remoto.com

3. Sintaxe essencial e modos de operação

O rsync opera em três modos principais:

Modo local: sincroniza diretórios na mesma máquina.

rsync -av /origem/ /destino/

Modo remoto via SSH: sincroniza com servidor remoto usando shell seguro.

rsync -avz usuario@servidor-remoto.com:/pasta/remota/ ./pasta-local/

Modo daemon: utiliza o protocolo rsync nativo na porta 873 (dois pontos duplos).

rsync -av usuario@servidor::modulo /destino/

A diferença entre dois pontos simples (:) e duplos (::) é fundamental:
- : usa SSH como transporte (recomendado para segurança)
- :: usa o daemon rsync (mais rápido, mas requer configuração adicional)

4. Flags e opções fundamentais para sincronização

As opções mais importantes para sincronização eficiente:

# Sincronização completa com compressão e progresso
rsync -avz --progress /origem/ /destino/

# Sincronização com exclusão de arquivos no destino
rsync -avz --delete /origem/ /destino/

# Simular operação sem executar (dry-run)
rsync -avz --dry-run /origem/ /destino/

# Limitar largura de banda (100 KB/s)
rsync -avz --bwlimit=100 /origem/ /destino/

Explicação das flags:
- -a (archive): modo recursivo que preserva permissões, timestamps, proprietários, grupos e links simbólicos
- -v (verbose): exibe detalhes da transferência
- -z (compressão): comprime dados durante a transferência
- --delete: remove arquivos no destino que não existem na origem
- --dry-run: simula a operação para verificar o que será alterado

5. Sincronização incremental e controle de tráfego

O rsync detecta automaticamente arquivos alterados comparando timestamps e tamanhos. Para forçar verificação por checksum (mais preciso, porém mais lento):

rsync -avzc --checksum /origem/ /destino/

Para excluir arquivos ou diretórios específicos:

rsync -avz --exclude='*.log' --exclude='cache/' /origem/ /destino/

Para incluir apenas padrões específicos:

rsync -avz --include='*.pdf' --include='*/' --exclude='*' /origem/ /destino/

6. Estratégias avançadas de backup e deploy

Backups rotativos com hard links (snapshots eficientes):

#!/bin/bash
DATA=$(date +%Y-%m-%d)
LINK_DEST="/backups/anterior"
DEST="/backups/$DATA"

rsync -avz --link-dest=$LINK_DEST /dados/ $DEST/

Este comando cria um backup completo, mas arquivos inalterados são armazenados como hard links, economizando espaço em disco.

Sincronização bidirecional controlada:

# Atualizar apenas arquivos mais recentes na origem
rsync -avu /origem/ /destino/

# Ignorar arquivos que já existem no destino
rsync -av --ignore-existing /origem/ /destino/

Preservar permissões e ACLs em sistemas de arquivos avançados:

rsync -avAX /origem/ /destino/   # Preserva ACLs e atributos estendidos

7. Automação e monitoramento de sincronizações

Crie scripts shell para sincronizações recorrentes. Exemplo de script completo:

#!/bin/bash
# Script: sync_backup.sh
ORIGEM="/var/www/html"
DESTINO="usuario@backup-server.com:/backups/site"
LOG="/var/log/rsync_backup.log"
EMAIL="admin@exemplo.com"

rsync -avz --delete --bwlimit=500 $ORIGEM $DESTINO > $LOG 2>&1

if [ $? -eq 0 ]; then
    echo "Sincronização concluída com sucesso em $(date)" >> $LOG
else
    echo "ERRO na sincronização em $(date)" >> $LOG
    mail -s "Falha no rsync" $EMAIL < $LOG
fi

Agende com cron (execução diária às 2h):

0 2 * * * /home/admin/sync_backup.sh

Para monitoramento via systemd timer:

# /etc/systemd/system/rsync-backup.service
[Unit]
Description=Rsync Backup Service

[Service]
Type=oneshot
ExecStart=/home/admin/sync_backup.sh

# /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Run rsync backup daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

8. Segurança, boas práticas e solução de problemas

Restrições de segurança recomendadas:

# No servidor remoto, crie um usuário dedicado
sudo useradd -m -s /bin/bash rsyncuser

# Restrinja comandos SSH no arquivo ~/.ssh/authorized_keys
command="rsync --server --sender -vlogDtprze.iLsf . /caminho/permitido",no-port-forwarding,no-X11-forwarding ssh-ed25519 AAA... chave-publica

Controle de permissões durante sincronização:

# Forçar permissões específicas no destino
rsync -avz --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r /origem/ /destino/

# Alterar proprietário (requer root)
rsync -avz --chown=www-data:www-data /origem/ /destino/

Solução de problemas comuns:

Problema Causa provável Solução
Permission denied (publickey) Chave SSH não autorizada Verificar authorized_keys
rsync: failed to set permissions Usuário sem privilégios Usar --no-perms ou executar como root
file has vanished Arquivo removido durante sincronização Ignorar com --ignore-errors
Conexão lenta Largura de banda insuficiente Usar --bwlimit e -z compressão

Referências