백업 서버에 LVM 스냅 샷 동기화 실행되는 여러 Xen

여러 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 옵션을 놓쳤습니까?



답변

표준 rsync에는이 기능이 없지만 rsync-patches tarball (copy-devices.diff)에는 http://rsync.samba.org/ftp/rsync/ 에서 다운로드 할 수있는 패치가 있습니다. 적용
및 재 컴파일 후 –copy-devices 옵션을 사용하여 장치를 재 동기화 할 수 있습니다.


답변

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

답변

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


답변

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

맨 페이지에서 :

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


답변

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

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

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


답변

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

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