Pesquisa de site

Como sincronizar arquivos entre dois servidores bidirecionalmente


Suponha que você tenha uma coleção de arquivos que são replicados em dois servidores diferentes. As duas réplicas são então modificadas independentemente e você deseja que quaisquer alterações feitas em uma réplica sejam propagadas para a outra, de modo que ambas as réplicas permaneçam sincronizadas.

Existem várias ferramentas de espelhamento de arquivo no Linux, como rsync ou duplicati. No entanto, essas ferramentas destinam-se à sincronização de arquivos unidirecional (ou seja, enviar ou receber atualizações incrementais em uma direção) e, portanto, a sincronização bidirecional exigiria a execução dessas ferramentas duas vezes, uma para cada direção.

O Unison é uma ferramenta de sincronização de arquivos de código aberto que oferece suporte nativo à sincronização de arquivos bidirecional. O Unison está disponível em várias plataformas, incluindo Linux, FreeBSD, Windows e MacOS X. No Linux, o Unison está disponível como uma ferramenta de linha de comando, bem como um programa GUI com interface GTK+.

Neste tutorial, descreverei como sincronizar arquivos entre dois servidores com o utilitário de linha de comando Unison.

Instale o Unison no Linux

Para Ubuntu, Debian ou Linux Mint:


$ sudo apt-get install unison

Para Fedora, CentOS ou RHEL:


$ sudo yum install unison

Criar perfil uníssono

A primeira coisa a fazer é criar um perfil Unison em ambos os servidores que possuem réplicas para sincronizar. Um perfil Unison é um arquivo de texto (com extensão .prf) que especifica as configurações de sincronização de arquivos, como raízes de diretório, incluir/ignorar caminhos ou padrões, etc.

Você pode criar um perfil Unison em qualquer lugar em seu sistema, caso em que você deve definir a variável de ambiente UNISON apontando para o caminho do diretório para o perfil. Se a variável UNISON não for definida, o Unison procurará perfis no diretório $HOME/.unison por padrão.

O snippet a seguir é um exemplo de perfil do Unison.


# Two root directories to sync.
# You can use ssh:// to sync over SSH
root = /home/alice/sync_folder
root = ssh://[email //home/alice/sync_folder

# If you want one-way mirroring from one replica to the other, specify the source replica using "force" as follows.
# force = /home/alice/sync_folder

# If you want Unison to run without any user input, try "batch" mode.
batch = true

# If you don't want to be prompted, and just accept Unison's recommendation:
auto = true

# Optionally, you can sync specific sub directories only (under the root).
# path = dir1
# path = dir2

# Optionally, you can ignore specific files or directories that are matched with regular expressions.
# ignore = Name *.o
# ignore = Name *~
# ignore = Path */temp/archive_*

# If you want to ignore difference in file props:
perms = 0

As informações mais importantes acima são os dois diretórios raiz a serem sincronizados. O Unison oferece suporte a SSH, RSH ou soquete para sincronizar arquivos pela rede. Portanto, você pode especificar o diretório raiz em um host remoto usando um dos formatos abaixo:

SSH:


root = ssh://[email _host//absolute/path/to/root
root = ssh://[email _host/relative/path/to/root

RSH:


root = rsh://[email _host//absolute/path/to/root
root = rsh://[email _host/relative/path/to/root

Socket:


socket://remote_host:port_num//absolute/path/to/root
socket://remote_host:port_num/relative/path/to/root

Sincronizar arquivos com o Unison

Depois que um perfil Unison tiver sido criado em ambos os servidores, basta executar o Unison em qualquer um dos servidores.


$ unison

Se houver vários perfis Unison (por exemplo, sync1.prf, sync2.prf) no diretório Unison, você poderá especificar o nome do perfil da seguinte maneira.


$ unison sync1

Se você não configurou a autenticação SSH baseada em chave para o host remoto, o Unison solicitará que você faça login no host remoto via SSH antes de executar a sincronização de arquivos. Se você configurou o login SSH sem senha, o Unison iniciará automaticamente a sincronização de arquivos por SSH.


Contacting server...
Connected [//local//home/alice/sync_folder -> //remote_host//home/alice/sync_folder]
Looking for changes
  Waiting for changes from server
Reconciling changes
new file -->            document1.pdf
         <-- new file   my.jpg  
Propagating updates
UNISON 2.40.63 started propagating changes at 21:19:13.65 on 20 Sep 2013
[BGN] Copying document1.pdf from /home/alice/sync_folder to //remote_host//home/alice/sync_folder
[BGN] Copying my.jpg from //remote_host//home/alice/sync_folder to /home/alice/sync_folder
[END] Copying my.jpg
[END] Copying document1.pdf
UNISON 2.40.63 finished propagating changes at 21:19:13.68 on 20 Sep 2013
Saving synchronizer state
Synchronization complete at 21:19:13  (2 items transferred, 0 skipped, 0 failed)

Solucionando problemas de uníssono

Sintoma: ao executar o Unison, você vê a seguinte mensagem:


  Waiting for changes from server - document1.pdf
Reconciling changes

local          remote_host             
props    <-?-> props      /  [] 

Isso significa que o Unison tenta sincronizar as propriedades do arquivo (por exemplo, permissão de arquivo). Você pode pressionar I para ignorar este caminho permanentemente e prosseguir. Alternativamente, você pode ignorar props permanentemente adicionando a seguinte linha ao seu arquivo de perfil Unison.


perms = 0

Artigos relacionados: