Active/Standby 데이터베이스가 서로 다른 IDC에 설치되어있는 경우를 생각해보자. 데이터를 동기화하기 위해 크론 같은 스케줄러를 통해 IDC 간에 로그파일을 주기적으로 옮기는 작업을 실행할 것이다.
이때 트래픽에 대한 관리가 제대로 되지 않는다면 과도한 네트워크 트래픽이 발생하여 관리 비용이 증가하고 서비스 안정성이 떨어질 수 있다. 이러한 문제를 방지하기 위해서는 우선 전송시 대역폭을 제한하고 로그파일을 전송하는 스크립트가 여러 번 동작하지 않도록 방지할 필요가 있다.
rsync
rsync 커맨드는 백업시 아주 유용하게 사용되는 커맨드이다.
delta-transfer 알고리즘을 통해 원본경로와 대상경로의 변경사항만을 전송하기 때문에 데이터 전송량을 줄이고 더 빠른 전송이 가능하다.
이어받기 기능이 있기 때문에 대용량 파일 전송 중 연결이 끊기더라도 이미 전송된 부분을 넘어가고 다시 이어받을 수 있다.
rsync -avP /source/directory /destination/directory
전송시 주로 -a 옵션을 사용하게 되는데 아카이브에 주로 사용하는 옵션(하위 디렉토리 복사, 심볼릭 링크/퍼미션/그룹/오너/타임스탬프 보존)들을 한번에 활성화한다.
-P 옵션의 경우 --progress 옵션과 --partial 옵션을 활성화한다.
각각 전송 진행상황 확인 옵션과 부분전송 옵션이다.
--partial 옵션 사용시 전송 도중 인터럽트되더라도 전송되던 파일을 삭제하지 않는다.
사용 방식에 따라 찌거기 파일을 만들 수 있으니 대상경로 디렉토리를 정리하도록 크론을 등록해야할 수도 있다.r
rsync는 디렉토리 전송시 원본경로의 Tail Slash 여부에 따라 복사되는 위치가 달라진다.
원본경로에 Tail Slash가 없으면 디렉토리를 복사하고 Tail Slash가 있으면 디렉토리의 내용물을 전송한다.
mkdir -p /source/path/dir1
mkdir -p /source/path/dir1
touch /source/path/file1
touch /source/path/file2
rsync -avP /source/path /destination/path1
rsync -avP /source/path/ /destination/path2
> destination
> ├── path1
> │ └── path
> │ ├── dir1
> │ ├── dir2
> │ ├── file1
> │ └── file2
> └── path2
> ├── dir1
> ├── dir2
> ├── file1
> └── file2
--bwlimit 옵션을 퉁해 전송 대역폭을 통제할 수 있다.
별도로 단위를 적지 않으면 KiB 단위로 전송된다.
단위는 K(또는 KiB)와 같이 적용할 수 있다.
관리의 편의성을 위해 단위를 적어주는 것이 좋다.
rsync -avP --bwlimit 1280MiB /source/directory /destination/directory
디바이스간 전송의 경우 경로에 호스트네임을 적어서 처리할 수 있다.
rsync -avP --bwlimit 1280MiB /source/directory 10.0.0.2:/destination/directory
위와 같이 단일 콜론을 구분기호로 사용하면 리모트 쉘로 전송하게 되며 이중 콜론을 구분기호로 사용하면 TCP(주로 873 포트 사용)를 통해 rsync 데몬에 직접 연결하게 된다.
rsync 데몬을 통해 전송할 경우 rsync 설정파일(/etc/rsync.conf)에 대상경로에 대한 설정을 추가해야한다.
rsync 데몬을 통해 전송할 경우 별도로 ssh 키를 등록하거나 패스워드를 입력할 필요 없이 허용 호스트 목록과 전송 권한 등을 설정하여 전송할 수 있기 때문에 가능하면 rsync 데몬을 통해 전송하는 것을 추천한다. ssh 키를 등록할 경우 권한 관리가 어려워질 수 있다.
flock
rsync를 크론에 등록할 경우 중복 실행 문제가 발생할 수 있다.
첫번째 작업을 실행하였으나 다음 실행주기 전에 작업이 끝나지 않는다면 다시 한 번 커맨드가 실행되고 결국 중복으로 rsync가 실행되면서 과도한 트래픽이 발생한다.
또한 동일한 작업이 아니더라도 여러 개의 전송 작업이 존재할 경우 해당 작업들이 동시에 작업을 진행하며 트래픽을 유발하거나 또는 삭제 정책과 맞물려 손상된 파일을 전송하는 문제가 발생할 수도 있다.
모든 작업을 하나의 스크립트로 묶어서 실행하거나 스크립트 내에서 PID 파일 등을 통해 작업을 관리할 수도 있으나 최신 리눅스 배포판들이 기본적으로 제공하는 flock 커맨드를 사용하면 쉽게 작업 실행 주기를 관리할 수 있다.
flock -xn /var/run/database_data_transfer.lock -c /usr/local/bin/sync_database.sh
한번에 여러 작업이 동시에 실행되지 않게 막기 위해서는 -x 옵션을 사용한다.
-x 옵션은 독점적인 락을 생성하며 이후 같은 락 파일을 참조하는 작업이 실행될 경우 첫번째 작업이 종료되어 락이 해제된 뒤 실행되도록 지연시킨다.
만약 이후 실행되는 작업들을 대기시키지 않고 바로 종료시키기 위해서는 -n 옵션을 사용한다.
기타
발생 가능한 문제는 언젠가는 어떻게든 발생하기 마련이며 이를 위해 백업을 운용하게 된다. 그러나 백업이 있다고 절대로 안심해서는 안된다. 백업 자체가 발생 가능한 문제를 유발하는 경우도 있는데다가 백업에 문제가 발생한 경우도 있기 때문이다.
계획적이지 않게 설정한 백업 정책은 과도한 트래픽을 유발하고 디스크 사용량을 좀먹는다. 또한 정작 필요한 순간에 백업이 정상적으로 동작하지 않을 수도 있다.
이러한 문제를 막기 위해서 사전에 발생할 수 있는 문제를 면밀히 조사하여 방지하고 서버의 디스크 사용량, 스위치나 게이트웨이의 네트워크 사용량을 항상 모니터링하는 것이 중요하다.
주기적으로 백업이 필요한 순간에 제 역할을 수행할 수 있는지 확인하는 것 또한 백업 정책 설정에서 중요한 부분이다.
