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