백업 서버에 LVM 스냅 샷 동기화


22

여러 Linux 서버에서 실행되는 여러 Xen 가상 머신이 있습니다. 이 VM은 디스크 이미지를 / dev / xenVG / SERVER001OS 등을 따라 장치 이름과 함께 Linux LVM 볼륨에 저장합니다. 디스크 이미지를 정기적으로 백업하고 싶습니다. 필요한 경우 VM을 복원 할 수 있습니다 (LVM 장치는 각각 두 물리적 시스템간에 DRBD로 이미 미러링되어 있으며 여기에 추가 편집증이 있습니다).

어떻게하면 되나요? 당연히 첫 번째 단계는 LVM 장치를 스냅 샷하는 것이지만 가장 효율적인 방법으로 데이터를 백업 서버로 전송하는 방법은 무엇입니까? 나는 단순히 전체 장치를 다음 줄에 따라 복사 할 수 있습니다.

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

...하지만 많은 대역폭이 필요합니다. 원격 서버간에 전체 디스크 블록의 내용을 동기화하기위한 rsync와 유사한 도구가 있습니까? 다음과 같은 것 :

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

rsync의 매뉴얼 페이지를 올바르게 이해하면 위의 명령이 실제로 작동하지 않지만 (목표는 무엇입니까?)하지만 내가 목표로하는 것을 보여줍니다. --devices rsync 옵션은 해당 장치의 내용이 아닌 장치 자체를 복사하는 것입니다. 디스크 공간이 없기 때문에 원격 서버와 동기화하기 전에 VM 이미지의 로컬 복사본을 만드는 것은 옵션이 아닙니다.

원격 서버의 블록 장치와 백업 파일을 동기화 할 수있는 편리한 유틸리티가 있습니까? 필요한 경우 하나 쓸 수 있지만 기존 솔루션이 더 좋습니다. 나를 위해 이것을 수행하는 rsync 옵션을 놓쳤습니까?

답변:



16

RSync에는 '쓰기 장치'및 '복사 장치'패치가 있지만 작은 이미지 (1-2GB)에서만 잘 작동합니다. RSync는 더 큰 이미지에서 일치하는 블록을 찾기 위해 오랜 시간을 소비하며 40GB 이상의 장치 / 파일은 거의 쓸모가 없습니다.

다음을 사용하여 1MB의 체크섬 비교를 수행 한 다음 일치하지 않는 내용을 간단히 복사합니다. 이를 사용하여 미국의 가상 호스트에있는 서버를 공용 인터넷을 통해 영국의 백업 시스템에 백업합니다. CPU 활동 및 스냅 샷 성능 적중은 거의 시간이 지나지 않습니다.

스냅 샷 생성 :

lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1

export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='root@backup.company.co.za';

초기 시딩 :

dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"

증분 야간 백업 (변경된 블록 만 전송) :

ssh -i /root/.ssh/rsync_rsa $remote "
  perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
  lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
  perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
    seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"

스냅 샷 제거 :

lvremove -f company-exchange-snap1

나는 처음에는 무서웠지만 시도해 보았고 실제로 작동합니다.
Martin

@ sysadmin1138 read ARGV,$buf,1024대신에 왜 read STDIN,$buf,1024? ( stackoverflow.com/q/22693823/2987828 에 답변하려고 하는데 여기 ARGV를 이해하지 못합니다). 나는 매일 stackoverflow.com/q/22693823/2987828 질문에 변형을 사용 하고 잘 작동합니다.
user2987828

1
perlmonks.org/bare/?node_id=492858 을 참조하십시오 . 파일 이름이 인수로 제공되지 않는 한 ARGV와 STDIN은 유사합니다.
user2987828

9

LVM 스냅 샷으로이 작업을 수행하는 데 관심이있는 사람들은 lvmsync 도구를 사용하여 스냅 샷에서 변경된 블록 목록을 읽고 해당 변경 사항 만 보냅니다.


6

한 번 봐 가지고 Zumastor 리눅스 스토리지 프로젝트 는 통해 바이너리 "rsync를"사용 "스냅 샷"백업 구현 ddsnap의 도구를.

맨 페이지에서 :

ddsnap은 여러 동시 스냅 샷을 효율적으로 보유 할 수있는 블록 레벨 스냅 샷 기능을 제공하여 블록 장치 복제를 제공합니다. ddsnap은 두 스냅 샷간에 다른 스냅 샷 청크 목록을 생성 한 다음 해당 차이를 유선으로 전송할 수 있습니다. 다운 스트림 서버에서 업데이트 된 데이터를 스냅 샷 된 블록 장치에 씁니다.


아, 그건 내가 찾던 것 같아서 고마워
David Hicks

