ซิงค์ภาพรวม LVM กับเซิร์ฟเวอร์สำรอง


22

ฉันมีจำนวนเครื่องเสมือน Xen ที่ทำงานบนเซิร์ฟเวอร์ Linux จำนวนหนึ่ง VM เหล่านี้จัดเก็บอิมเมจของดิสก์ในไดรฟ์ข้อมูล Linux LVM พร้อมชื่ออุปกรณ์ตามบรรทัดของ / dev / xenVG / SERVER001OS เป็นต้น ฉันต้องการสำรองข้อมูลปกติของดิสก์อิมเมจเหล่านั้นเพื่อให้ฉันสามารถกู้คืน 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

หากฉันเข้าใจ man page ของ rsync อย่างถูกต้องคำสั่งด้านบนจะใช้งานไม่ได้จริง ๆ แต่มันจะแสดงสิ่งที่ฉันต้องการ ฉันเข้าใจตัวเลือก - อุปกรณ์ rsync คือการคัดลอกอุปกรณ์ด้วยตัวเองไม่ใช่เนื้อหาของอุปกรณ์เหล่านั้น การทำสำเนาโลคัลของอิมเมจ VM ก่อนทำการซิงค์กับรีโมตเซิร์ฟเวอร์ไม่ใช่ตัวเลือกเนื่องจากไม่มีพื้นที่ดิสก์

มียูทิลิตี้ที่ใช้งานง่ายที่สามารถซิงค์ระหว่างอุปกรณ์บล็อกและไฟล์สำรองข้อมูลบนเซิร์ฟเวอร์ระยะไกลได้หรือไม่? ฉันสามารถเขียนได้ถ้าฉันมี แต่ทางออกที่มีอยู่จะดีกว่า ฉันพลาดตัวเลือก rsync ที่ใช้สำหรับฉันหรือไม่?

คำตอบ:


12

rsync มาตรฐานหายไปจากฟีเจอร์นี้ แต่มี patch สำหรับมันใน rsync-patches tarball (copy-devices.diff) ซึ่งสามารถดาวน์โหลดได้จากhttp://rsync.samba.org/ftp/rsync/ หลังจาก appling และ recompiling คุณสามารถ rsync อุปกรณ์ด้วยตัวเลือก - คัดลอกอุปกรณ์


หากเป้าหมายของคุณคืออุปกรณ์แพทช์จะอยู่ที่นี่: bugzilla.redhat.com/show_bug.cgi?id=1193654
Jason Pyeron

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

ทำไมread ARGV,$buf,1024แทนที่จะเป็นread STDIN,$buf,1024, @ sysadmin1138 (ฉันพยายามตอบstackoverflow.com/q/22693823/2987828และไม่เข้าใจ ARGV ที่นี่) ฉันใช้ตัวแปรในคำถามstackoverflow.com/q/22693823/2987828ทุกวันและใช้งานได้ดี
2987828

1
ดูperlmonks.org/bare/?node_id=492858ซึ่งบอกว่า ARGV และ STDIN นั้นคล้ายกันเว้นแต่ว่าชื่อไฟล์จะได้รับเป็นอาร์กิวเมนต์
user2987828

9

ผู้ที่สนใจทำสิ่งนี้โดยเฉพาะด้วยสแนปชอตของ LVM อาจชอบเครื่องมือlvmsyncของฉันซึ่งจะอ่านรายการบล็อกที่มีการเปลี่ยนแปลงในสแน็ปช็อตและส่งการเปลี่ยนแปลงเหล่านั้น


6

ดูที่Zumastor Linux Storage Projectซึ่งใช้การสำรองข้อมูล "snapshot" โดยใช้ไบนารี "rsync" ผ่านเครื่องมือddsnap

จากหน้าคน:

ddsnap จัดเตรียมการจำลองแบบอุปกรณ์บล็อกเนื่องจากเครื่องมืออำนวยความสะดวกสแนปชอตระดับบล็อกสามารถเก็บสแน็ปช็อตหลาย ๆ ตัวพร้อมกันได้อย่างมีประสิทธิภาพ ddsnap สามารถสร้างรายการของสแน็ปช็อตชิ้นที่แตกต่างระหว่างสองสแนปชอตจากนั้นส่งความแตกต่างนั้นผ่านสาย บนเซิร์ฟเวอร์ดาวน์สตรีมเขียนข้อมูลที่อัพเดตไปยังอุปกรณ์บล็อกสแน็ปช็อต


อาที่ดูเหมือนว่าเป็นสิ่งที่ฉันกำลังมองหาขอบคุณ
David Hicks

ลิงก์ไปยังโครงการ Zumastor ล้าสมัยฉันคิดว่านี่เป็นสิ่งที่ถูกต้อง: shapor.com/zumastor.org
Martin

2

