O rsync de duas vias resulta em conteúdo oscilante

5

Estou tentando sincronizar conteúdo entre dois servidores. Os servidores são compilações idênticas (Ubuntu 12.04LTS) e têm essa tarefa cron funcionando 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 quando estou testando o processo, conforme detalhado abaixo.

Primeiro teste

  • Upload de aaaa.jpg para o Node2
  • sincroniza com o Nó1
  • Excluir do Nó1
  • reaparece no Nó1
  • Excluir do Node2
  • Removido do Node1

Segundo teste

  • Upload bbbb.png para Node1
  • Sincroniza com o Node2
  • Excluir do Node2
  • Reaparece no Node2
  • Excluir do nó 1
  • reaparece no Nó1

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 errado?

    
por Craig Ward 30.04.2013 / 12:12

3 respostas

3

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 é possível.

A sorte é necessária para que as mudanças sejam raras e distantes. Se o Nó1 e o Nó2 forem alterados antes que a próxima sincronização seja iniciada (a partir de qualquer uma das máquinas), algumas alterações serão perdidas na sincronização.

Veja também este

    
por 30.04.2013 / 12:37
1

Há algo fundamentalmente quebrado na sua declaração de problema. Suponha que seus servidores estejam em sincronia e, em seguida, crie um arquivo aaaa.jpg no Nó 2. Se a próxima sincronização 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 (já que ele não existe no Nó 1, ele deve ser recém-criado)?

A ordem em que você executa as sincronizações determinará o que acontece em cada caso. Isso é praticamente garantido para não dar o resultado desejado em muitos casos. Pior ainda, se as sincronizações forem executadas em paralelo (para que um dos hosts seja atualizado por seu próprio trabalho de sincronização e, ao mesmo tempo, esteja sendo percorrido pelo trabalho de sincronização em execução no outro host), o resultado parecerá bastante aleatório. / p>

O Rsync é fundamentalmente projetado para sincronização unidirecional. Você não pode simplesmente executar dois trabalhos de rsync e esperar fazer uma sincronização bidirecional.

Unison é um sincronizador de arquivos projetado para sincronização bidirecional. É a coisa mais próxima da ferramenta certa para a sua tarefa. Configure e execute unison -auto remote.example.com://path/to/directory /path/to/directory em um dos hosts.

Independentemente da ferramenta que você usa, existe a possibilidade de conflitos, por exemplo, se o mesmo arquivo for substituído por duas versões diferentes nas duas máquinas diferentes. Não há uma boa maneira automatizada de resolver esses conflitos, portanto, será necessária uma intervenção manual.

Na maioria das configurações, o correto é designar um único servidor como o local para fazer o upload e sincronizar todos os outros servidores desse servidor mestre. Se alguém fizer o upload de um arquivo para um escravo, faça-o retransmitir 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).

    
por 02.05.2013 / 03:46
1

O rsync tem uma opção -u que faz:
    "Isso força o rsync a pular quaisquer arquivos existentes no destino e ter um horário modificado mais recente que o arquivo de origem. Se um arquivo de destino existente tiver um tempo de modificação igual ao do arquivo de origem, ele será atualizado se os tamanhos forem diferente.) "
Então, 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 realizar uma sincronização bidirecional, mas com dois problemas:
1) arquivos apagados (ou renomeados) no servidor remoto serão copiados do b / c local rsync irá achar que encontrou um novo arquivo no local, e 2) se um único arquivo for alterado nos dois locais entre as sincronizações, apenas as alterações mais recentes serão preservadas.

    
por 03.10.2014 / 22:35