नेटवर्क पर एक सर्वर से दूसरे सर्वर पर सीधे लॉजिकल वॉल्यूम ले जाना?


13

मेरे पास इस पर कई वीएम के साथ केवीएम होस्ट मशीन है। प्रत्येक VM होस्ट पर एक लॉजिकल वॉल्यूम का उपयोग करता है। मुझे LVs को किसी अन्य होस्ट मशीन में कॉपी करने की आवश्यकता है।

आम तौर पर, मैं कुछ का उपयोग करेगा:

dd if=/the/logical-volume of=/some/path/machine.dd

LV को एक छवि फ़ाइल में बदलने के लिए और इसे स्थानांतरित करने के लिए SCP का उपयोग करें। फिर फ़ाइल को नए होस्ट पर नए LV में वापस कॉपी करने के लिए DD का उपयोग करें।

इस पद्धति के साथ समस्या यह है कि आपको दो बार डिस्क स्थान की आवश्यकता है क्योंकि वीएम दोनों मशीनों पर ले जाता है। अर्थात। 5GB LV LV के लिए 5GB स्थान का उपयोग करता है और dd प्रतिलिपि छवि के लिए अतिरिक्त 5GB स्थान का उपयोग करता है। यह छोटे LVs के लिए ठीक है, लेकिन क्या होगा (जैसा कि मेरा मामला है) आपके पास एक बड़े VM के लिए 500GB LV है? नई होस्ट मशीन में 1TB हार्ड ड्राइव है, इसलिए यह 500GB dd इमेज फाइल नहीं रख सकता है और कॉपी करने के लिए 500GB लॉजिकल वॉल्यूम है और होस्ट OS के लिए कमरा और अन्य छोटे मेहमानों के लिए कमरा है।

मैं क्या करना चाहूंगा कुछ इस तरह है:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

दूसरे शब्दों में, नेटवर्क पर एक तार्किक वॉल्यूम से दूसरे तक डेटा को सीधे कॉपी करें और मध्यवर्ती छवि फ़ाइल को छोड़ दें।

क्या यह संभव है?


जवाबों:


24

यकीन है, निश्चित रूप से यह संभव है।

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

बूम।

हालांकि, अपने आप को एक एहसान करो, और डिफ़ॉल्ट अवरोधक से कुछ बड़ा उपयोग करें। शायद bs = 4M जोड़ें (4 एमबी की मात्रा में पढ़ें / लिखें)। आप देख सकते हैं कि टिप्पणियों में कुछ नटखटपन के बारे में है; यदि यह कुछ ऐसा है जो आप अपने आप को काफी बार कर रहे हैं, तो इसे अलग-अलग ब्लॉकों के साथ कुछ अलग समय आज़माने के लिए थोड़ा समय निकालें और अपने लिए देखें कि आपको सबसे अच्छी हस्तांतरण दर क्या है।

टिप्पणियों में से किसी एक प्रश्न का उत्तर देना:

आप स्थानांतरण के बारे में आंकड़े प्राप्त करने के लिए pv के माध्यम से हस्तांतरण को पाइप कर सकते हैं । यह बहुत से अच्छे संकेत है जो आपको सिग्नल भेजने से प्राप्त आउटपुट से है dd

मैं यह भी कहूंगा कि बेशक netcat का उपयोग करते समय - या कुछ और जो एन्क्रिप्शन के ओवरहेड को लागू नहीं करता है - अधिक कुशल होने जा रहा है, मुझे आमतौर पर लगता है कि अतिरिक्त गति सुविधा के कुछ नुकसान में आती है। जब तक मैं वास्तव में बड़े डेटासेट के आसपास घूम रहा हूं, मैं आमतौर पर ओवरहेड के बावजूद एसएच के साथ रहता हूं क्योंकि ज्यादातर मामलों में सब कुछ पहले से ही जस्ट वर्क तक सेट किया गया है।


