2 सर्वरों के बीच लाखों फ़ाइलों को कॉपी करने का सबसे अच्छा तरीका


39

मेरे पास एक ही निर्देशिका में लगभग 5 मिलियन छोटी (5-30k) फाइलें हैं जो मैं उसी गिगाबिट नेटवर्क पर किसी अन्य मशीन में कॉपी करना चाहूंगा। मैंने rsync का उपयोग करने की कोशिश की, लेकिन यह चलने के कुछ घंटों के बाद एक क्रॉल तक धीमा हो जाएगा, मैं इस तथ्य के कारण मानता हूं कि rsync को हर बार स्रोत और गंतव्य फ़ाइल की जांच करनी है?

मेरा दूसरा विचार scp का उपयोग करना होगा, लेकिन यह देखने के लिए बाहर की राय लेना चाहता था कि क्या कोई बेहतर तरीका है। धन्यवाद!


अड़चन संभवत: प्राप्त पक्ष पर फाइलसिस्टम है। अधिकांश फाइल सिस्टम तेजी से समाप्त हो जाएंगे और एक ही निर्देशिका में आपके द्वारा डाली गई अधिक फाइलें धीमी हो जाएगी (यानी, हर बार rsync प्राप्तकर्ता पक्ष पर एक नई फ़ाइल जोड़ता है, स्थानांतरण के शेष भाग के लिए प्राप्त करने की ओर धीमा हो जाता है)। कई पुराने फाइल सिस्टम में 32K से अधिक फाइलें एक निर्देशिका में नहीं हो सकती हैं।
मिक्को रैंटलैनेन

जवाबों:


41

कुछ इस तरह से काम करना चाहिए:

tar c some/dir | gzip - |  ssh host2 tar xz

हो सकता है कि आप gzip और निष्कर्षण के लिए "z" ध्वज भी छोड़ दें, क्योंकि आप एक गीगाबिट नेटवर्क पर हैं।


क्या इसे gzip करना आवश्यक है, या ssh वैसे भी स्ट्रीम को संपीड़ित करता है? या करने के लिए बनाया जा सकता है?
थिलो

1
ssh स्ट्रीम को कंप्रेस करेगा यदि आप "-C" पास करते हैं। एक लेन पर मैं धारा को संपीड़ित करने से परेशान नहीं होता; इंटरनेट पर मैं शायद, जब तक यह पहले से ही संपीड़ित था।

6
व्यक्तिगत रूप से मैं पर gzip छोड़ देंगे: यहां तक ​​कि गीगाबिट ईथरनेट पर टोंटी को सीपीयू होने की संभावना नहीं है।
बेंजी XVI

6
@BenjiXVI अड़चन निश्चित रूप से सीपीयू gzipहोगी क्योंकि कभी भी केवल एक ही कोर पर निष्पादित होगा। आप 6 के डिफ़ॉल्ट संपीड़न स्तर के साथ लगभग 30 एमबी / एस की उम्मीद कर सकते हैं - लेकिन यह गीगाबिट ईथरनेट को अधिकतम नहीं करेगा।
पर्यायवाची- dj

2
pbzip2 का उपयोग करें? ...
अपाचे

19

मुझे यकीन है कि आपके पास एक ही डायरेक्टरी में सभी FIVE MILLION फाइलें हैं, जो कई टूल्स को एक चक्कर में डाल देंगी। मुझे आश्चर्य नहीं है कि rsync ने इसे इनायत से नहीं संभाला - यह काफी "अनोखी" स्थिति है। यदि आप फ़ाइलों को किसी प्रकार की निर्देशिका संरचना में संरचना करने का तरीका समझ सकते हैं, तो मुझे यकीन है कि मानक सिंक उपकरण जैसे कि rsync बहुत अधिक उत्तरदायी होगा।

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


6
शारीरिक रूप से ड्राइव करने के लिए +1, यह इस तरह से तेज़ है
रॉबर्ट गोल्ड

1
यह यकीन है कि एक जम्प ड्राइव पर सब कुछ कॉपी करता है और आगे और पीछे जाता है ...
VirtuosiMedia

@RobertGould चलो हमारे ट्रांसमिशन प्रोटोकॉल के रूप में IPoAC का उपयोग करें: "D
coolcat007

12

