Đồng bộ ảnh chụp nhanh LVM vào máy chủ dự phòng


22

Tôi có một số máy ảo Xen chạy trên một số máy chủ Linux. Các máy ảo này lưu trữ hình ảnh đĩa của chúng trong các khối LVM của Linux với tên thiết bị dọc theo dòng / dev / xenVG / SERVER001OS, v.v. Tôi muốn sao lưu thường xuyên các hình ảnh đĩa đó để tôi có thể khôi phục máy ảo trong trường hợp chúng tôi cần (các thiết bị LVM đã được nhân đôi với DRBD giữa hai máy vật lý, mỗi máy chỉ bị hoang tưởng thêm ở đây).

Làm thế nào để tôi đi về điều này? Rõ ràng bước đầu tiên là chụp nhanh thiết bị LVM, nhưng làm cách nào để chuyển dữ liệu sang máy chủ dự phòng theo cách hiệu quả nhất có thể? Tôi chỉ có thể sao chép toàn bộ thiết bị, một cái gì đó dọc theo dòng:

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

... nhưng điều đó sẽ tốn rất nhiều băng thông. Có một công cụ giống như rsync để đồng bộ nội dung của toàn bộ khối đĩa giữa các máy chủ từ xa không? Cái gì đó như:

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

Nếu tôi hiểu chính xác trang man của rsync, lệnh trên sẽ không thực sự hoạt động (phải không?), Nhưng nó cho thấy những gì tôi đang hướng tới. Tôi hiểu tùy chọn --devices rsync là sao chép chính các thiết bị, không phải nội dung của các thiết bị đó. Tạo một bản sao cục bộ của hình ảnh VM trước khi đồng bộ hóa nó với máy chủ từ xa không phải là một tùy chọn vì không có không gian đĩa.

Có tiện ích tiện dụng nào có thể đồng bộ giữa các thiết bị khối và tệp sao lưu trên máy chủ từ xa không? Tôi có thể viết một cái nếu tôi phải, nhưng một giải pháp hiện có sẽ tốt hơn. Tôi đã bỏ lỡ một tùy chọn rsync làm điều này cho tôi?

Câu trả lời:



16

Mặc dù có các bản vá 'thiết bị ghi' và 'thiết bị sao chép' cho RSync nhưng chúng chỉ hoạt động tốt trên các hình ảnh nhỏ (1-2GB). RSync sẽ dành nhiều năm để tìm kiếm các khối phù hợp trên các hình ảnh lớn hơn và gần như vô dụng với các thiết bị / tệp 40 GB hoặc lớn hơn.

Chúng tôi sử dụng cách sau để thực hiện so sánh tổng kiểm tra 1 MB và sau đó chỉ cần sao chép nội dung nếu nội dung đó không khớp. Chúng tôi sử dụng điều này để sao lưu máy chủ trên máy chủ ảo ở Hoa Kỳ sang hệ thống sao lưu ở Anh, qua internet công cộng. Rất ít hoạt động của CPU và hiệu năng chụp nhanh chỉ sau vài giờ:

Tạo ảnh chụp nhanh:

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';

Hạt giống ban đầu:

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

Sao lưu hàng đêm tăng dần (chỉ gửi các khối đã thay đổi):

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"

Xóa ảnh chụp nhanh:

lvremove -f company-exchange-snap1

Tôi đã sợ hãi lúc đầu nhưng sau đó đã thử nó và nó thực sự hoạt động.
Martin

Tại sao read ARGV,$buf,1024thay vì read STDIN,$buf,1024, @ sysadmin1138? (Tôi đang cố gắng trả lời stackoverflow.com/q/22693823/2987828 và không hiểu ARGV ở đây). Tôi sử dụng biến thể hàng ngày trong stackoverflow.com/q/22693823/2987828 và nó hoạt động tốt.
dùng2987828

1
xem perlmonks.org/bare/?node_id=492858 nói rằng ARGV và STDIN tương tự nhau trừ khi tên tệp được đưa ra làm đối số.
dùng2987828

9

Những người quan tâm đến việc này đặc biệt với ảnh chụp nhanh LVM có thể thích công cụ lvmsync của tôi , nó đọc danh sách các khối đã thay đổi trong ảnh chụp nhanh và chỉ gửi những thay đổi đó.


6

Hãy xem Dự án lưu trữ Linux củaastastast, nó thực hiện sao lưu "snapshot" bằng cách sử dụng "rsync" nhị phân thông qua công cụ ddsnap .

Từ trang con người:

ddsnap cung cấp sao chép thiết bị khối cho một cơ sở chụp nhanh cấp khối có khả năng giữ nhiều ảnh chụp nhanh đồng thời một cách hiệu quả. ddsnap có thể tạo ra một danh sách các khối ảnh chụp nhanh khác nhau giữa hai ảnh chụp nhanh, sau đó gửi sự khác biệt đó qua dây. Trên máy chủ xuôi dòng, ghi dữ liệu cập nhật vào thiết bị khối được chụp nhanh.


