서로 다른 위치에 두 개의 RHEL 7.2 Linux 서버가 있습니다. 둘 다 동일한 디렉토리 구조를 갖습니다. 요구 사항은 두 서버의 특정 디렉터리를 동기화 상태로 유지하는 것입니다. 즉, server1의 모든 수정 사항은 server2에 반영되어야 하고 그 반대의 경우도 마찬가지입니다. 그러나 일부 파일이 로컬에서 삭제되면해서는 안 된다원격 서버에서도 제거됩니다. 두 서버 간의 링크가 끊어진 동안 일부 파일이 수정된 경우 링크가 설정되는 즉시 복사해야 합니다. 다음 스크립트를 구현하려면:
#!/bin/bash
EVENTS="CREATE,MOVED_TO,MODIFY"
inotifywait -e "$EVENTS" -m -r --format '%w%f' --fromfile list.txt|
while read FILE; do
echo $FILE
returnvalue=1
while [[ $returnvalue -ne 0 ]]
do
rsync -azr $FILE backupserver:/$FILE
returnvalue=$?
echo $returnvalue
if [[ $returnvalue -ne 0 ]]
then
sleep 60
fi
done
done
list.txt에는 모니터링할 모든 디렉터리가 포함되어 있습니다. 다음은 두 서버에서 실행되는 스크립트입니다.
질문: server1에서 일부 수정이 이루어질 때마다 이를 감지하여 server2에 복사합니다.반환 코드 0. 그러나 server2에서는 이것이 새로운 수정 사항임을 감지하고 파일이 server1에 존재하기 때문에 server1에 다시 복사하려고 시도합니다. rsync가 반환됩니다.오류 코드 23, 그래서 프로그램이 중단될 것입니다.
이 문제에 대한 가장 좋은 해결책은 무엇입니까?
노트:--ignore-existing 옵션은 양쪽에 동일한 파일이 존재하기 때문에 사용할 수 없으며, 내용이 변경되면 파일을 업데이트해야 합니다.
답변1
**처음에는 이것이 rsync 옵션 문제일지도 모른다고 생각했습니다** 이제는 다르게 생각합니다!
답: 로컬 잠금을 사용하여 복사 권한을 요청하세요.
디렉토리가 없으면 간단한 테스트를 수행하는 것이 좋습니다. 먼저 기본값을 사용하고 무엇이 예상대로 작동하지 않는지 확인하십시오.
**rsync 항목 제거됨**
좋아요 - 4단계를 백업하고 다시 살펴보세요.
어쩌면 문제는 순환 논리일 수도 있습니다.
- ServerA에는 LARGEFILE에 대한 변경 사항이 있으며 이를 복제하기 시작합니다.
- 이제 ServerB에서 LARGEFILE은 rsync/rcp 복사 중에 새/수정되었으며 "즉시" 다시 복사하려고 합니다.
나는 이 "즉각성"이 문제의 원인이라고 생각합니다.
내 제안은 "LOCK" 파일 유형을 추가하는 것입니다.
- 자물쇠를 로컬에 두세요
- 원격 잠금을 확인하고 원격에서 발견되면 로컬 잠금을 제거하고 로컬 inotify를 무시합니다.
- 원격에서 발견되지 않은 경우 파일 복사를 시작하고 복사가 완료된 후 잠금을 해제합니다.
답변2
MODIFY
대신 대기(쓰기 위해 파일을 연 다음 닫음)하여 이벤트를 기다릴 수 있습니다 close_write
. 이렇게 하면 여전히 변경 중인 파일을 재동기화하지 않도록 할 수 있습니다.
답변3
문제는 다른 답변에서 제안한 임시 파일 생성으로 인해 발생합니다. 추가하니 해결됐네요--temp-dir=/tmprsync 옵션으로.