Minha intenção é manter dois diretórios remotos (digamos dir1 e dir2) sincronizados. Assim, sempre que houver uma alteração no conteúdo do dir1 (pode ser adição ou exclusão de um novo arquivo ou diretório ou modificação do conteúdo de um arquivo no diretório), a alteração deverá ser propagada para o dir2 e vice-versa.
A maneira ingênua de fazer isso é executar o rsync periodicamente via cron em ambas as máquinas. Mas existem falácias nesta abordagem: -
- Pode acontecer que o rsysnc anterior não esteja completo e o cron execute o rsync mais uma vez enquanto o rysnc anterior ainda está em andamento.
- Um novo arquivo é adicionado no dir1 e antes do rsync ser executado no dir2, o rsync no dir1 é executado, então o arquivo recém-adicionado pode ser excluído do dir1, pois não está presente no dir2
- Além disso, isso não é em tempo real.
Alguns podem sugerir uma maneira melhor de fazer isso? Estou procurando um código aberto que seja mais fácil de configurar e começar.
Responder1
A única maneira de fornecer uma garantia "dura em tempo real" sem uma janela de corrida é garantir que uma gravação seja reconhecida somente depois de atingir ambos os lados. A maneira usual de conseguir isso é com um sistema de arquivos em cluster (como OCFS2 ou GFS2) em um dispositivo de bloco compartilhado. Esse dispositivo de bloco compartilhado pode ser construído de maneira fácil e barata usando DRBD.
Como acontece com qualquer mecanismo de sincronização, sua rede intracluster deve ser capaz de transportar a taxa de alteração com latência aceitável.
A folha de dicas está em torno das linhas de
- Reserve um dispositivo de bloco (disco, partição, LV, ..) em ambos os lados
- instale e configure o DRBD (apt-get install drbd-utils), use a excelente documentação emo site deles
- Instale uma pilha de cluster de sua escolha: Red Hat completo (se você precisar de mais do que apenas um sistema de arquivos compartilhado) ou o O2DLM minimalista, mas muito fácil (incluído no OCFS2).
- Formate o dispositivo DRBD com GFS2 (somente pilha Red Hat) ou OCFS2 (possível com ambas as pilhas) e monte-o em ambos os lados
Agora você NÃO tem um par de diretórios sincronizados: você tem um único diretório, que está disponível em ambos os nós. Funcionalmente é o mesmo, mas sem as janelas de corrida.
Responder2
Se estiver na mesma máquina, considere usar um link de sistema de arquivos. Isso significaria que dir2 "aponta" para dir1 ou vice-versa, embora fosse transparente. Para fazer isso, use, ln
por exemplo ln -s /path/to/dir1 /path/to/dir2
, ou alternativamente, use caminhos relativos. Isso -s
significa que é um link simbólico, portanto, refere-se apenas ao caminho e não ao inode de dir1
.
Editar: Desculpe, perdi a parte "ambas as máquinas".
Talvez considere usar um compartilhamento de rede, sincronizar dois locais em tempo (quase) real é sempre difícil.