Synchronisation unidirectionnelle / répliquer grand file par incréments

J'ai un file binary sur un server Linux qui est activement ajouté par un process (écrit en C avec un gestionnaire de files constamment ouvert et en vidant le tampon non-ASCII à ce file). Je voudrais reproduire ce file sur un autre server sans verrouiller l'écriture (de preference) et ne pas copyr le file entier à chaque fois (taille du file ~ 1 + Go et fréquence de réplication <1 sec).

J'ai exploré ce qui suit: rsync: Je crois que rsync fait une réplication complète, mais pas incrémentielle.

filebeat par elasticsearch: il nécessite du text ASCII et des returns à la ligne (je n'en ai ni).

Je voudrais de preference utiliser les outils Linux standard, mais je suis ouvert à toute autre solution tierce ou à la création d'un programme C moi-même :).

Si c'est seulement ajouté (et non modifié au milieu), vous pourriez simplement exécuter la tail -f dessus. Il doit attendre toutes datatables nouvellement ajoutées et l'imprimer, et vous pouvez lui indiquer la position à partir de laquelle:

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

Pour déplacer réellement datatables quelque part, passer à ssh devrait fonctionner:

Donc, si l'extrémité distante a déjà les premiers 123456 octets:

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

(Bien sûr, vous devez vérifier la taille du file sur la télécommand avant de démarrer le pipeline.)


Si, au contraire, vous avez des modifications au milieu du file, vous aurez besoin d'une sorte de couche de consignation dans le programme lui-même. Les instantanés du système de files peuvent l'être, mais l'intervalle d'une seconde peut être trop difficile, d'autant plus que vous devez parsingr le file pour les changements.

Rsync devrait pousser les deltas après la synchronisation initiale. Une autre option pourrait être d'instantané l'location du file. Cela dépend si vous utilisez LVM d'avoir un système de files prenant en charge les instantanés. Vous pouvez prendre un instantané, puis synchroniser le file avec l'location distant. Supprimez ensuite l'instantané. J'aime aussi cette idée parce que vous ne touchez pas au file live.