terça-feira, 13 de novembro de 2007

Sincronizando computadores com rsync

Às vezes é necessário sincronizar dados entre servidores ou até mesmo copiar um servidor inteiro para outro hardware. Uma aplicação fantástica para essas tarefas é o rsync.

O rsync é uma ferramenta open source que permite a transferência de arquivos de forma incremental. Além disso, ela pode também ser usada para sincronia entre micros, partições e diretórios.

Nesse post, vou supor que seja necessário sincronizar um servidor inteiro para outro. Vou também supor que o kernel do Linux não seja compilado especificamente para o hardware, ou se for o caso, que os dois hardwares sejam idênticos. Também estou supondo que o particionamento dos discos seja igual, ou que ao menos existam as mesmas partições vinculadas aos mesmos devices (os tamanhos dos particionamentos podem ser diferentes (assim como os tipos de sistemas de arquivos), mas se obviamente o seu particionamento destino for menor que o origem os dados poderão não caber).

A melhor forma de uso do rsync para esse tipo de tarefa, do meu ponto de vista, é como cliente/servidor.

Configurando o servidor (origem dos dados)
No caso de seu micro origem ser um Debian (ou Ubuntu), será necessário antes de mais nada permitir que o daemon do rsync possa ser iniciado. Para isso deve-se alterar a opção RSYNC_ENABLE de false para true no arquivo /etc/default/rsync.

Depois é preciso configurar o arquivo /etc/rsyncd.conf.

Para ficar bem genérico, pode-se deixar o mesmo da seguinte forma:

[root]
path=/
uid=0
gid=0
read only=true
exclude=/etc/network/interfaces /etc/hostname

Esse configuração lhe dá acesso a todo o sistema de arquivos, com permissão somente de escrita.
Na linha exclude você deverá setar os arquivos e/ou diretórios que não devem ser sincronizados (separe os mesmos por espaço).

Depois disso já é possível iniciar o daemon.

ATENÇÃO: não aconselho manter o daemon ativo dessa forma, por questões óbvias de segurança (que não serão tratadas nesse post). Use o mesmo e desabilite-o logo em seguida.

Sincronizando o cliente (destino)
Supondo que seu servidor de origem tenha 4 partições ( /, /usr, /var e /home ), você pode rodar 4 comandos rsync no cliente para pegar os dados partição a partição (apesar de ser possível sincronizar direto o / teríamos de separar uma série de pastas que não necessariamente precisam ser sincronizadas. Além disso a opção x garante que o somente a partição selecionada seja trazida sem invadir outros pontos de montagem temporários como /var/run, /var/lock, entre outros ):

rsync -avx --delete ip::root/ /
rsync -avx --delete ip::root/usr/ /usr/
rsync -avx --delete ip::root/var/ /var/
rsync -avx --delete ip::root/home/ /home/

Obviamente você pode adicionar outras partições se for o caso (ou remover também).

Explicando os parâmetros
A opção -a aciona o modo arquivo e é o mesmo que a opção -rlptgoD (recursivo, com cópia de symlinks, preservando permissões, preservando data e hora, preservando grupos, preservando proprietários e preservando arquivos especiais e de devices).
A opção v ativa o mode verboso.
A opção x ativa o backup do filesystem principal, sem entrar recursivamente nos demais.
A opção --delete faz com que os arquivos do destino que não existem na origem sejam apagados, para garantir que os dados sejam os mesmos nos dois lados.
O ip será o do seu servidor de origem (onde foi configurado o rsync servidor).
O root (logo após o ::) é o nome do "compartilhamento" que você setou no servidor.
Logo após o parâmetro "root" vem então o que você quer copiar (se for diretório, sempre é necessário finalizar com o /).
E por final, você deve informar o destino pra onde vão os dados (novamente, se for diretório, finalize com /).

Exemplos explicados
Ex: rsync -avx --delete ip::root/etc/ /tmp/
Irá sincronizar todo o conteúdo da pasta etc dentro da pasta tmp.

Ex: rsync -avx --delete ip::root/etc /tmp/
Irá sincronizar a pasta /etc dentro da pasta tmp (ou seja, existirá um /tmp/etc).

Considerações
Esse procedimento já foi testado com sucesso em servidores Debian até a versão 4.0 (Etch). No Ubuntu o mesmo também pode ser utilizado, mas com restrições, principalmente na sincronização do /, pois a forma de trabalho dos tmpfs do Ubuntu pode gerar problemas na hora de bootar o servidor (estamos estudando no momento uma forma de fazer isso com segurança).

Finalizando
Para finalizar acho que é importante lembrar que essa é apenas uma das possibilidades de uso do rsync, e que a ferramenta merece ser mais explorada pois pode ser usada no dia a dia de qualquer usuário, seja ele um administrador de sistema ou um usuário final.

Para mais informações consulte aqui e aqui.

4 comentários:

  1. Ola Marcelo seu artigo vai ser bem útil para mim, tenho que sincronizar um diretorio em dois computadores com ubuntu, o problema eh que estão em uma rede com ip não fixo mas acho que consigo resolver, só queria saber como faço para ele executar essa ação a cada período de tempo automaticamente.

    ResponderExcluir
  2. Para resolver seu problema, basta criar um script com o comando rsync e depois usar o cron para programar o script para ser rodado quando você quiser.

    Quanto ao caso do IP não fixo, se forem 2 computadores via Internet você pode usar um no-ip.org para solucionar isso.

    Olhe em http://www.no-ip.com/

    ResponderExcluir
  3. Marcelo, bom dia! Muito interessante o post, parabéns :)

    Eu consigo fazer com que sincronize TUDO?
    Ex.: /dev

    Quero ter dois servidores identicos para aplicar alta disponibilidade.

    Ja esta funcionando para o Debian 6 ?

    abs
    Luiz

    ResponderExcluir
    Respostas
    1. Olá Luiz,

      essa operação com o rsync pode ser efetuada em qualquer distro.

      No entanto alguns diretórios como /dev, /sys, /proc não devem ser replicados.

      []s

      Excluir