Sincronização unidirecional / replicar arquivo grande de forma incremental

3

Eu tenho um arquivo binário em um servidor Linux que está sendo anexado ativamente por um processo (escrito em C com um manipulador de arquivos constantemente aberto e liberando buffer não-ASCII para este arquivo). Eu gostaria de replicar este arquivo para outro servidor sem bloquear a gravação (processo C), de preferência, e não copiar o arquivo inteiro de cada vez (tamanho do arquivo ~ 1 + GB e freqüência de replicação < 1 seg).

Eu explorei o seguinte: rsync: Acredito que o rsync faz uma replicação completa, mas não incremental.

filebeat por elasticsearch: requer texto ASCII e novas linhas (não tenho nenhum).

De preferência, gostaria de aproveitar as ferramentas padrão do Linux, mas estou aberto a qualquer outra solução de terceiros ou criando um programa em C sozinho:).

    
por rocketman 09.03.2017 / 22:16

2 respostas

3

Se estiver apenas sendo adicionado (e não modificado no meio), você pode simplesmente executar tail -f nele. Ele deve aguardar por qualquer dado recém-adicionado e imprimi-lo, e você pode dizer em que posição começar:

tail -c 0 -f datafile        # start at the current file end
tail -c +123 -f datafile     # start at byte 123 

Para realmente mover os dados para algum lugar, a passagem por ssh deve funcionar:

Portanto, se a extremidade remota já tiver os primeiros 123456 bytes:

tail -c +123456 -f datafile | ssh user@somehost 'cat >> datafile.copy'

(É claro que você precisa verificar o tamanho do arquivo no controle remoto antes de iniciar o pipeline).

Se, ao invés disso, você tiver modificações no meio do arquivo, precisará de algum tipo de camada de registro no próprio programa. As capturas instantâneas do sistema de arquivos podem funcionar, mas o intervalo de um segundo pode ser muito difícil, especialmente porque você precisaria varrer o arquivo para as alterações de qualquer maneira.

    
por 09.03.2017 / 23:26
0

O rsync deve enviar os deltas após a sincronização inicial. Outra opção pode ser a captura instantânea da localização do arquivo. Isso vai depender se você está usando o LVM de ter um sistema de arquivos que suporta instantâneos. Você pode tirar um instantâneo e sincronizar o arquivo para o local remoto. Em seguida, remova o instantâneo. Também gosto dessa ideia porque você não está tocando no arquivo ao vivo.

    
por 09.03.2017 / 22:46