Ah, đó trông giống như thứ mà tôi đang tìm kiếm, cảm ơn.
David Hicks

Liên kết đến dự án Zumastor đã lỗi thời, tôi đoán đây là chính xác: shapor.com/zumastor.org
Martin

2

Có một tập lệnh python có tên là blocksync , đây là một cách đơn giản để đồng bộ hóa hai thiết bị khối qua mạng thông qua ssh, chỉ chuyển các thay đổi.

  • Sao chép blocksync.py vào thư mục chính trên máy chủ từ xa
  • Đảm bảo người dùng từ xa của bạn có thể sudo hoặc là root
  • Đảm bảo người dùng cục bộ của bạn (root?) Có thể đọc thiết bị nguồn & ssh đến máy chủ từ xa
  • Gọi: python blocksync.py /dev/source user@remotehost /dev/dest

Gần đây tôi đã hack nó để dọn dẹp và thay đổi nó để sử dụng thuật toán kiểm tra nhanh tương tự như rsync ( Adler-32 ).


1
Tôi đang sử dụng nó, hoạt động tốt. Lưu ý rằng có một phiên bản sửa đổi sửa chữa một nguồn tham nhũng có thể và sử dụng hàm băm đáng tin cậy hơn.
cmc

1

Nếu bạn đang cố gắng giảm thiểu lượng không gian trống mà bạn gửi qua dây bằng một đồng bằng dd, bạn có thể không chỉ chuyển nó sang gzip trước khi chuyển nó sang ssh không?

ví dụ: dd if = / dev / xenVG / SERVER001OS | gzip | quản trị viên ssh @ backupserver "dd of = / mnt / LargeDisk / SERVER001OS.img.gz"


Nó sẽ cắt giảm băng thông cần thiết một chút, nhưng chúng tôi đã có một số hình ảnh đĩa 60 và 100 GB và ngay cả với gzip cũng mất quá nhiều thời gian.
David Hicks

@Ophidian, bạn nên biết rằng SSH xử lý nén nội bộ, có một tùy chọn.
poige

1

Chỉ cần lưu ý rằng hiệu suất của một hệ thống có ảnh chụp nhanh LVM tỷ lệ thuận với số lượng ảnh chụp nhanh.

Ví dụ hiệu suất Mysql với ảnh chụp nhanh lvm


Thật vậy - giải pháp ban đầu của tôi liên quan đến việc chỉ cần thiết lập ảnh chụp nhanh hàng ngày sau đó thực hiện khác với ảnh chụp nhanh của ngày hôm trước và gửi nó đến máy chủ dự phòng. Tôi rất ngạc nhiên khi biết rằng nó sẽ không đơn giản như vậy.
David Hicks

Điều đó có thể không đúng với các ảnh chụp nhanh LVM được triển khai khác đi nhiều
Alex F

0

Ngoài câu trả lời của David Herselman - đoạn script sau sẽ đồng bộ hóa với thiết bị cục bộ:

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

Theo như tôi biết thì cả hai tập lệnh đều được đăng lần đầu tiên tạilists.samba.org .


0

Đây là một câu hỏi cũ, nhưng không ai đề cập đến hai công cụ rất hữu ích để đồng bộ hóa hiệu quả hai thiết bị khối:

Tôi thực sự khuyên bạn nên chơi với cả hai công cụ và chọn bất kỳ công cụ nào phù hợp hơn với mục đích sử dụng của bạn.


0

Sau khi tìm kiếm trong vài năm, gần đây tôi đã tạo ra một công cụ để đồng bộ hóa ảnh chụp nhanh LVM giữa các máy chủ. Nó được thiết kế để sử dụng IO tối thiểu và cho phép các hệ thống chạy trong khi quá trình đồng bộ hóa đang diễn ra.

Nó tương tự như gửi / nhận ZFS ở chỗ đồng bộ hóa sự khác biệt giữa các ảnh chụp nhanh LVM và sử dụng việc cung cấp mỏng để tác động hiệu suất là tối thiểu.

Tôi muốn phản hồi, vì vậy xin vui lòng có một cái nhìn.


-1

Có một vài hiệu quả được thực hiện cho kịch bản này:

  1. Trên hệ thống của tôi ít nhất, bộ đệm perl đọc là 8k, vì vậy hãy sử dụng kích thước khối 8192.
  2. tự động điền để kết thúc cục bộ không chặn cho đến khi bộ đệm đầu ra từ xa 'đầy', vì chúng ta đang cho ăn bộ đệm dường như vô nghĩa.

ssh -i /root/.ssh/rsync_rsa $ từ xa "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; in md5 (\ $ ) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5 ($ ); đọc STDIN, $ a, 16; if ($ a eq $ b) {print "s"} other {print "c". $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ từ xa "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} if (\ $ _ eq \" s \ ") {\ $ s ++} khác {if (\ $ s) {tìm kiếm STDOUT, \ $ s * 8192,1; \ $ s = 0}; đọc ARGV, \ $ buf, 8192; in \ $ buf} '1 <> $ dev2 "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.