rsync 는 remote synchronization의 약자로 samba 의 핵심 개발자인 Andrew Tridgell 이 만든 로컬과 리모트간에 데이타 동기화를 위한 유틸리티이다. 

전송시에 네트워크 대역폭을 최소화하는 델타 인코딩 알고리즘을 사용하여 변경이 일어난 부분만 전송하므로 빠르고 효율적으로 데이타를 동기화한다.

rsync는 패키지에 client와 server 프로그램이 모두 포함되어 있으며 별도의 server 데몬으로 구동시 TCP/UDP의 873 포트를 사용하지만 ssh 프로토콜을 기반으로 사용하면 기존 ssh 포트를 사용하여 별도의 방화벽 오픈등의 작업이 필요 없어지므로 이 방법으로 사용하는 것을 권장한다.


용법

 rsync 는 다음과 같이 rsync options source destination 형식으로 사용한다.



주요 옵션은 다음과 같다.

  • -v: verbose 자세한 정보 출력
  • -r : 재귀적으로 하위 디렉터리 까지 복사(단 전송시 타임스탬프나 파일 권한을 보존하지 않는다)
  • -a : 아카이브 모드(archive mode). 다음 옵션을 사용한 것과 동일하다. -a 옵션을 사용하면 편리하게 데이타를 복제할 수 있다.
    • -r : 재귀 복사
    • -t : 타입스탬프 보존
    • -l :  파일이나 디렉터리의 심볼릭 링크 보존
    • -p : 권한 보존
    • -g : 그룹 보존
    • -o : 소유자 보존 - root 만 가능하다.
    • -D : device 파일이나 special 파일 보존
  • -z : 데이타 압축
  • --exclude=PATTERN : PATTERN 에 제외할 파일이나 디렉터리의 유형을 써 주면 동기화하지 않는다. 비슷한 이름의 패턴이 있을 경우 * 을 사용하여 기술할 수 있다.
    예로 test1, test3, test-dir  을 제외할 경우 --exclude=test* 라고 적어주면 된다.
  • -h : 출력이 사람이 읽을 수 있는 형식으로 변환
  • --progress: 파일 전송 진행 내역을 보여준다.
  • --delete: 원본의 파일이나 디렉터리가 삭제되었을 경우 원격지의 파일이나 디렉터리도 삭제한다.
    실수로 원본 서버에서 데이타를 삭제했다면 원격지의 파일도 삭제되므로 rsync 로 데이타 백업시에는 사용하지 말기를 권한다.
    굳이 이 기능을 사용하려면 주기적으로 데이타의 스냅샷을 떠 놓는것이 좋다. 파일 시스템의 스냅샷을 만드는 것은 전문 백업 유틸리티의 도움을 받는게 좋으며 이 책의 범위를 넘어서니 관심있는 독자들은 찾아보기 바란다.

 source 는 복제할 원본의 경로이며 이는 로컬 파일이나 원격지 사이트가 될 수 있고 destination 도 마찬가지이다.

원격지일 경우 lesstif@example.com:/var/log 형식으로 사용하며 사용자id 는 lesstif 로 하여 example.com 서버의 /var/log 에 연결하겠다는 의미이다.


rsync를 활용하여 원격지에 데이타 복제를 할 경우 가장 적합한 옵션은 -avzh 이다. 이제 rsync 의 활용 예제를 살펴 보자.


Local 에서 두 개의 디렉터리 복제

Local 서버의 두 개의 디렉터리를 서로 복제할 수 있다. 서버에 물리적인 디스크가 여러 개 있을 경우 중요한 데이타는 이 기능을 이용하여 다른 디스크로 복제할 수 있다. 다음은 /var/log/ 폴더를 /root/log 폴더로 복제하는 예제이다.

$ rsync -avzh /var/log/ /root/log


로컬 데이타를 원격지에 복제

Local 의 /root/data 디렉터리를 example.com 의 /home/lesstif/backup 에 복제하는 예제이다. 데이타 서버에서 rsync 를 이용하여 원격지 백업 서버로 데이타를 복제할 경우 사용한다. 사용시 호스트 명(backup.example.com) 뒤에 : 가 빠지면 제대로 동작 안 하니 주의해야 한다.


$ rsync -avzh /home/lesstif/data/ lesstif@backup.example.com:/home/lesstif/data/


원격지 데이타를 로컬에 복제