एक गीगाबिट स्विच (एक विश्वसनीय वातावरण में) पर लाखों फ़ाइलों की प्रतिलिपि बनाने के लिए आप उपयोगकर्ता के संयोजन का उपयोग कर सकते हैं netcat (or nc)और tar, जैसा कि पहले से ही user55286 द्वारा सुझाया गया है। यह सभी फाइलों को एक बड़ी फाइल के रूप में स्ट्रीम करेगा (देखें फास्ट फाइल कॉपी - लिनक्स! (39 जीबी) )।

# requires netcat on both servers
nc -l -p 2342 | tar -C /target/dir -xzf -   # destination box
tar -cz /source/dir | nc Target_Box 2342    # source box

इन दिनों IPv6 की कोशिश कर रहे अधिक से अधिक चीजों के साथ, आपको "पुरानी" IPv4 LAN पर काम करने के लिए दोनों छोर पर अपने nc कमांड के साथ -4 स्विच का भी उपयोग करना पड़ सकता है।
BeowulfNode42

5

हमारे पास एक निर्देशिका में लगभग 1 मिलियन फाइलें थीं (लगभग 4 साल की फाइलें)।

और हमने फाइल को YYYY / MM निर्देशिका में स्थानांतरित करने के लिए उपयोग किया (प्रति माह लगभग 35-45,000 फाइलें) .. हमने इस तरह से .bat फ़ाइल में robocopy स्क्रिप्ट लगाई:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02

संक्षिप्त नोट्स .. /ns /nc /nfl /npअतिरिक्त जानकारी के साथ लॉग फ़ाइल को फुलाने से बचने के लिए लॉग फ़ाइल में /log+...सारांश जानकारी लिखना है।

/minage and /maxage is to copy files modified with in that date range. 

इसलिए उदाहरण के लिए संशोधित फ़ाइलें> = 01 / Nov / 2008 (समावेशी) संशोधित फ़ाइलें <01 / Dec / 2008 (समावेशी नहीं)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11

/mov फ़ाइलों को स्थानांतरित करने के लिए

तब स्रोत निर्देशिका आता है

उसके बाद गंतव्य निर्देशिका (निर्देशिका जब और जब आवश्यक हो मक्खी पर बनाई जाएगी) आता है।

1 महीने के हस्तांतरण के लिए लगभग 40 - 60 मिनट का समय लगा (लगभग 35-45,000 फाइलें) हमें लगता है कि हस्तांतरण के 1 वर्ष के लिए लगभग 12 घंटे या उससे कम समय लगता है।

Windows Server 2003 का उपयोग करना।

लॉग फ़ाइल में सभी सामान लॉग किया गया है ... प्रारंभ समय, समाप्ति समय और फ़ाइलों की संख्या की प्रतिलिपि बनाई गई।

रोबोकॉपी ने दिन बचाया।


इन दिनों रोबोकॉपी में स्विच / एमटी [: n] डू के लिए बहु थ्रेडेड कॉपियों के साथ n थ्रेड्स (डिफ़ॉल्ट 8) समान प्रभाव को प्राप्त करने के लिए केवल डेट रेंज पर बेहतर और निर्भर नहीं है, और एक के बजाय एक कमांड लाइन के लिए अनुमति देता है प्रति धागा। हालाँकि Windows 2003 पर MT स्विच उपलब्ध नहीं है।
BeowulfNode42

4

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


4

मैं इस समय सबसे तेज़ संपीड़न उपकरण के रूप में lz4 का उपयोग करना पसंद करता हूं । SSH विकल्प -c arcfour128 डिफ़ॉल्ट से तेज एन्क्रिप्शन एल्गोरिथ्म का उपयोग करता है। [1]

इसलिए निर्देशिका स्थानांतरण कुछ इस तरह दिखता है:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'

कृपया ध्यान दें कि डेबियन lz4 कमांड पर lz4c है और CentOS पर यह lz4 है।


ssh एन्क्रिप्शन / डिक्रिप्शन या तो स्रोत या गंतव्य सीपीयू पर cpu उपयोग और लगभग सभी ssh कार्यान्वयन के एकल थ्रेडेड प्रकृति के कारण एक अड़चन हो सकता है। यह एक निजी गीगाबिट लैन है, इसलिए एन्क्रिप्ट करने की कोई आवश्यकता नहीं है।
बेवुल्फनोडे42

3

