Linux 서버에 프로세스에 의해 적극적으로 추가되는 바이너리 파일이 있습니다(ASCII가 아닌 버퍼를 파일에 계속 열고 플러시하는 파일 핸들러를 사용하여 C로 작성됨). 쓰기(C 프로세스)를 잠그지 않고 이 파일을 다른 서버에 복사하고 싶습니다. 매번 전체 파일을 복사하지 않는 것이 좋습니다(파일 크기 ~1+GB 및 복사 빈도 < 1초).
나는 다음을 조사했습니다. rsync: rsync는 전체 복사를 수행하지만 증분 복사는 수행하지 않는다고 생각합니다.
filebeat by elasticsearch: ASCII 텍스트와 개행 문자가 필요합니다(둘 다 없습니다).
저는 표준 Linux 도구를 활용하는 것을 선호하지만 다른 타사 솔루션이나 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'
(물론 파이프라인을 시작하기 전에 원격에서 파일 크기를 확인해야 합니다.)
반대로 파일 중간에 수정을 하면 프로그램 자체에 일종의 로깅 계층이 필요하게 됩니다. 파일 시스템 스냅샷은 작동할 수 있지만 1초 간격은 너무 어려울 수 있습니다. 특히 파일에서 변경 사항을 검색해야 하기 때문에 더욱 그렇습니다.
답변2
Rsync는 초기 동기화 후 델타를 푸시해야 합니다. 또 다른 옵션은 파일 위치의 스냅샷을 찍는 것입니다. 이는 사용 중인 LVM에 스냅샷을 지원하는 파일 시스템이 있는지 여부에 따라 달라집니다. 스냅샷을 찍은 다음 파일을 원격 위치에 동기화할 수 있습니다. 그런 다음 스냅샷을 삭제합니다. 라이브 파일을 건드리지 않기 때문에 이 아이디어도 마음에 듭니다.