디렉터리를 원격 서버의 디렉터리로 동기화해야 합니다. 현재는 rsync -ca
이 작업을 정기적으로 수행하지만 디렉터리가 매우 크고 시간 초과 오류로 인해 전체 프로세스가 실패합니다.
이제는 "일회성" 방법이 아닌 파일 동기화를 통해 파일을 찾고 있습니다. find
발견된 각 서버 와 유사합니다 rsync
. 이를 수행하는 가장 쉬운 방법은 무엇입니까?
다음 오류가 발생합니다.
receiving incremental file list
Write failed: Broken pipe
rsync: connection unexpectedly closed (1175057 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601)[receiver=3.0.7]
rsync: connection unexpectedly closed (287 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7]
답변1
서버가 SSH 연결 수준에서 시간 초과된 것 같습니다.
그래서 다음 설정을 추가했습니다.
KeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 6
/etc/ssh/ssh_config
(또는 ) 에게 ~/.ssh/config
이제 유망해 보입니다.
답변2
업데이트: 체크섬을 생성할 때 rsync가 시간 초과된 것 같으므로 다음과 같이 작동할 수 있는 몇 가지 다른 접근 방식이 있습니다.
먼저 하나의 rsync만 열어 두려면 (Michael Kjörling이 언급한 것 외에) 이 옵션을 사용할 수 있습니다 --sockopts
. 이를 통해 SO_RCVTIMEOUT=0
데이터 수신 시간 초과 비활성화 와 같이 코드에서 소켓을 생성할 때 설정한 것과 동일한 유형의 소켓 옵션을 설정할 수 있습니다 .
둘째, 이 --progress-file
옵션은 진행 정보를 지속적으로 다시 전송하여 시간 초과를 트리거하지 않는 데 충분할 수 있습니다.
셋째, 파일별 동기화를 수행할 수 있습니다. 예를 들면 다음과 같습니다.
for i in ls /path/to/dir; do rsync -ca $i remoteserver:/path/to/dir; done
넷째, ssh를 전송 메커니즘으로 사용하고 연결을 유지하기 위해 적절한 방식으로 TCPKeepAlive
및 ServerAliveInterval
/ 옵션을 사용할 수 있습니다.ServerAliveCountMax
원래 답변: 이미 rsync하다파일별 접근 방식 - 동기화할 파일 목록의 각 파일을 확인하여 대상 시스템에 존재하지 않거나 대상 시스템의 파일과 다른 파일만 동기화합니다.
전송 시간을 줄이는 한 가지 방법은 -z
옵션과 플래그를 사용하여 전송 중에 압축하여 --partial
전송이 중단된 경우 부분적으로 동기화된 파일을 유지하여 rsync가 원래 위치에서 계속될 수 있도록 하는 것입니다. Michael Kjörling이 언급한 --timeout 및 --contimeout 옵션도 유용할 수 있습니다.
답변3
어쩌면 이런 게 있지 않을까요?
find . -type f -exec 'rsync' '{}' ';'
이는 현재 디렉터리의 각 일반 파일에 대해 rsync를 한 번 수행하고 파일 이름(token으로 표시됨 {}
)을 명령줄 인수로 전달합니다.
관련 디렉터리에 심볼릭 링크, 장치 파일 등이 있는 경우 논리를 반대로 시도할 수 있습니다.
find . -not -type f -exec 'rsync' '{}' ';'
이는 요청한 작업을 수행한다는 의미에서 "작동"해야 합니다(파일당 한 번 rsync 시작). 하지만 나는 당신이 잘못된 방향으로 가고 있다고 생각합니다.
rsync 매뉴얼 페이지에는 grep for 의 --timeout
(I/O 시간 초과) 및 (연결 시간 초과)가 나열되어 있습니다 .--contimeout
timeout
답변4
저에게는 느린 연결을 통해 대규모 rsync 전송을 재개할 때 이런 일이 계속 발생합니다. 나는 ssh의 모든 문제를 피하기 위해 rsyncd를 사용하기도 합니다.
-z
압축( 또는 --compress
)을 활성화하면 문제가 해결되는 것으로 나타났습니다 . 전송은 거의 즉시 재개됩니다.