2010년 1월 25일 월요일

RSYNC를 이용하여 REMOTE SERVER FS 동기화 하기

간단한 서버 FS동기화 이제는 rsync로 해결하자

일반적으로 웹서비스를 시작하는 회사에서 사용자가 늘어감에 따라서 웹서버의 증설을 하는 경우 시스템 관리자가 첫번째로 맞닥뜨리는 문제중에 하나가, 각각의 웹서버에 있는 정보의 동기화이다. 웹서버가 한대일경우는 이러한 문제로 고민할 필요가 없겠지만, 트래픽증가로 웹서버를 증설했을경우 각각의 웹서버로 매일 업데이트되는 정보를 일일이 올려준다면 정말 귀찮은 작업이 아니다.

NT를 접해보신 분들이라면 미러링(mirroring)에 대해서 알고 있을 거다. 이는 로컬에서는 특정하드디스크나 파티션의 정보를 다른 하드디스크나 파티션으로 동일하게 복제해주는 기능이다. 미러링의 개념은 NT에만 국한된것은 아니다. NT에서 자체제공하는 옵션으로 미러링을 제공하듯이 리눅스에서도 rsync나 기타 다른 프로그램으로 미러링을 지원한다. 물론 rsync는 로컬에서 로컬로는 미러링을 할수없지만, 로컬과 원격지의 미러링을 지원한다. 보통 anonymous ftp서버나 웹서버의 미러링에 많이 쓰인다.

1. rsync 설치
rsync는 웬만한 리눅스 배포판에는 기본으로 설치가 되어져 나온다. 혹시나 설치가 안되었다면

# yum install rsync

를 이용하여 설치하기 바란다. 소스 컴파일 방식으로의 설치는 번거로우므로 일단 패스하겠다.

2. rsync와 ssh를 이용한 FS 동기화
보통 rsync로 파일 전송 시 여러가지 프로토콜을 골라 사용 할 수가 있다. 일반 적으로 rsh나 ssh를 많이 사용하는데, 이것을 사용하기를 원하지 않는 다면 873 포트를 이용할 수 도 있다. 허나 일반적으로 ssh는 쉘접속용으로 많이 사용하고 어느 서버에나 기본으로 다 깔려있으므로 이번 예제에서는 rsync + ssh 이러한 조합으로 시나리오를 적어볼가 한다.

ssh를 이용하면 한가지 걸리는 문제가 있는데 그것이 바로 "인증"이다. rsync를 주기적으로 실행 시키기 위하여서는 원격 서버의 일반유저나 슈퍼유저로 로그인하여 파일을 읽어야 하는 과정이 필요한데, 이때 ssh 원격 로그인시 비번을 요구하는 프롬프트가 자꾸 뜨면 cron으로 처리하기가 힘들어 질 것이다. 그렇다면 비밀번호로 인증을 안하면 어떤 방식으로 인증을 할 것인가? 예전 ssh BFA에서 이미 언급 했었는데, rsa 인증방식으로 사용하면 이런 문제를 깔끔히 해결 할 수 있겠다. 관련글은 아래 링크에 가서 참고하기 바란다.


실제 동기화 작업을 진행하기 이전에 해당 명령어를 좀 더 잘 이해하도록 하기 위하여 몇몇 변수들에 대한 선언을 하겠다. 가령 192.168.1.15가 목적 원격 서버이고 /var/www/htdocs 이 동기화를 할 폴더라고 가정한다면 아래 형식 대로 명령어를 쓰면 되겠다.

# rsync -avzP -e 'ssh -p 2020' user@192.168.1.15:/var/www/htdocs /var/www/

각 옵션들에 대하여 설명을 하자면

-a archive mode (심볼릭 링크, 속성, 퍼미션, 소유권 등을 보존한 상태)
-v verbose (싱크 내용을 보다 자세히 보여줌)
-z compress (동기화 할 때 전송 할 파일들을 압축하여 전송)
-e 어떤 프로토콜을 이용하여 파일 전송을 할지를 결정한다. ssh나 rsh사용시 조합하여 지정한다.
-e속의 -p ssh나 rsh포트가 바뀌었을 때 별도 조합하여 사용함

3. cron을 이용하여 특정 시간에 자동으로 실행 시키기
FS동기화는 백업과 마찬가지로 주기적으로 실행시켜야 한다. 일정 주기로 처리하는 배치 프로세스의 경우 시스템 crontab에 등록 하여 자동화 시킬 수 있다. 시스템의 최적화의 기법은 일정 시간 단위로 최대한의 성능을 발휘하도록 도와주는 것이다. 즉, 주기적으로 운영 중에 만들어진 필요하지 않는 임시 파일을 정리하거나, 운영체제 운영에 필요한 데이터를 갱신하는 등의 작업을 통해 리눅스가 최적의 상태를 유지할 수 있게 할 수 있다.

작업 설정 파일을 crontab 파일이라고 부르며, 이 파일의 위치는 OS별로 차이가 있다.
리눅스는 /var/spool/cron/ID, 솔라리스는 /var/spool/corn/crontabs/ID에 위치한다.
그럼 이 파일을 직접 수정해야 하는가? 그렇지 않다. crontab 명령을 통해 설정과 조회를 한다.
crontab 설정 파일을 새롭게 편집하고자 한다면 -e 옵션을 주고, 수정하기 전에 현재 등록된 내용을 보고자 한다면 -l 옵션을 사용하며, 등록된 내용을 삭제하려면 -d 옵션을 사용한다.

crontab 각 필드의 의미는 다음과 같다.
----------    ----------  ---------------------------------------------------
   필  드             의  미           범  위
----------    ----------  ---------------------------------------------------
첫 번째                    분               0-59
두 번째                    시               0-23
세 번째                    일               0-31
네 번째                    월               1-12
다섯 번째              요일             0-7 (0 또는 7=일요일, 1=월, 2=화, ...)
여섯 번째           명령어             실행할 명령을 한줄로 쓴다.
----------    ----------  ---------------------------------------------------

위 작업을 가령 5분에 한번씩 실행시키려면 어떻게 해야 할가?

0,5,10,15,20,25,30,35,40,45,50,55 * * * * rsync -avzP -e 'ssh -p 2020' user@192.168.1.15:/var/www/htdocs /var/www/ > /dev/null 2>&1

제일 마지막 부분 > /dev/null 2>&1은 cron작업 중 발생하는 표준출력, 표준 에러는 모두 무시하겠다는 것을 의미한다. 저 부분을 추가하지 않으면 root계정에 메일이 무한정 쌓이는 사태가 발생할 수 있다. >_<

마지막으로 cron이 정확히 작동하고 있는지 보려면 root계정으로 로그인 한 상태에서

# cat /var/log/cron

을 해보면 알수 있다.

댓글 없음:

댓글 쓰기