Sincroniza os mesmos diretórios entre dois servidores linux

1

Existem dois servidores Linux do RHEL 7.2 localizados em locais diferentes. Ambos têm a mesma estrutura de diretórios. O requisito é manter certos diretórios dos dois servidores em sincronia, ou seja, qualquer modificação no servidor1 deve ser refletida no servidor2 e vice-versa, mas se algum arquivo for excluído localmente, não deverá ser excluído do servidor remoto também. Se alguns arquivos forem modificados enquanto o link entre esses dois servidores estiver inativo, ele deverá ser copiado assim que o link for estabelecido. Para implementar, é feito o seguinte script:

#!/bin/bash
EVENTS="CREATE,MOVED_TO,MODIFY"
inotifywait -e "$EVENTS" -m -r --format '%w%f' --fromfile list.txt|
while read FILE; do
    echo $FILE
    returnvalue=1
    while [[ $returnvalue -ne 0  ]]
    do
        rsync -azr $FILE backupserver:/$FILE
        returnvalue=$?
        echo $returnvalue
        if [[ $returnvalue -ne 0 ]]
        then
            sleep 60
        fi
   done
done

list.txt contém todos os diretórios a serem monitorados. Este script está sendo executado nos dois servidores.

Problema: sempre que alguma modificação é feita no servidor1, ele a detecta e copia para o servidor2 com código de retorno 0 . Mas isso é detectado no server2 como nova modificação e ele tenta copiar de volta para server1, já que esse arquivo está presente no server1 rsync retorna um código de erro 23 , então os programas ficam presos.

Qual é a melhor solução para esse problema?

Observação: Não podemos usar a opção --ignore-existing já que o mesmo arquivo existe em ambos os lugares e precisa ser atualizado se o conteúdo for alterado.

    
por Sushovan 25.11.2016 / 12:29

3 respostas

0

O problema foi devido à criação de arquivos temporários, como sugerido em outras respostas. Ele foi resolvido quando adicionei - temp-dir = / tmp como uma opção de rsync.

    
por 28.11.2016 / 11:02
0

** primeiro pensei que isso poderia ser um problema de opção de rsync ** Eu acho diferente agora!

Resposta: use um bloqueio local para reivindicar o direito de fazer uma cópia

Eu sugeriria um teste simples, se você não tem um, de um diretório - e primeiro - apenas use os padrões e veja onde isso não funciona como desejado.

** coisas rsync deletadas **

OK - faça o backup de 4 etapas e observe novamente.

Talvez o problema seja a lógica do loop:

  • O ServerA tem uma alteração (para um LARGEFILE), ele começa a copiá-lo.
  • Agora, no ServerB, LARGEFILE é novo / modificado DURANTE a cópia rsync / rcp e tenta copiá-lo de volta 'imediatamente'

Eu suspeito que esse "imediatismo" esteja na raiz do problema.

Minha sugestão é adicionar um arquivo "LOCK" de algum tipo:

  • coloque o bloqueio localmente
  • verifique se há bloqueio remoto, se encontrado no remoto, remova o bloqueio local e ignore inotify local
  • se não for encontrado no remoto, inicie a cópia do arquivo, remova o bloqueio quando a cópia terminar
por 25.11.2016 / 14:21
0

Você pode substituir a espera em MODIFY events esperando em close_write (arquivo fechado após ser aberto gravável), o que garantirá que você não tente rsync arquivos que ainda estão mudando.

    
por 25.11.2016 / 19:22