我在 Linux 服务器上有一个二进制文件,该文件正在由进程主动附加(用 C 语言编写,具有持续打开的文件处理程序并将非 ASCII 缓冲区刷新到该文件)。我想将此文件复制到另一台服务器而不锁定写入(C 进程),最好不要每次都复制整个文件(文件大小 ~1+GB 且复制频率 < 1 秒)。
我探索了以下内容: rsync:我相信 rsync 执行完整复制,但不是增量复制。
filebeat by elasticsearch:它需要 ASCII 文本和换行符(我两者都没有)。
我更愿意利用标准 Linux 工具,但我对任何其他第 3 方解决方案或自己创建 C 程序持开放态度:)。
答案1
如果只是存在的话附加的到(并且中间没有修改),你可以直接运行tail -f
它。它应该等待任何新附加的数据并打印它,您可以告诉它从哪个位置开始:
tail -c 0 -f datafile # start at the current file end
tail -c +123 -f datafile # start at byte 123
要实际将数据移动到某个地方,管道应该ssh
可以工作:
因此,如果远程端已经有前 123456 个字节:
tail -c +123456 -f datafile | ssh user@somehost 'cat >> datafile.copy'
(当然,在启动管道之前,您需要检查远程上的文件大小。)
相反,如果您对文件的中间进行了修改,则程序本身将需要某种日志记录层。文件系统快照可能可以,但是一秒的间隔可能太难了,特别是因为无论如何您都需要扫描文件以查找更改。
答案2
Rsync 应在初始同步后推送增量。另一种选择可能是对文件的位置进行快照。这取决于您使用的 LVM 是否具有支持快照的文件系统。您可以拍摄快照,然后将文件同步到远程位置。然后删除快照。我也喜欢这个想法,因为你没有接触实时文件。