Zumastor 프로젝트에 대한 링크가 오래되었습니다. 이것이
Martin

2

ssh를 통해 네트워크를 통해 두 블록 장치를 동기화하고 변경 사항 만 전송하는 간단한 방법 인 blocksync 라는 Python 스크립트 가 있습니다.

  • blocksync.py를 원격 호스트의 홈 디렉토리에 복사하십시오.
  • 원격 사용자가 sudo이거나 root 자체인지 확인하십시오.
  • 로컬 사용자 (루트?)가 소스 장치를 읽고 원격 호스트에 ssh를 읽을 수 있는지 확인하십시오.
  • 호출 python blocksync.py /dev/source user@remotehost /dev/dest

최근에 rsync ( Adler-32 ) 와 동일한 빠른 체크섬 알고리즘을 사용하도록 정리하고 변경하기 위해 해킹했습니다 .


1
나는 그것을 사용하고 있으며 잘 작동합니다. 주의점가 수정 된 버전이 부패하고 사용하는보다 신뢰성 해시 수정 가능한 소스.
cmc

1

평범하게 와이어를 통해 보낼 빈 공간의 양을 최소화하려는 경우 ddssh로 파이프하기 전에 gzip으로 파이프 할 수 있습니까?

예 : dd if = / dev / xenVG / SERVER001OS | gzip | ssh administrator @ backupserver "dd of = / mnt / largeDisk / SERVER001OS.img.gz"


필요한 대역폭을 약간 줄 였지만 60 및 100GB의 디스크 이미지가 있으며 gzip을 사용하더라도 시간이 너무 오래 걸립니다.
David Hicks

@Ophidian, SSH는 내부적으로 압축을 처리한다는 것을 알아야합니다. 옵션이 있습니다.
poige

1

LVM 스냅 샷이있는 시스템의 성능은 스냅 샷 수에 비례합니다.

예를 들어 lvm 스냅 샷의 MySQL 성능


실제로 내 초기 솔루션은 단순히 일일 스냅 샷을 설정 한 다음 전날의 스냅 샷과 비교하여 백업 서버에 복사하는 것입니다. 나는 그것이 그렇게 간단하지 않다는 것을 알기 위해 가장 엿 보았습니다.
David Hicks

LVM 씬 스냅 샷의 경우와는 매우 다르게 구현됩니다
Alex F

0

David Herselman의 답변 외에도 다음 스크립트가 로컬 장치와 동기화됩니다.

perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 |
  perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
   perl -ne 'BEGIN{$/=\1} if ($_ eq"s") {$s++} else {if ($s) {
    seek STDOUT,$s*1024,1; $s=0}; read ARGV,$buf,1024; print $buf}' 1<> $dev2

내가 아는 한 두 스크립트가 모두 list.samba.org에 게시되었습니다 .


0

이것은 오래된 질문이지만 두 블록 장치를 효율적으로 동기화하는 두 가지 유용한 도구를 언급 한 사람은 없습니다.

  • diff-transfer-and-patch 방식을 사용하는 bdsync

  • 제자리에서 다시 쓰기 접근 방식을 사용하는 blocksync (여기서는 개선 된 버전을 찾을 수 있음 ).

도구 를 모두 사용하고 원하는 용도에 더 잘 맞는 것을 선택 하는 것이 좋습니다 .


0

몇 년 동안 검색 한 후 최근 에 서버간에 LVM 스냅 샷동기화 하는 도구를 만들었습니다 . 최소한의 IO를 사용하도록 설계되었으며 동기화가 진행되는 동안 시스템을 실행할 수 있습니다.

LVM 스냅 샷의 차이점을 동기화하고 성능 저하가 최소화되도록 씬 프로비저닝을 사용한다는 점에서 ZFS 보내기 / 받기와 비슷합니다.

의견을 보내 주시기 바랍니다.


-1

이 스크립트에는 몇 가지 효율성이 있습니다.

  1. 내 시스템에서 적어도 perl 버퍼 읽기는 8k이므로 8192 블록 크기를 사용하십시오.
  2. 자동 출력을 통해 로컬 출력은 원격 출력 버퍼가 꽉 찰 때까지 차단되지 않습니다.

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne'BEGIN {$ | = 1; \ $ / = \ 892}; print md5 (\ $ ) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne'BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5 ($ ); STDIN, $ a, 16; if ($ a eq $ b) {print "s"} else {print "c"를 읽으십시오. $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ remote "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} if (\ $ _ eq \"s \ ") {\ $ s ++} else {if (\ $ s) {STDOUT 찾기, \ $ s * 8192,1; \ $ s = 0}; ARGV 읽기, \ $ buf, 8192; print $$ buf} '1 <> $ dev2 "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.