1
क्या bs केवल प्रतिलिपि की गति को प्रभावित करता है, या क्या यह इस बात पर प्रभाव डालता है कि डेटा कैसे संग्रहीत किया जाता है?
निक

3
इसका कोई असर नहीं है कि डेटा कैसे संग्रहीत किया जाता है, लेकिन यह पढ़ने और लिखने के लिए डिफ़ॉल्ट ब्लॉकचेन (512 बाइट्स) का उपयोग करने की तुलना में बहुत अधिक कुशल है।
लार्क्स

3
@ निक: लिनक्स पर, आप इस ddप्रक्रिया को USR1सिग्नल भेज सकते हैं ताकि वह हस्तांतरित राशि के साथ एक स्थिति रेखा प्रदर्शित कर सके। अपनी ddप्रक्रिया की प्रक्रिया संख्या कुछ के साथ प्राप्त करें ps aux | grep ddऔर फिर कमांड के साथ इस पीआईडी ​​का उपयोग करें kill -USR1 $PID। संदेश मूल टर्मिनल पर प्रदर्शित किया जाएगा जहां आपने शुरू किया था dd
स्वेन

3
आप शायद एक bs का उपयोग नहीं करना चाहते हैं, क्योंकि यह केवल ssh तक पाइप को लिखने को अवरुद्ध करेगा, जब तक कि यह अधिकांश इसे नेटवर्क सॉकेट में स्थानांतरित नहीं कर सकता है, इस दौरान डिस्क निष्क्रिय हो जाएगी। चूंकि डिफ़ॉल्ट रीडहेड का आकार 128k है, आप शायद उसी के साथ रहना चाहते हैं। या डिस्क रीडहेड आकार बढ़ाएँ।
psusi

1
@psusi: लिंक Zoredache ने सवाल के नीचे टिप्पणी के रूप में डाला विपरीत का प्रदर्शन किया, उन्हें 16M ब्लॉक आकारों के साथ सबसे तेज़ परिणाम मिला, लेकिन ट्रांसफर विधि के रूप में ssh के बजाय netcat का उपयोग किया, जो एन्क्रिप्शन की आवश्यकता नहीं होने पर हमेशा एक बेहतर विकल्प होता है।
स्वेन

19

यहां एक अनुकूलित संस्करण है, जो pvबीएस का उपयोग करके प्रगति दिखाता है और बड़ी मात्रा में उपयोग करता gzipहै और नेटवर्क ट्रैफ़िक को कम करने के लिए भी उपयोग करता है।

इंटरनेट सर्वर जैसे धीमे कनेक्शन के बीच डेटा स्थानांतरित करते समय यह एकदम सही है। मैं स्क्रीन या tmux सत्र के अंदर कमांड चलाने की सलाह देता हूं। इस तरह से मेजबान को ssh कनेक्शन जहां से आप कमांड निष्पादित करते हैं, बिना परेशानी के डिस्कनेक्ट हो सकता है।

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'

2
आप ssh -Cइसके बजाय उपयोग कर सकते हैं gzip। मुझे यकीन नहीं है कि कोई प्रदर्शन प्रभाव है, लेकिन यह बहुत कम टाइपिंग है।
शमूएल एडविन वार्ड

1
मैं यह भी सुझाव देता हूं कि gzip के बजाय पिग या pxz -1 का उपयोग करें, मल्टीथ्रेडिंग वास्तव में किसी भी आधुनिक सर्वर पर मदद करता है।
sCiphre

pvबाइट्स की संख्या के साथ (इस प्रणाली के साथ अन्य सर्वरों में 500 वीपीएस से अधिक गति करने वाले मेरे विस्तार में) समस्या हो सकती है और इस समस्या के बाद, lvm वॉल्यूम असंगत हैं। कार्य की प्रगति देखने के लाभ शून्य और संगीन हैं। यदि आप प्रगति को देखते हैं तो उदाहरण के लिए ifto के साथ एक कंसोल खोलें।
abkrim

4

ऐसा करने के लिए एक पुराने फ़्रींड का उपयोग कैसे करें। Netcat।

