Overview
Linux Hot Copy(HCP) 유틸리티가 무료로 풀리면서, 고가의 스냅샷 유틸리티를 구입 없이도 얼마든지 사용할 수 있게 되었습니다. 스냅샷을 멋지게 활용할 수 있다면, 단순히 데이터 백업 뿐만 아니라 DB 시스템과 같은 매번 디스크에 데이터 변화가 많은 시스템에서도 특정 시점의 스냅샷 데이터를 추출할 수 있습니다.
Feature
HCP는 다음과 같은 특성을 가집니다.
- Point-in-Time 디스크 볼륨 스냅샷
- Copy on Write 방식의 Snapshot
- 서비스 영향없이 스냅샷을 생성
"Copy on Write"을 통한 스냅샷과 다른 방식의 차이를 비교해보도록 하겠습니다.
<Snapshot 비교>
- Copy-on-WriteWrite 시 원본 데이터 Block을 Snapshot 스토리지로 복제하는 방식으로 Snapshot 데이터 Read 시 변경되지 않은 데이터는 원본 블록에서,변경된 데이터는 Snapshot 블록에서 처리데이터 변경 분만 저장하므로 공간을 효율적으로 활용하나 블록 변경 시 원본 데이터와 스냅샷 데이터 양쪽 모두에서 Write이 발생
- Redirect-on-WriteCopy-on-Write와 유사하나, 원본 볼륨에 대한 Write을 별도의 공간에 저장하는 방식으로 Copy-on Write(원본 Read, 원본 Write, 스냅샷 Write)에 비해 Write이 1회만 발생하나, 스냅샷 해제 시 변경된 블록들을 원본 데이터 블록으로 Merge시켜야함
- Split mirror원본 볼륨과 동일한 사이즈의 별도 복제 볼륨 생성하는 방식으로 데이터를 Full Copy하므로 즉시 생성이 어렵고 용량 또한 많이 필요
Installation
설치 버전을 다운로드 하기 위해서는 하단 페이지에서 등록해야하는데, 등록하게 되면 설치 바이너리를 다운로드 받을 수 있는 별도의 링크를 메일로 보내줍니다. 무료로 배포가 되었을 뿐 오픈 소스가 아닌지라, 설치하기 위한 절차가 까다롭습니다.
http://www.idera.com/productssolutions/freetools/sblinuxhotcopy
설치 파일을 받고 압축을 풀면 아래와 같이 OS 별로 설치 바이너리가 있습니다.
$ unzip Idera-hotcopy.zip
$ cd Idera-hotcopy
$ ls
Idera-hotcopy.zip Installing+Hot+Copy.html idera-hotcopy-5.2.2.i386.rpm idera-hotcopy-5.2.2.x86_64.rpm idera-hotcopy-amd64-5.2.2.deb idera-hotcopy-i386-5.2.2.deb idera-hotcopy-i386-5.2.2.tar.gz idera-hotcopy-x86_64-5.2.2.tar.gz
서버에 사용하고자 하는 설치 바이너리를 설치 한 후 리눅스 커널에 맞는 모듈을 업그레이드해야 합니다. hcp-setup 명령어로 쉽게 가능하며, 업그레이드 시 https접근(443포트)이 필요합니다.
$ rpm -i idera-hotcopy-5.2.2.x86_64.rpm
$ hcp-setup --get-module
Usage
사용법은 다음과 같이 “hcp –help” 명령어를 통해 확인해볼 수 있습니다.
$ hcp --help
Usage: hcp -h | -m <MOUNT POINT> <DEVICE> | -l | -r <DEVICE>
Options:
-h, --help Show this help message.
-l, --list List active Hot Copy sessions.
-r, --remove Remove Hot Copy session.
-m, --mount-point Specify mount point.
-o, --read-only Mount hcp fs read only.
-c, --changed-blocks Specify changed blocks storage device.
-q, --quota Sets quota for changed blocks storage.
-s, --show-hcp-device Show the Hot Copy device path for a given
device.
-v, --version Show the Hot Copy driver version.
Examples:
Start session:
hcp /dev/sdb1
hcp -m /mnt/tmp /dev/sdb1
Remove session:
hcp /dev/hcp1
List sessions:
hcp -l
변경된 블록들이 저장한 디바이스가 별도로 존재한다면 -c 옵션으로 스토리지를 분리할 수 있습니다. 그렇지 않으면, 스냅샷을 생성한 디스크에 기본적으로 변경 블록이 기록됩니다.
Example
1) 스냅샷 생성 – 변경 블록이 저장될 스토리지(/dev/sdb1)
$ hcp -c /dev/sdb1 /dev/sdc1
Idera Hot Copy 5.2.2 build 19218 (http://www.r1soft.com)
Documentation http://wiki.r1soft.com
Forums http://forum.r1soft.com
Thank you for using Hot Copy!
Idera makes the only Continuous Data Protection software for Linux.
Starting Hot Copy: /dev/sdc1.
Changed blocks stored: /backup/.r1soft_hcp_sdc1
Snapshot completed: 0.000 seconds
File system frozen: 0.019 seconds
Hot Copy created: Tue Jul 18:31:02 KST 2013
Creating hotcopy snaphost device: /dev/hcp1, Please wait...
Hot Copy created at: /dev/hcp1
making new path: /var/idera_hotcopy/sdc1_hcp1
Mounting /dev/hcp1 read-write
Hot Copy mounted at: /var/idera_hotcopy/sdc1_hcp1
2) 스냅샷 현황
$ hcp -l
Idera Hot Copy 5.2.2 build 19218 (http://www.r1soft.com)
Documentation http://wiki.r1soft.com
Forums http://forum.r1soft.com
Thank you for using Hot Copy!
Idera makes the only Continuous Data Protection software for Linux.
****** hcp1 ******
Real Device: /dev/sdc1
Virtual Device: /dev/hcp1
Changed Blocks Stored: /backup/.r1soft_hcp_sdc1.cow_hcp1
Mounted: /var/idera_hotcopy/sdc1_hcp1
Time Created: Tue Jul 18:31:02 KST 2013
Changed Blocks: 0.25 MiB (262144 bytes)
백업 및 복구 방안
InnoDB 백업 시에는 Xtrabackup을 사용하면 시점 백업이 가능하나, 문제는 InnoDB가 아니거나, 스토리지 엔진이 섞여 있는 경우(예를들면 Mroonga, MyISAM, TokuDB) 특정 시점의 백업을 만들어 내기 난해합니다. 이 경우 HCP를 통해 백업을 활용한다면 간단하게 해결할 수 있습니다.
위와 같이, Global Read Lock을 걸고 스냅샷을 걸고 바로 Global Read Lock을 해제하면, 그 시점의 테이블 데이터에 대한 스냅샷 데이터를 추출할 수 있습니다. 물론 스냅샷을 거는 순간 바이너리 로그 포지션을 기록해놔야 하겠지요.
간단하게 Perl로 예제를 적어보겠습니다.
먼저 백업할 DB 커넥션을 맺고 Global Read Lock을 획득합니다.
$dbh = DBI->connect('DBI:mysql:mysql;host=127.0.0.1', 'root', 'pass')
or die $DBI::errstr;
# Flush and Lock tables
$dbh->do("flush tables with read lock");
이 순간부터는 더 이상 데이터 변경은 없습니다. 즉, 이 상태에서 바이너리 포지션을 기록하면, 그 이후부터의 변경 사항은 바이너리 로그를 활용하여 복구할 수 있습니다.
$sth = $dbh->prepare("show master status");
$sth->execute();
$sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
while ( @row = $sth->fetchrow_array ) {
$status_info .= "[MASTER STATUS]\n";
$status_info .= @row{file}."\t".@row{position}."\n";
}
백업은 슬레이브에서 하는 경우가 대부분이므로, 슬레이브 상태를 필히 기록해야겠죠.
$sth = $dbh->prepare("show slave status");
$sth->execute();
$sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
while ( @row = $sth->fetchrow_array ) {
$status_info .= "[SLAVE STATUS]\n";
$status_info .= "CHANGE MASTER TO MASTER_HOST='@row{master_host}', MASTER_LOG_FILE='@row{relay_master_log_file}', MASTER_LOG_POS=@row{exec_master_log_pos};\n";
}
아직 로그로 Flush되지 않은 Commit된 트랜잭션을 유실하지 않기 위해 1초 대기합니다. InnoDB를 예를 들자면, innodb_flush_log_at_trx_commit이 0으로 설정된 경우를 들 수 있겠네요.
sleep(1);
이제 스냅샷을 만들고, 앞서 획득했던 Global Read Lock을 해제합니다. 여기서 명시적으로 마운트 포인트를 지정한 이유는 추후 hcp 언마운트를 위해서입니다.
# create snapshot
system "hcp -m /var/hcp/snapshot1 /dev/sdc1;
system "hcp -m /var/hcp/snapshot2 /dev/sdc1;system "hcp -m /var/hcp/snapshot1 /dev/sdc1;
# unlock tables and disconnect
$dbh->do("unlock tables");
$dbh->disconnect();
이제, 원하는 데이터를 다른 스토리지로 옮기면 됩니다. 로컬 디스크라면 cp로, 원격으로 옮긴다면 scp 또는 rsync를 생각해볼 수 있겠네요.
cp -R /var/hcp/snapshot1/mysql-data /backup/20140122/
백업이 모두 마무리되었다면, 이제 스냅샷을 해제합니다.
system "hcp -r /var/hcp/snapshot1";
system "hcp -r /var/hcp/snapshot2";
만약 /var/hcp 밑에 마운트된 스냅샷을 한번에 지운다면, 아래로 한방에 처리해도 됩니다.
system "df | grep '/var/hcp/' | awk '{print \$1}' | xargs -i hcp -r {}";
간단하지만, HCP를 활용하여 백업할 수 있는 방안에 대해 설명하였습니다. ^^
Conclusion
Linux Hot Copy(hcp)는 설치 및 사용이 편리할 뿐만 아니라 무료로 사용할 수 있기에, 조금만 활용하면 멋진 백업 솔루션도 만들어낼 수 있습니다. 물론, 디스크에 두번 적는 추가 I/O가 발생하나, 스냅샷으로 백업을 할 수밖에 없는 스토리지 엔진 경우 매우 유용합니다.
댓글 없음:
댓글 쓰기