원격지 서버인 example.com 의 /home/lesstif/data 디렉터리를 로컬 서버의 /home/lesstif/backup/  에 복제하는 예제이다.원격지의 데이타를 로컬 서버에 백업할 경우에 사용한다. 마찬가지로 호스트명 뒤에 : 이 빠지지 않도록 주의한다.

$ rsync -avzh lesstif@backup.example.com:/home/lesstif/data /home/lesstif/data/

암호 입력없이 원격지에 연결

보통 rsync 는 별도의 포트를 띄우지 않고 ssh 프로토콜 기반으로 많이 사용한다. ssh 는 여러 가지 인증 방식이 있지만 가장 많이 사용하는 방식은 암호와 공개키이다.

이럴 경우 rsync 로 원격지에 연결시 매 번 암호를 넣어야 한다. 직접 실행할때는 암호를 입력해도 상관없지만 백업한 데이타를 원격지 서버에 동기화를 하거나 등의 자동화해야 하는 업무의 경우 암호를 입력해야 한다는 문제가 된다. 

이런 문제는 공개키(public key)개인키(private key) 쌍을 생성하고 이를 원격지 ssh 서버에 등록하면 암호를 입력하지 않고 원격지에 연결 가능하므로 rsync 작업을 자동화할 수 있다.

  1. RSA 알고리즘으로 키 쌍을 생성한다. 생성된 키 쌍은 $HOME/.ssh 폴더 밑에 개인키(id_rsa), 공개키(id_rsa.pub) 이름으로 생성된다.

    $ ssh-keygen -t rsa -C lesstif@example.com


    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/lesstif/.ssh/id_rsa):

    Enter passphrase (empty for no passphrase): 

    Enter same passphrase again:

    1. Enter file in which to save the key (/home/lesstif/.ssh/id_rsa): 개인키를 저장할 경로와 파일명이다. 개인키는 .ssh/id_rsa, 공개키는 .ssh/id_rsa.pub 로 저장된다. ssh 를 사용하는 프로그램들도 이 경로에서 키를 찾으므로 특별한 이유가 없다면 기본 값으로 설정하자. 엔터를 치면 기본 값으로 설정된다.
    2. Enter passphrase (empty for no passphrase): 개인키를 보호하기 위해 암호를 설정하지만  사용할 때 마다 암호를 입력해야 한다. 자동화할 작업에 사용할 개인키라면 암호를 설정하지 말자. 엔터를 치면 설정하지 않고 넘어간다. 
    3. Enter same passphrase again: 비밀 번호 재확인 창이다. 다시 한 번 엔터를 치면 키 쌍이 생성되고 저장된다.
  2. 기존에 사용하던 ssh 키가 있다면 그대로 사용하면 된다. 기존 개인키에 암호가 걸려 있다면 openssl 명령어를 사용하여 암호를 제거할 수 있다.

    $ cp ~/.ssh/id_rsa ~/.ssh/id_rsa.enc
    $ openssl rsa -in ~/.ssh/id_rsa.enc -out ~/.ssh/id_rsa

  3. 이제 개인키는 내가 갖고 있고 공개키는 원격지에 복사해야 한다. ssh-copy-id 명령어를 사용하면 원격지에 내 공개키를 복사할 수 있다. 명령어 실행시 원격지 서버에도 동일한 id 가 존재해야 한다.

    $ ssh-copy-id -i ~/.ssh/id_rsa.pub  backup.example.com

  4. 설정이 끝났다. 정상적으로 동작하는지 확인하려면  ssh 명령어로 원격지에 로그인을 시도해서 암호를 묻지 않고 바로 로그인 되는지 확인한다.

    $ ssh backup.example.com

활용

rsync 는 쓰기가 간편하고 속도가 빠른 동기화 유틸리티로 두 서버간에 파일을 전송하는 rcpscp를 대치할 수 있으며 데이타 백업(data backup), 원격 사이트 미러링(Remote Site mirroring) 등의 용도로도 활용할 수 있다.

프로젝트 수행시 사용하는 DBMS 서버, 이슈 관리 서버, 버전 관리 서버, 저장소 관리자등의 데이타는 매우 중요하므로 가능하면 자주 백업해 주어야 한다.

rsync 사용법을 익히고 cron 과 조합하면 백업 작업을 자동화하여 혹시 모를 서버 고장이나 장애, 데이타의 손실에 대응할 수 있다.


Ref