उस सिस्टम पर जो तार्किक मात्रा प्रकार खो रहा है

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

फिर प्राप्त प्रणाली पर। प्रकार

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

अनुवाद करते हुए, orgin box ने इस फ़ाइल को dd और इसे nc (netcat) पर पाइप किया जो इस पोर्ट के बारे में सुनेगा। प्राप्त प्रणाली पर, netcat 10 सेकंड प्रतीक्षा करेगा यदि इसे [पोर्ट] पर [आईपी या नाम] को बंद करने से पहले कोई डेटा नहीं मिलता है, तो उस डेटा को इसे लिखने के लिए dd पर पाइप करें।


2
नेटकैट इन विकल्पों के साथ यूडीपी का उपयोग नहीं करता है।
शमूएल एडविन वार्ड

3

पहले मैं lv का स्नैपशॉट ले लूंगा:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

उसके बाद आपको एक ही आकार के साथ नए मेजबान (उदाहरण के लिए lvcreate का उपयोग करके) पर एक नया lv बनाना होगा। फिर आप डेटा को सीधे नए होस्ट पर कॉपी कर सकते हैं। यहाँ कॉपी कमांड का मेरा उदाहरण है:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

मैंने एक दूसरे मेजबान को VM को बनाए रखा एक प्रॉक्सोमॉक्स पीवे की प्रतिलिपि बनाने के लिए प्रक्रिया का उपयोग किया। लॉजिकल वॉल्यूम में कई अतिरिक्त LV हैं जो VM द्वारा ही बनाए रखे गए थे।


3

पहले सुनिश्चित करें कि लॉजिकल वॉल्यूम माउंट नहीं है। यदि यह है और आप "हॉट कॉपी" बनाना चाहते हैं, तो पहले एक स्नैपशॉट बनाएं और इसके बजाय इसका उपयोग करें: lvcreate --snapshot --name transfer_snap --size 1G

मुझे दो 1Gbit से जुड़े सर्वर के बीच बहुत सारे डेटा (7TB) को स्थानांतरित करना है, इसलिए मुझे ऐसा करने के लिए उपवास के संभावित तरीके की आवश्यकता थी।

क्या आपको SSH का उपयोग करना चाहिए?

Ssh का उपयोग करना प्रश्न से बाहर है, इसके एन्क्रिप्शन के कारण नहीं (यदि आपके पास एईएस-एनआई समर्थन वाला सीपीयू है, तो यह इतना नुकसान नहीं पहुंचाता है) लेकिन इसके नेटवर्क बफ़र्स के कारण। वे अच्छी तरह से स्केलिंग नहीं कर रहे हैं। एक पैच एसश संस्करण है जो इस समस्या को संबोधित करता है, लेकिन जैसा कि कोई पूर्व-निर्धारित पैकेज नहीं हैं, यह बहुत सुविधाजनक नहीं है।

संपीड़न का उपयोग करना

कच्ची डिस्क छवियों को स्थानांतरित करते समय, संपीड़न का उपयोग करना हमेशा उचित होता है। लेकिन आप नहीं चाहते कि संपीड़न एक अड़चन बन जाए। गज़िप जैसे अधिकांश यूनिक्स संपीड़न उपकरण एकल-थ्रेडेड हैं, इसलिए यदि संपीड़न एक सीपीयू को संतृप्त करता है, तो यह एक अड़चन होगी। उस कारण से, मैं हमेशा पिगज़ का उपयोग करता हूं, एक गज़िप संस्करण जो संपीड़न के लिए सभी सीपीयू कोर का उपयोग करता है। और यह आवश्यक है कि आप GBit गति से ऊपर और ऊपर जाना चाहते हैं।

एन्क्रिप्शन का उपयोग करना

जैसा कि पहले कहा गया था, ssh धीमा है। यदि आपके पास एईएस-एनआई सीपीयू है, तो यह अड़चन नहीं होनी चाहिए। इसलिए ssh का उपयोग करने के बजाय, हम सीधे Opensl का उपयोग कर सकते हैं।

