저장소 백업
저장소를 구축하고 프로젝트 소스가 커밋되기 시작했다면 저장소 백업을 수행해야 한다. 소스는 프로젝트의 가장 중요한 산출물이므로 저장소의 백업은 이중 삼중으로 수행하여 만약에 발생할 지 모를 위험에 대비해야 한다.
백업 파일은 저장소가 있는 서버외에 별도의 서버에 분리하여 저장을 해야 하며 이 요구사항에 맞게 백업 정책을 수립하고 적절한 툴을 선정해야 한다.
Acronis 사의 TrueImage 같은 전문 백업 솔루션이 없더라도 직접 svn 저장소를 백업할 수 있는 방법은 여러가지 가 있으며 기본적인 svn 내장 명령어를 통해 백업할 수 있는 여러가지 방법을 살펴보자.
svnadmin dump
저장소를 통째로 덤프하는 관리자용 유틸리티이다. 기본적으로 표준 출력으로 덤프되지만 파이프를 이용하여 저장할 파일을 지정할 수 있다. 복구는 svnadmin load 명령어로 저장소를 복구할 수 있다.
사용법: svnadmin dump REPOS_PATH
옵션으로는 -r LOGWER[:UPPER] 형식으로 dump 할 revision 의 구간을 지정할 수 있다.
revision을 나눠서 덤프할 경우 해당 revision 내에서 svn copy나 mv 를 수행했는데 참고하는 revision이 구간내에 없으면 load 시에 문제가 발생할 수 있다.
svnadmin dump -r 1000:2000 /svnroot > myrepos-1000,2000.dmp
단점은 local 저장소만 덤프가 가능하므로 덤프된 파일을 스크립트등을 통해 FTP/SFTP/HTTP 등을 이용하여 별도의 백업 서버로 옮기거나 NFS 로 마운트한 디렉터리에 백업을 작성해야 한다.
덤프한 백업 파일 복구는 svnadmin load REPOS_PATH 로 수행할 수 있다.
# 복구할 저장소 생성
svnadmin create /var/svn/restore-repos
# 파일로부터 저장소 복구
svnadmin load /var/svn/restore-repos < ~/repos-back.dmp
svnadmin hotcopy
저장소의 모든 이력과 hook 스크립트, 설정 파일을 모두 복제하는 명령어이다.
사용법: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
단점으로는 점진적인 백업 기능이 없으므로 모든 리비전을 다 복제해야 하므로 리비전이 많은 저장소의 경우 백업 및 복구 시간이 오래 걸릴수 있다. 저장소가 있는 서버에서 수행해야 하며 dump 와 달리 저장소의 구조를 복제하므로 원격지에 백업할 경우 dump하여 단일 파일로 만들거나 NFS 로 마운트된 디스크에 hot copy 를 수행해야 한다.
svnsync
원격지에 있는 저장소를 지원하며 점진적인 백업을 지원하므로 리모트에 있는 저장소를 백업하기에 가장 적당한 방법이다.
백업 설정
환경
svn 사용 환경은 다음과 같다. 192.168.0.10 이 svn 서버이고 20번에서 svnsync 로 백업을 수행할 예정이다.
Svn Server(svn.example.com) | 192.168.0.2 |
---|---|
Backup Server(backup.example.com) | 192.168.0.3 |
복제 저장소에서 커밋이나 기타 리비전이 변경되는 작업을 수행하면 이후 복제 작업이 실패할 수 있으므로 복제 저장소에서 커밋등의 작업을 수행하지 않도록 주의해야한다.
설정
https://svn.example.com/svn 저장소를 Backup Server(192.168.0.3)의 /var/backup/svnbackup/repos 에 백업하기로 하였다. 먼저 백업서버에 백업을 수행할 계정(backup)으로 로그인한후에 다음 명령어를 수행한다.
복제할 저장소를 생성한다.
svnadmin create /var/backup/svnbackup/repos
리비전 정보가 추가/수정/변경때 호출되는 hook 스크립트를 생성해야 한다. 에디터로 /var/backup/svnbackup/repos/hooks/pre-revprop-change 을 열어서 다음 내용을 추가하고 저장한다.
#!/bin/sh exit 0;
CODEhook 스크립트에 실행 속성을 부여한다.
chmod +x /var/backup/svnbackup/repos/hooks/pre-revprop-change
저장소 복제를 하기 위해 svnsync init 명령을 한 번 수행해야 한다. 옵션으로 복제할 저장소의 URL과 원저장소의 URL 을 입력한다.
svnsync init file:///var/backup/svnbackup/repos https://svn.example.com/repos
svnsync 복제를 시작한다.
svnsync sync file:///var/backup/svnbackup/repos
Committed revision 0.
Copied properties for revision 0.
cron 에 등록
svnsync 가 정상적으로 동작하는걸 확인했다면 리눅스용 작업 스케줄러인 cron 에 등록하여 자동으로 저장소 복제를 수행하면 된다. cron 은 실행시 환경 변수를 가져오지 않으므로 수행할 명령어를 직접 cron 의 실행 부분에 넣는 것 보다는 실행 스크립트를 따로 만들고 이 스크립트를 크론에 등록하여 동작시키는게 더 안전하다.
svnsync 스크립트 작성을 위해 에디터로 /usr/local/sbin/svnbackup.sh 파일을 연다.
다음 내용을 추가하고 저장한다.
#!/bin/sh svnsync sync file:///var/backup/svnbackup/repos
CODE크론에서 실행할수 있게 실행 속성을 부여한다.
chmod +x /usr/local/sbin/svnbackup.sh
쉘상에서 작성한 스크립트를 수행하여 정상 동작 여부를 확인한다.
/usr/local/sbin/svnbackup.sh
Committed revision 3.
Copied properties for revision 3.정상 동작이 확인되었으니 스크립트를 cron 에 등록하여 정해진 시간마다 저장소를 백업하자. crontab -e 명령어로 크론의 스케줄 편집기를 구동한다. 다음은 매일 오전 8시부터 오후 23시까지 한 시간마다 백업을 수행하는 설정이다.
0 8-23 * * * /usr/local/sbin/svnbackup.sh
에디터에서 내용을 저장하고 나오면 크론의 스케줄에 반영된다. crontab -l 명령어로 현재 등록된 스케줄링 작업을 확인할 수 있다.
백업 여부 확인
svn log 명령어로 저장소의 로그 내역을 조회하여 최근 커밋 내역이 저장소로 복제되고 있는지 확인할 수 있다. -l(limit) 옵션은 최근 로그중에 지정한 갯수만큼 로그를 출력한다.
svn log file:///var/backup/svnbackup/repos -l 5