Espelhamento de arquivos entre servidores com latência mínima

2

Plataforma: Ubuntu 10.04 x86.

Temos um servidor HTTP (nginx, mas isso não é relevante) que serve algum conteúdo estático. O conteúdo é (raramente) carregado por gerenciadores de conteúdo via SFTP, mas pode ser alterado / adicionado por outros meios (como cat , feito diretamente no servidor).

Agora, queremos adicionar um segundo servidor HTTP idêntico - um espelho secundário em outro datacenter de outro continente. (E configure o round-robin do DNS.)

Qual é a melhor maneira de configurar a sincronização entre o servidor mestre e um espelho secundário, para que o atraso entre a modificação e a ressincronização seja mínimo (alguns segundos devem ser suportáveis)?

A solução deve lidar com grandes mudanças e condições de corrida. Ou seja, se eu alterar 1000 arquivos, ele não deve gerar 1000 processos de sincronização. E se eu mudar alguma coisa enquanto a sincronização estiver ativa, minha nova alteração deve eventualmente chegar ao servidor também ... E assim por diante.

Soluções rejeitadas:

  • CDN - não vale o dinheiro para nosso cenário de uso específico.
  • nfs - não na internet global.
  • dumb cron + rsync - a latência e / ou o carregamento do sistema seriam muito grandes.
  • rsync manual - não confiável, o conteúdo é alterado por usuários que não são de TI.

Eu diria que precisamos de algo baseado em inotify. Existe uma solução pronta?

Atualização: dois requisitos extras (bastante óbvios) que esqueci de mencionar:

  • Se os dados forem alterados de alguma forma no espelho secundário (digamos, um superusuário apagou acidentalmente um arquivo), a solução de sincronização deve restaurar os dados de volta ao estado principal na próxima sincronização.

  • Em estado ocioso, a solução não deve consumir tráfego ou recursos do sistema (além de alguma memória, etc., para o processo de daemon de dormir, é claro).

Atualização 2: mais um requisito:

  • A solução deve funcionar com nomes de arquivos UTF-8.
por Alexander Gladysh 07.06.2011 / 21:49

4 respostas

1

E quanto pirsyncd ? Eu acho que é uma boa ideia para você;)

    
por 08.06.2011 / 00:30
1

Você considerou o Unison como um meio de manter os arquivos em sincronia? Ao usá-lo, você poderá fazer a sincronização unidirecional solicitada. Parece um ajuste razoável para esta aplicação.

    
por 07.06.2011 / 21:57
1

Você pode usar lsyncd consulte: Is existe uma solução de backup Linux que usa inotify?

    
por 07.06.2011 / 23:44
-2

Parece que é aqui que você pode escrever um script que verifica o registro de data e hora dos arquivos e se o registro de data é posterior à última execução do script, presuma que esse arquivo precisa ser pressionado e disparar o rsync ou outra ferramenta para sincronizar o arquivo. Da mesma forma, do outro lado, faça o mesmo com a verificação se um arquivo foi alterado e, em caso afirmativo, acione um pull. Tecido pode realmente ser uma boa ferramenta para isso. Se você estiver familiarizado com o Python, o uso de fabric pode ser o caminho a percorrer, em combinação com a verificação de timestamp.

    
por 08.06.2011 / 16:16