Estou tentando sincronizar conteúdo entre dois servidores. Os servidores são compilações idênticas (Ubuntu 12.04LTS) e têm este cron job em execução para sincronizar o conteúdo:
rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* [email protected]:/htdocs/testing/www/cms_uploads/
mas estou obtendo alguns resultados estranhos ao testar o processo conforme detalhado abaixo.
Primeiro teste
- Carregado aaaa.jpg para Node2
- sincroniza com o Node1
- Excluir do Node1
- Reaparece no Node1
- Excluir do Node2
- Removido do Nó1
Segundo teste
- Carregado bbbb.png para Node1
- Sincroniza com o Node2
- Excluir do Node2
- Reaparece no Node2
- Excluir do Nó 1
- Reaparece no Node1
Tudo o que estou tentando fazer é garantir que o mesmo conteúdo seja exatamente o mesmo em ambos os servidores o tempo todo. O que estou fazendo de errado?
Responder1
rsync
não está configurado para fazer sincronizações bidirecionais. Sem ajuda específica (por exemplo, sincronização da máquina que foi alterada) e muita sorte, não será possível fazê-lo.
A sorte é necessária para que as mudanças sejam pouco frequentes e distantes. Se tanto o Nó1 quanto o Nó2 forem alterados antes do início da próxima sincronização (de qualquer uma das máquinas), algumas alterações serão perdidas na sincronização.
Veja tambémesse
Responder2
Há algo fundamentalmente quebrado na definição do seu problema. Suponha que seus servidores estejam sincronizados e então você crie um arquivo aaaa.jpg
no Nó 2. A próxima sincronização deve excluir esse arquivo espúrio do Nó 2 (já que ele não existe no Nó 1, ele deve ter sido excluído) ou deveria copiar o arquivo para o Nó 1 (como não existe no Nó 1, deve ser criado novamente)?
A ordem em que você executa as sincronizações determinará o que acontecerá em cada caso. É praticamente garantido que isso não dará o resultado desejado em muitos casos. Pior ainda, se as sincronizações forem executadas em paralelo (de modo que um dos hosts esteja sendo atualizado por seu próprio trabalho de sincronização e ao mesmo tempo seja atravessado pelo trabalho de sincronização em execução no outro host), o resultado parecerá bastante aleatório.
O Rsync foi projetado fundamentalmente para sincronização unidirecional. Você não pode simplesmente executar dois trabalhos rsync e esperar fazer uma sincronização bidirecional.
Uníssonoé um sincronizador de arquivos projetado para sincronização bidirecional. É o que há de mais próximo da ferramenta certa para sua tarefa. Configure-o e execute-o unison -auto remote.example.com://path/to/directory /path/to/directory
em um dos hosts.
Não importa qual ferramenta você use, há potencial para conflitos, por exemplo, se o mesmo arquivo for substituído por duas versões diferentes em duas máquinas diferentes. Não existe uma boa maneira automatizada de resolver tais conflitos, portanto será necessária uma intervenção manual.
Na maioria das configurações, o correto é designar um único servidor como local de upload e sincronizar todos os outros servidores desse servidor mestre. Se alguém enviar um arquivo para um escravo, faça com que ele retransmita o upload para o mestre; não mude nada localmente. Sempre que um arquivo for alterado no mestre, envie-o para o(s) escravo(s).
Responder3
rsync tem uma opção -u que faz:
"Isso força o rsync a pular quaisquer arquivos que existam no destino e tenham um horário de modificação mais recente que o arquivo de origem. (Se um arquivo de destino existente tiver um horário de modificação igual ao do arquivo de origem , ele será atualizado se os tamanhos forem diferentes.)"
Portanto, um script de shell que contém
1) o comando que você deu mais a opção -u e menos a opção -c e
2) o mesmo comando, mas com a direção invertida,
pode classificar- de realizar uma sincronização bidirecional, mas com dois problemas:
1) arquivos excluídos (ou renomeados) no servidor remoto serão copiados do local b/c rsync pensará que encontrou um novo arquivo no local, e
2) se um único arquivo é alterado em ambos os locais entre as sincronizações, apenas as alterações mais recentes serão preservadas.