गति

आपको घटकों के गति प्रभाव का एक विचार देने के लिए, यहाँ मेरे परिणाम हैं। वे दो उत्पादन प्रणालियों के बीच गति को पढ़ने और लिखने के लिए स्मृति में स्थानांतरित कर रहे हैं। आप वास्तविक परिणाम नेटवर्क गति, HDD गति और स्रोत CPU गति पर निर्भर करते हैं! Im यह दिखाने के लिए कि कम से कम कोई बड़ा प्रदर्शन ड्रॉप नहीं है। Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s निष्कर्ष: कंप्रेसिंग का उपयोग एक ध्यान देने योग्य स्पीडअप देता है, क्योंकि यह डेटा के आकार को बहुत कम कर देता है। यह और भी महत्वपूर्ण है यदि आपके पास धीमी नेटवर्क गति है। संपीड़न का उपयोग करते समय, अपने सीपीयू उपयोग को देखें। यदि उपयोग अधिकतम हो जाता है, तो आप इसके बिना प्रयास कर सकते हैं। एईएस-एनआई सिस्टम पर केवल एक छोटे प्रभाव के रूप में संपीड़न का उपयोग करना, केवल इसलिए कि यह संपीड़न से कुछ 30-40% सीपीयू चुराता है।

स्क्रीन का उपयोग करना

यदि आप मेरे जैसे बहुत से डेटा को स्थानांतरित कर रहे हैं, तो आप इसे अपने ssh क्लाइंट के नेटवर्क डिस्कनेक्ट द्वारा बाधित नहीं करना चाहते हैं, इसलिए आप इसे दोनों तरफ स्क्रीन के साथ शुरू करना बेहतर समझते हैं। यह सिर्फ एक नोट है, मैं यहां स्क्रीन ट्यूटोरियल नहीं लिखूंगा।

की नकल करते हैं

कुछ निर्भरताएँ स्थापित करें (स्रोत और गंतव्य पर): apt install pigz pv netcat-openbsd

फिर स्रोत के समान आकार के साथ गंतव्य पर एक वॉल्यूम बनाएं। यदि अनिश्चित है, तो आकार पाने और लक्ष्य बनाने के लिए स्रोत पर lvdisplay का उपयोग करें: lvcreate -n lvname vgname -L 50G

अगला, डेटा प्राप्त करने के लिए गंतव्य तैयार करें:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

और तैयार होने पर, स्रोत पर स्थानांतरण शुरू करें:

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

नोट: यदि आप स्थानीय स्तर पर डेटा ट्रांसफर कर रहे हैं या एन्क्रिप्शन की परवाह नहीं कर रहे हैं, तो बस ओपन्सल पार्ट को दोनों तरफ से हटा दें। यदि आप परवाह करते हैं, तो asdkjn2hb एन्क्रिप्शन कुंजी है, आपको इसे बदलना चाहिए।


एक PROXMOX सर्वर पर कभी भी ऐसा न करें: netcat-openbsd स्थापित करना netcat-openbsd स्थापित करना सर्वर से पूरी तरह से ProxMox मिटा दिया और 5 + घंटे के डाउनटाइम और काम का कारण बना !!!
ज़ोल्टन

-1

शेष उत्तर अच्छी तरह से काम नहीं करते हैं और प्रश्न आवश्यकताओं को पूरा नहीं करते हैं, क्योंकि यह लक्ष्य सर्वर में तार्किक मात्रा नहीं बनाता है, बल्कि रूट डिस्क में / dev / mygroup / myvol के तहत एक फ़ाइल बनाता है, जो कि एलवी टूल जैसे दिखने वाले कॉपी किए गए वॉल्यूम का कारण नहीं बनता है lvdisplay

मैंने एक बैश स्क्रिप्ट बनाई जो पूरी प्रक्रिया को स्वचालित करती है: https://github.com/daniol/lvm-ssh-transfer

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