इस तरह की चीजों के लिए रोबोकॉपी बढ़िया है। यह नेटवर्क टाइमआउट के बाद फिर से कोशिश करेगा और यह आपको पाइप को स्वैप करने के लिए एक अंतर-पैकेट अंतराल सेट करने की भी अनुमति देता है।

[संपादित करें]

ध्यान दें कि यह एक Windows केवल अनुप्रयोग है।


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

3

मुझे पता है कि यह बेवकूफी भरा हो सकता है - लेकिन क्या आपने उन्हें बाहरी डिस्क पर कॉपी करके दूसरे सर्वर पर ले जाने के बारे में सोचा है? यह वास्तव में सबसे कुशल और सरल उपाय हो सकता है।


3

हम वर्तमान में इस समस्या की जांच कर रहे हैं। हमें लगभग 18 मिलियन छोटी फ़ाइलों को स्थानांतरित करने की आवश्यकता है - कुल 200GB। हमने सादे पुराने XCopy का उपयोग करके सर्वश्रेष्ठ प्रदर्शन हासिल किया, लेकिन अभी भी एक लंबा समय लगा। 1 सर्वर से दूसरे में लगभग 3 दिन, बाहरी ड्राइव पर लगभग 2 सप्ताह!

एक अन्य प्रक्रिया के माध्यम से, हमें सर्वर को डुप्लिकेट करने की आवश्यकता है। यह Acronis के साथ किया गया था। इसमें लगभग 3 घंटे लग गए !!!

हम इसकी कुछ और जांच करेंगे। उपरोक्त dd सुझाव शायद समान परिणाम प्रदान करेगा।


2

पहले से ही अच्छे सुझावों के टन, लेकिन परे तुलना में फेंकना चाहता था । मैंने हाल ही में एक सर्वर से दूसरे सर्वर पर 5KB और 20MB के बीच लगभग 750,000 फाइलें एक गीगाबिट स्विच में स्थानांतरित की हैं। यह भी हिचकी बिल्कुल नहीं था। दी गई कि इसमें कुछ समय लगा, लेकिन मैं उम्मीद करूंगा कि इतने डेटा के साथ।


1

मैं देखूंगा कि कैसे एक ज़िप-> कॉपी-> अनज़िप परफॉर्म करता है

या जो कुछ भी आपके पसंदीदा संपीड़न / संग्रह प्रणाली है।


हाँ उन्हें एक फ़ाइल में संपीड़ित करना भी एक अच्छा विचार होगा
रॉबर्ट गोल्ड

यहां तक ​​कि सिर्फ एक टारबॉल
जोएल कोएहॉर्न

1

कॉपी करने से पहले उन्हें एक सिंगल फाइल में पैक करें, फिर कॉपी होने के बाद उन्हें फिर से अनपैक करें।


1

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

टार दृष्टिकोण ने स्केप या rsync (YMMV) की तुलना में हस्तांतरण की दर लगभग दोगुनी कर दी।

यहाँ टार कमांड हैं। ध्यान दें कि आपको प्रत्येक मशीन के होम डाइरेक्टरी में .rhosts फाइलें बनाकर r- कमांड को सक्षम करने की आवश्यकता होगी (कॉपी पूरी होने के बाद इन्हें हटा दें - वे कुख्यात सुरक्षा समस्याएं हैं)। ध्यान दें कि, हमेशा की तरह, HP-UX अजीब है - जबकि बाकी दुनिया रिमोट-शेल कमांड के लिए 'rsh' का उपयोग करती है, HP-UX 'remsh' का उपयोग करता है। HP rl में 'rsh' कुछ प्रकार का प्रतिबंधित शेल है।

box1> cd source_directory; tar cf - . | remsh box2 "cd target_directory; tar xf - "

पहला टार कमांड '-' नामक एक फाइल बनाता है, जो इस मामले में एक विशेष टोकन अर्थ 'मानक आउटपुट' है। बनाए गए संग्रह में वर्तमान निर्देशिका (।) के साथ-साथ सभी उपनिर्देशिका (डिफ़ॉल्ट रूप से पुनरावर्ती है) में सभी फाइलें हैं। इस संग्रह फ़ाइल को remsh कमांड में पाइप किया गया है जो इसे बॉक्स 2 मशीन पर भेजता है। बॉक्स 2 पर मैं पहले उचित प्राप्त निर्देशिका में परिवर्तन करता हूं, फिर मैं आने वाली फाइलों को '-', या 'मानक इनपुट' से निकालता हूं।