มีสคริปต์ไพธ อนชื่อblocksyncซึ่งเป็นวิธีที่ง่ายในการซิงโครไนซ์อุปกรณ์บล็อกสองตัวผ่านเครือข่ายผ่าน ssh เพียงถ่ายโอนการเปลี่ยนแปลงเท่านั้น

  • คัดลอก blocksync.py ไปยังโฮมไดเร็กทอรีบนรีโมตโฮสต์
  • ตรวจสอบให้แน่ใจว่าผู้ใช้รีโมตของคุณสามารถ sudo หรือรูตเองได้
  • ตรวจสอบให้แน่ใจว่าผู้ใช้โลคัลของคุณ (รูท?) สามารถอ่านอุปกรณ์ต้นทาง & ssh ไปยังรีโมตโฮสต์
  • วิงวอน: python blocksync.py /dev/source user@remotehost /dev/dest

ฉันเพิ่งแฮ็กมันเพื่อทำความสะอาดและเปลี่ยนให้ใช้อัลกอริทึมการตรวจสอบอย่างรวดเร็วแบบเดียวกับ rsync ( Adler-32 )


1
ฉันใช้มันทำงานได้ดี โปรดทราบว่ามีเวอร์ชันที่แก้ไขซึ่งแก้ไขแหล่งที่มาของความเสียหายและใช้แฮชที่เชื่อถือได้มากขึ้น
cmc

1

หากคุณกำลังพยายามลดจำนวนพื้นที่ว่างที่คุณจะส่งผ่านลวดด้วยธรรมดาddคุณไม่เพียง แต่จะส่งไปยัง gzip ก่อนที่จะส่งไปยัง ssh

เช่น dd if = / dev / xenVG / SERVER001OS | gzip | ผู้ดูแลระบบ ssh @ backupserver "dd of = / mnt / largeDisk / SERVER001OS.img.gz"


มันต้องการลดแบนด์วิดท์ที่จำเป็น แต่เรามีอิมเมจดิสก์ขนาด 60 และ 100 GB และแม้แต่กับ gzip ก็ใช้เวลานานเกินไป
David Hicks

@Ophidian คุณควรรู้ว่า SSH จัดการการบีบอัดภายในมีตัวเลือกอยู่
poige

1

เพียงแค่ระวังว่าประสิทธิภาพของระบบที่มีสแนปชอตของ LVM นั้นเป็นสัดส่วนกับจำนวนสแน็ปช็อต

ตัวอย่างเช่นประสิทธิภาพ Mysql ที่มีสแน็ปช็อต lvm


อันที่จริง - โซลูชันเริ่มต้นของฉันเกี่ยวข้องกับการตั้งค่าสแนปชอตรายวันจากนั้นทำส่วนต่างกับสแน็ปช็อตของวันก่อนหน้าและทำการสำรองไปยังเซิร์ฟเวอร์สำรอง ฉันโกรธมากที่สุดที่จะพบว่ามันจะไม่ง่ายอย่างนั้น
David Hicks

ซึ่งอาจไม่เป็นความจริงด้วยสแน็ปช็อตแบบบางของ LVM ซึ่งมีการใช้งานที่แตกต่างกันมาก
อเล็กซ์ 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

เท่าที่ผมรู้ว่าทั้งสคริปต์ถูกโพสต์เป็นครั้งแรกที่lists.samba.org


0

นี่เป็นคำถามเก่า แต่ไม่มีใครพูดถึงสองเครื่องมือที่มีประโยชน์มากในการซิงโครไนซ์อุปกรณ์บล็อกสองเครื่องอย่างมีประสิทธิภาพ:

ฉันขอแนะนำอย่างยิ่งให้เล่นด้วยเครื่องมือทั้งสองและเลือกสิ่งที่ปรับให้เข้ากับการใช้งานของคุณได้ดียิ่งขึ้น


0

หลังจากค้นหาเป็นเวลาหลายปีฉันเพิ่งสร้างเครื่องมือสำหรับการซิงโครไนซ์สแน็ปช็อต LVMระหว่างเซิร์ฟเวอร์ มันถูกออกแบบมาให้ใช้ IO น้อยที่สุดและอนุญาตให้ระบบทำงานในขณะที่การซิงโครไนซ์เกิดขึ้น

มันคล้ายกับการส่ง / รับ ZFS ซึ่งในการซิงโครไนซ์ความแตกต่างระหว่างสแน็ปช็อต LVM และใช้การจัดเตรียมแบบบางเพื่อให้ผลกระทบต่อประสิทธิภาพมีน้อยที่สุด

ฉันต้องการข้อเสนอแนะดังนั้นโปรดดู


-1

มีประสิทธิภาพเล็กน้อยที่จะทำกับสคริปต์นี้:

  1. อย่างน้อยในระบบของฉันบัฟเฟอร์ perl ที่อ่านคือ 8k ดังนั้นใช้ขนาดบล็อก 8192
  2. autoflush ดังนั้นจุดปลายโลคอลจึงไม่ปิดกั้นจนกว่าบัฟเฟอร์เอาต์พุตระยะไกลจะ 'เต็ม' ในขณะที่เราป้อน lzop บัฟเฟอร์จะดูเหมือนไม่มีจุดหมาย

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; พิมพ์ 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 $ ระยะไกล "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} ถ้า (\ $ _ eq \" s \ ") {\ $ s ++} อื่น {ถ้า (\ $ s) {ค้นหา STDOUT, \ $ s * 8192,1; \ $ s = 0}; อ่าน ARGV, \ $ buf, 8192; พิมพ์ \ $ buf} '1 <> $ dev2 "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.