LVM स्नैपशॉट को बैकअप सर्वर में सिंक करें


22

मेरे पास बहुत सारे लिनक्स वर्चुअल मशीन हैं जो कई लिनक्स सर्वरों पर चल रहे हैं। ये VM, Linux LVM संस्करणों में अपनी डिस्क छवियों को डिवाइस के नाम के साथ / dev / xenVG / SERVER001OS इत्यादि की तर्ज पर संग्रहीत करते हैं। मैं उन डिस्क छवियों का नियमित रूप से बैकअप लेना चाहता हूं ताकि मुझे वीएम को बहाल कर सकें, अगर हमें ज़रूरत है (एलवीएम डिवाइस पहले से ही दो भौतिक मशीनों के बीच 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 विकल्प उपकरणों की नकल करना है, न कि उन उपकरणों की सामग्री। दूरस्थ सर्वर के साथ इसे सिंक्रनाइज़ करने से पहले वीएम छवि की एक स्थानीय प्रतिलिपि बनाना एक विकल्प नहीं है क्योंकि डिस्क स्थान नहीं है।

क्या एक उपयोगी उपयोगिता है जो ब्लॉक डिवाइस और एक रिमोट सर्वर पर बैकअप फ़ाइल के बीच सिंक कर सकती है? अगर मुझे करना है तो मैं लिख सकता हूं, लेकिन मौजूदा समाधान बेहतर होगा। क्या मैंने एक rsync विकल्प याद किया है जो मेरे लिए ऐसा करता है?

जवाबों:


12

मानक rsync इस सुविधा को याद कर रहा है, लेकिन rsync-patches tarball (copy-devices.diff) में इसके लिए एक पैच है जिसे http://rsync.samba.org/ftp/rsync/ से डाउनलोड किया जा सकता है और अपील करने और फिर से खोलने के बाद , आप --copy- उपकरणों के विकल्प के साथ rsync डिवाइस कर सकते हैं।


यदि आपका लक्ष्य एक उपकरण है, तो पैच यहां स्थित है: Bugzilla.redhat.com/show_bug.cgi?id=1193654
जेसन पीरॉन

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

मैं पहले डर गया था, लेकिन फिर इसे आज़माया और यह वास्तव में काम करता है।
मार्टिन

read ARGV,$buf,1024इसके बजाय read STDIN,$buf,1024, @ sysadmin1138 क्यों ? (मैं stackoverflow.com/q/22693823/2987828 का जवाब देने की कोशिश कर रहा हूँ और ARGV को यहाँ नहीं समझता)। मैं हर रोज़ वेरिएंट का उपयोग प्रश्न stackoverflow.com/q/22693823/2987828 में करता हूं और यह अच्छी तरह से काम करता है।
user2987828

1
देखें perlmonks.org/bare/?node_id=492858 जो कहता है कि ARGV और STDIN तब तक समान हैं जब तक कि एक फ़ाइल नाम तर्क के रूप में नहीं दिया जाता है।
user2987828 14

9

विशेष रूप से LVM स्नैपशॉट के साथ ऐसा करने में रुचि रखने वाले लोग मेरे lvmsync टूल को पसंद कर सकते हैं , जो स्नैपशॉट में परिवर्तित ब्लॉकों की सूची को पढ़ता है और बस उन परिवर्तनों को भेजता है।


6

ज़ुमास्टर लिनक्स स्टोरेज प्रोजेक्ट पर नज़र डालें, यह ddsnap टूल के माध्यम से बाइनरी "rsync" का उपयोग करके "स्नैपशॉट" बैकअप लागू करता है।

मैन-पेज से:

ddsnap ब्लॉक डिवाइस प्रतिकृति प्रदान करता है, जो एक ब्लॉक स्तर स्नैपशॉट सुविधा देता है जो एक साथ कई स्नैपशॉट को कुशलतापूर्वक रखने में सक्षम है। ddsnap स्नैपशॉट विखंडू की एक सूची उत्पन्न कर सकता है जो दो स्नैपशॉट के बीच भिन्न होता है, फिर तार पर उस अंतर को भेजें। डाउनस्ट्रीम सर्वर पर, स्नैपशॉट ब्लॉक किए गए डिवाइस पर अपडेट किया गया डेटा लिखें।


आह, कि मैं जिस तरह की चीज की तलाश कर रहा था, वैसा ही लगता है, धन्यवाद।
डेविड हिक्स

Zumastor परियोजना के लिए लिंक पुराना है, मुझे लगता है कि यह सही है: shapor.com/zumastor.org
मार्टिन

2

एक अजगर स्क्रिप्ट है जिसे ब्लॉकसिंक कहा जाता है जो एक नेटवर्क पर दो ब्लॉक डिवाइस को ssh के माध्यम से सिंक्रोनाइज़ करने का एक सरल तरीका है, केवल परिवर्तनों को स्थानांतरित करना।

  • दूरस्थ होस्ट पर होम निर्देशिका में ब्लॉकसिंकहोम कॉपी करें
  • सुनिश्चित करें कि आपका दूरस्थ उपयोगकर्ता या तो sudo कर सकता है या स्वयं मूल है
  • सुनिश्चित करें कि आपका स्थानीय उपयोगकर्ता (रूट?) दूरस्थ होस्ट के लिए स्रोत डिवाइस और ssh पढ़ सकता है
  • आह्वान: python blocksync.py /dev/source user@remotehost /dev/dest

मैंने हाल ही में इसे साफ करने के लिए इसे हैक किया है और इसे rsync ( एडलर -32 ) के समान तेज-चेकसम एल्गोरिथ्म का उपयोग करने के लिए बदल दिया है ।


1
मैं इसका उपयोग कर रहा हूं, ठीक काम करता है। नोट एक संशोधित संस्करण है जो भ्रष्टाचार के संभावित स्रोत को ठीक करता है और अधिक विश्वसनीय हैश का उपयोग करता है।
cmc

1

यदि आप उस खाली जगह को कम से कम करने की कोशिश कर रहे हैं, जिसे आप तार के साथ एक सादे स्थान पर भेजेंगे dd, तो क्या आप इसे ssh करने के लिए पाइप करने से पहले इसे सिर्फ gzip में पाइप नहीं कर सकते?

उदा dd if = / dev / xenVG / SERVER001OS | gzip | ssh एडमिनिस्ट्रेटर @ backupserver "dd of = / mnt / bigDisk / SERVER001OS.img.lz"


यह बैंडविड्थ को थोड़ा कम करना चाहता था, लेकिन हमें कुछ 60 और 100 जीबी डिस्क चित्र मिले हैं और यहां तक ​​कि गज़िप के साथ भी बहुत लंबा समय लगेगा।
डेविड हिक्स

@ ओफ़िडियन, आपको पता होना चाहिए कि एसएसएच आंतरिक रूप से संपीड़न को संभालता है, एक विकल्प है।
poige

1

बस इस बात से सावधान रहें कि LVM स्नैपशॉट वाले सिस्टम का प्रदर्शन स्नैपशॉट की संख्या के लिए आनुपातिक है।

उदाहरण के लिए lvm स्नैपशॉट के साथ मैसकल का प्रदर्शन


वास्तव में - मेरे प्रारंभिक समाधान में केवल एक दैनिक स्नैपशॉट सेट करना शामिल था और पिछले दिन के स्नैपशॉट के साथ एक अंतर करना और इसे बैकअप सर्वर पर dd-ing करना था। मुझे यह पता लगाने में सबसे अधिक पीड़ा हुई कि यह इतना सरल नहीं होगा।
डेविड हिक्स

यह LVM पतले स्नैपशॉट के साथ सच नहीं हो सकता है जो बहुत अलग तरीके से लागू किए जाते हैं
एलेक्स एफ

0

डेविड हर्सलमैन के जवाब के अलावा - निम्नलिखित स्क्रिप्ट एक स्थानीय डिवाइस के लिए सिंक होगी:

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

यह एक पुराना प्रश्न है, लेकिन किसी ने भी दो ब्लॉक उपकरणों को कुशलता से सिंक्रनाइज़ करने के लिए दो बहुत उपयोगी उपकरणों का उल्लेख नहीं किया है:

  • bdsync , जो एक अंतर-स्थानांतरण-और-पैच दृष्टिकोण का उपयोग करते हैं;

  • ब्लॉकसिंक (यहां आप मेरे उन्नत संस्करण को पा सकते हैं ), जो इन-प्लेस-रीराइट दृष्टिकोण का उपयोग करते हैं।

मैं दृढ़ता से दोनों साधनों के साथ खेलने और अपने इच्छित उपयोग के लिए बेहतर अनुकूलन का चयन करने का सुझाव देता हूं ।


0

कई वर्षों की खोज के बाद, मैंने हाल ही में सर्वरों के बीच LVM स्नैपशॉट को सिंक्रनाइज़ करने के लिए एक उपकरण बनाया है। यह न्यूनतम IO का उपयोग करने के लिए डिज़ाइन किया गया है और सिस्टम को चलाने की अनुमति देता है जबकि सिंक्रोनाइज़ेशन हो रहा है।

यह ZFS सेंड / रिसीव करने के समान है जिसमें LVM स्नैपशॉट के बीच अंतर को सिंक्रनाइज़ करता है, और पतले प्रोविजनिंग का उपयोग करता है ताकि प्रदर्शन प्रभाव कम से कम हो।

मैं प्रतिक्रिया चाहूंगा, इसलिए कृपया एक नज़र डालें।


-1

इस लिपि को बनाने के लिए कुछ क्षमताएँ थीं:

  1. कम से कम मेरे सिस्टम पर, पर्ल बफर पढ़ता है 8k, इसलिए 8192 ब्लॉक आकार का उपयोग करें।
  2. जब तक हम रिमोट आउटपुट बफ़र 'पूर्ण' नहीं हो जाते, तब तक स्थानीय अंत ब्लॉक नहीं करता, क्योंकि हम बफरिंग को बेकार मानते हैं।

ssh -i /root/.ssh/rsync_rsa $ रिमोट "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ = = 1; \ $ / = \ 892}; प्रिंट m5 (\ $ ) '$ dev2 | lzop -c ”| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5 ($ ); STDIN पढ़ें, $ a, 16; अगर ($ eq $ b) {प्रिंट "s"} और {प्रिंट "c"। $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ रिमोट "lzop -dc
= perl -ne 'BEGIN {\ _ $ / = \ 1} अगर (\ $ _ eq \" s \ ") \" $ s ++ "और {if ({$ s) {तलाश STDOUT, \ $ s * 8192,1; \ $ s = 0}; ARGV, \ $ buf, 8192; प्रिंट \ $ buf} '1 <> $ dev2 पढ़ें "

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.