नेटवर्क लिंक को डेटा से संतृप्त करने के लिए मेरे पास 6 टार कमांड एक साथ चल रहे थे, हालांकि मुझे संदेह है कि डिस्क का उपयोग सीमित कारक हो सकता है।


1

फाइलसिस्टम को बायपास करें।

क्या आप इस विभाजन को अनमाउंट करने में सक्षम हैं कि फाइलें इस पर रहती हैं, या इसे आसानी से माउंट करें? ऐसा करें, फिर कुछ इस तरह:

dd if=/dev/PARTITION | ssh username@host "dd of=diskimage.bin"

फिर आप diskimage.binगंतव्य स्थान पर लूपबैक डिवाइस के रूप में माउंट कर सकते हैं , और अपनी वास्तविक गंतव्य फ़ाइल सिस्टम में फ़ाइलों को कॉपी कर सकते हैं, या शायद गंतव्य के किनारे पर एक खाली विभाजन में इसे वापस सिलाई करने के लिए उचित साधनों का उपयोग करें (खतरनाक, लेकिन संभवतः संभव है , हालांकि मैंने ऐसा कभी नहीं किया है।)

यदि आप वास्तव में साहसी हैं, तो आप ddइसे सीधे गंतव्य की ओर एक विभाजन में वापस कर सकते हैं। मैं यह सलाह नहीं देता।


0

आप निम्नलिखित कोशिश कर सकते हैं (फाइलों के बैचों में हो सकता है)

  • फ़ाइलों का बैच टार
  • उन्हें जिप्पी दो
  • यदि संभव हो तो scp का उपयोग करके कॉपी करें
  • gunzip
  • फ़ाइलें खोलना

0

जैसा कि sth द्वारा सुझाया गया है आप ssh पर टार की कोशिश कर सकते हैं।

यदि आपको एन्क्रिप्शन की आवश्यकता नहीं है (मूल रूप से आपने rsync का उपयोग किया था, लेकिन यह उल्लेख नहीं किया था कि यह rsync + ssh था) तो आप ssh ओवरहेड से बचने के लिए netcat पर टार की कोशिश कर सकते हैं।

बेशक आप गज़िप या अन्य कम्प्रेशन मेथड का उपयोग करके भी लगने वाले समय को छोटा कर सकते हैं।


0

विचार करने के लिए कुछ और है। इसे इस्तेमाल करे:

  • एक VHD बनाएँ, गतिशील रूप से आकार
  • इसे संभवतः एक निर्देशिका के रूप में माउंट करें
  • 'संपूर्ण डिस्क को संपीड़ित करें' विशेषता सेट करें

ऐसा करने से, निर्देशिका पुनरावृत्ति या संपीड़न के लिए कोई ओवरहेड नहीं होता है, क्योंकि यह उस समय किया गया था जब फाइलें लिखी गई थीं। स्थानांतरित करने के लिए केवल एक फ़ाइल है - VHD।

विंडोज पर, मैं डिफ़ॉल्ट टीसीपी पैकेट आकार को 16348 की तरह बड़ा बनाता हूं। इसका मतलब है कि आईपी हेडर कम उपरि।

हालाँकि, एक चीज़ जो मैंने चलाई है, वह यह है कि नेटवर्क या USB ट्रांसफ़र के लिए फ़ाइल का आकार 100 एमबी से कम रखना सबसे अच्छा है। मैं उसके लिए Rar.exe का उपयोग करता हूं - फाइलों को विभाजित करने के लिए।

चंवर की तरह काम करता है। यह लिनक्स में 'dd' के समतुल्य है .. एक संपीड़ित फाइल सिस्टम को एक निर्देशिका में माउंट करने की अवधारणा लिनक्स के लिए भी सामान्य है, इसलिए एक ही तर्क लागू होता है। आप यह सुनिश्चित करना चाहते हैं कि ऑपरेशन शुरू होने से पहले सभी फाइलें बंद हो जाएं, अन्य तरीकों की तरह।

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

NTFS के रूप में स्वरूपित VHD एक फ़ोल्डर में लाखों फ़ाइलों को भी संभाल सकता है।

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