여전히 쓰고있는 파일과의 rsync 동작?


12

Apache가 큰 파일을 작성하는 중이고 rsync cron 작업이 해당 파일에서 실행되는 경우 rsync가 파일 복사를 시도합니까?

  • Apache-1 : 파일 크기가을 (를) 쓰고 /var/www있습니다.
  • Apache-2 : Apache-1 복제. 5 분마다 cron을 실행하여 rsync를 /var/www동기화합니다.

답변:


20

아파치를 쓰는 한 장소에 어떤 종류의 파일을 작성하고 완료되지 않은 경우 다음과 rsync 에서 차기를 rsync복사합니다 어떤이 앉아있다.

Apache가 5MB 파일을 처리하는 경우 2MB 만 작성되어 rsync시작되면 부분 2MB 파일이 복사됩니다. 따라서 해당 파일이 대상 서버에서 "손상된"것처럼 보입니다.

사용중인 파일의 크기에 따라 --inplace옵션을 사용 rsync하여 다음을 수행 할 수 있습니다 .

이 옵션은 파일의 데이터를 업데이트해야 할 때 rsync가 파일을 전송하는 방법을 변경합니다. 파일의 새 사본을 작성하고 파일이 완료되면 파일을 제자리로 옮기는 기본 방법 대신, rsync는 업데이트 된 데이터를 대상에 직접 씁니다. 파일.

5MB 파일에 첫 번째 실행에서 2MB 만 복사 된 경우 다음 실행에서 2MB를 선택하고 전체 5MB가 제자리에 올 때까지 파일을 계속 복사한다는 이점이 있습니다.

부정적인 점은 파일을 복사하는 동안 누군가가 웹 서버에 액세스하는 상황을 만들어서 부분 파일을 볼 수 있다는 것입니다. 제 생각 rsync에는 "보이지 않는"파일을 캐싱 한 다음 즉시 제자리로 옮기는 것이 기본 동작에 가장 효과적입니다. 그러나 --inplace큰 파일과 대역폭 제약 조건은 큰 파일을 정사각형 파일에서 쉽게 복사하는 방식에 방해가되는 시나리오에 적합합니다.

그것은 당신이 이것을 진술했다; 강조는 내 것입니다 :

5 분마다 cron run rsync…

그래서이 cron 작업을 관리하기 위해 bash 스크립트가 있다고 가정합니다. 글쎄, rsync복사해야 할 파일 만 복사하기에 충분합니다. 그리고 5 분마다 실행되는 스크립트가 rsync있으면 더 빨리 진행되면 서로 밟지 않는 것 같습니다. 즉, 1 분마다 rsync실행하면 파일 크기 나 네트워크 속도로 인해 하나 이상의 프로세스가 여전히 실행 중이고 다음 프로세스가 경쟁 할 위험이 있습니다. 경주 조건.

이를 피하는 한 가지 방법은 전체 rsync명령을 파일 잠금을 확인하는 bash 스크립트 로 래핑하는 것입니다 . 아래는 이와 같은 경우에 사용하는 상용구 bash 스크립트 프레임 워크입니다.

어떤 사람들은 사용을 권장 flock하지만 flock내가 사용하는 일부 시스템에는 설치되어 있지 않기 때문에 우분투 (그것이있는)와 Mac OS X (많지 않은) 사이를 뛰어 넘습니다. 나는이 간단한 프레임 워크를 아무런 문제없이 사용합니다.

LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'

if mkdir ${LOCK_DIR} 2>/dev/null; then
  # If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
  echo $$ > ${PID_FILE}

  echo "Hello world!"

  rm -rf ${LOCK_DIR}
  exit
else
  if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
    # Confirm that the process file exists & a process
    # with that PID is truly running.
    echo "Running [PID "$(cat ${PID_FILE})"]" >&2
    exit
  else
    # If the process is not running, yet there is a PID file--like in the case
    # of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
    rm -rf ${LOCK_DIR}
    exit
  fi
fi

아이디어는 제가 가지고있는 일반적인 핵심이 echo "Hello world!"스크립트의 핵심입니다. 나머지는 기본적으로에 기반한 잠금 메커니즘 / 논리입니다 mkdir. 개념에 대한 좋은 설명은 이 답변에 있습니다 .

mkdir 은 디렉토리가 존재하지 않으면 디렉토리를 작성하고 존재하는 경우 종료 코드를 설정합니다. 더 중요한 것은 단일 원자 동작 으로이 모든 것을 수행 하여이 시나리오에 적합합니다.

따라서 rsync프로세스 의 경우 echo명령을 명령으로 변경 하여이 스크립트를 사용하는 것이 좋습니다 rsync. 또한을 LOCK_NAME같은 것으로 변경하면 RSYNC_PROCESS갈 수 있습니다.

이제이 rsync스크립트에 싸서 두 개 이상의 rsync프로세스가 동일한 작업을 수행하기 위해 경쟁하는 경합 조건의 위험없이 매분마다 cron 작업을 실행하도록 설정할 수 있습니다 . 이렇게하면 전송 속도 또는 rsync업데이트 속도를 높일 수있어 전송되는 부분 파일의 문제를 제거하지는 않지만 전체 프로세스 속도를 높이는 데 도움이되므로 전체 파일을 특정 시점에 올바르게 복사 할 수 있습니다.


1
여러 rsync가 실행될 가능성을 지적 해 주셔서 감사합니다. 대본이 잘 들립니다. 로드 밸런싱 된 사이트를 rsync와 동기화해야하는 문제점을 이해하려고했지만이를 완화하는 것으로 보입니다. 멋진 보너스. 아직이 잘못된 접근이다 어쩌면 같은 느낌 ...하지만하자가 : 참조
루이 Waweru

@Louis 천만에요! 또한 즉각적인 파일 변경을 기반으로 폴더를 동기화 상태로 유지하려면 사용 / 적응을 살펴 보는 것이 좋습니다 lsyncd. "핫 폴더"를 사용하여 실제로 활동에주의를 기울이고 변경 사항이있을 때 해당 파일에 대해 작업 할 수 있습니다. 나는 rsync대답에 요약 된대로 많이 사용 하지만 lsyncd비 크론 / 더 즉각적인 행동 양식이 필요한 경우에 사용 합니다.
JakeGould

3

예-rsync가 파일을 쓰는 동시에 파일을 읽는 경우 파일이 손상되었을 수 있습니다.

이것을 시도 할 수 있습니다 : /unix//a/2558

lsof로 스크립트를 작성할 수도 있습니다.

lsof /path/to file

종료 코드 0은 파일이 사용 중임을 의미하고 종료 코드 1은 해당 파일에 대한 활동이 없음을 의미합니다.


rsync가 그냥 읽는 경우 파일이 손상되는 이유를 알 수 없습니다.
orestisf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.