एक ही फाइललिस्ट का उपयोग करके कई स्थानों पर rsync?


22

मैं सोच रहा था कि क्या rsync के लिए एक निर्देशिका को एक ही बार में कई दूरस्थ गंतव्यों में कॉपी करना संभव है, या समानांतर में भी। (आवश्यक नहीं है, लेकिन उपयोगी होगा।)

आम तौर पर, निम्नलिखित की तरह कुछ ठीक काम करेगा:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

और अगर यह एकमात्र विकल्प है, तो मैं इसका उपयोग करूंगा। हालाँकि, / जंक काफी धीमी फाइलों के साथ एक धीमी गति से ड्राइव पर स्थित है, और वास्तविक ट्रांसफर / अपडेट की तुलना में हर बार कुछ ~ 12,000 फाइलों के फाइलिस्ट के पुनर्निर्माण में धीमी गति से (~ 5 मिनट) का पुनर्निर्माण होता है। क्या ऐसा कुछ करना संभव है, एक ही बात को पूरा करने के लिए:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

तलाश के लिए धन्यवाद!

जवाबों:


12

यहाँ बैच मोड के बारे में rsync के लिए मैन पेज से जानकारी दी गई है।

बैच मोड

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

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

किसी अन्य गंतव्य ट्री में रिकॉर्ड किए गए परिवर्तनों को लागू करने के लिए, रीड-बैच विकल्प के साथ rsync चलाएं, उसी बैच फ़ाइल का नाम और गंतव्य ट्री निर्दिष्ट करें। Rsync बैच फ़ाइल में संग्रहीत जानकारी का उपयोग करके गंतव्य ट्री को अपडेट करता है।

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

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

इन उदाहरणों में, rsync का उपयोग / adest / dir / from / source / dir / को अपडेट करने के लिए किया जाता है और इस ऑपरेशन को दोहराने की जानकारी "foo" और "foo.sh" में संग्रहीत होती है। होस्ट "रिमोट" को तब निर्देशिका / bdest / dir में जा रहे बैचेड डेटा के साथ अपडेट किया जाता है। दो उदाहरणों के बीच के अंतर से पता चलता है कि आप बैचों के साथ कैसे व्यवहार करते हैं:

  • पहला उदाहरण दिखाता है कि प्रारंभिक प्रतिलिपि स्थानीय नहीं है - आप दूरस्थ होस्ट-सिंटैक्स या rsync डेमॉन सिंटैक्स का उपयोग करके डेटा को दूरस्थ होस्ट से / पुश या खींच सकते हैं, जैसा कि वांछित है।

  • पहला उदाहरण दूरस्थ होस्ट पर रीड-बैच कमांड को चलाने के लिए सही rsync विकल्प प्राप्त करने के लिए बनाई गई "foo.sh" फ़ाइल का उपयोग करता है।

  • दूसरा उदाहरण बैच डेटा को मानक इनपुट के माध्यम से पढ़ता है ताकि बैच फ़ाइल को पहले दूरस्थ मशीन पर कॉपी करने की आवश्यकता न हो। यह उदाहरण foo.sh स्क्रिप्ट से बचता है क्योंकि इसे संशोधित-अप-बैच विकल्प का उपयोग करने की आवश्यकता थी, लेकिन आप स्क्रिप्ट फ़ाइल को संपादित कर सकते हैं यदि आप इसका उपयोग करना चाहते हैं (बस यह सुनिश्चित करें कि कोई अन्य विकल्प मानक का उपयोग करने की कोशिश नहीं कर रहा है इनपुट, जैसे "--exclude-from = -" विकल्प)।

    चेतावनियां:

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

    सभी गंतव्यों पर उपयोग किया जाने वाला rsync संस्करण कम से कम उतना ही नया होना चाहिए जितना कि बैच फ़ाइल उत्पन्न करने के लिए उपयोग किया जाता है। यदि बैच फ़ाइल में प्रोटोकॉल संस्करण बैच रीडिंग के लिए rsync को हैंडल करने के लिए बहुत नया है, तो रुपी रुख से त्रुटि हो जाएगी। एक तरह से rsync बनाने के लिए --protocol विकल्प को भी देखें एक बैच फ़ाइल उत्पन्न करता है जिसे एक पुराने rsync समझ सकता है। (ध्यान दें कि बैच फ़ाइलों ने 2.6.3 संस्करण में चटाई बदल दी है, इसलिए नए संस्करणों के साथ पुराने संस्करणों को मिलाने से काम नहीं चलेगा।)

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

    BATCH.sh फ़ाइल बनाने वाला कोड किसी भी फ़िल्टर को शामिल करता है / एक सूची में विकल्प शामिल / बाहर करता है जिसे शेल स्क्रिप्ट फ़ाइल में "यहाँ" दस्तावेज़ के रूप में जोड़ा जाता है। एक उन्नत उपयोगकर्ता इसे बाहर करने की सूची को संशोधित करने के लिए उपयोग कर सकता है, यदि - डिलीट द्वारा हटाए गए में कोई परिवर्तन वांछित है। एक सामान्य उपयोगकर्ता इस विवरण को अनदेखा कर सकता है और केवल शेल स्क्रिप्ट का उपयोग बैचेड डेटा के लिए उपयुक्त -्रेड-बैच कमांड को चलाने के लिए एक आसान तरीके के रूप में करता है।

    Rsync में मूल बैच मोड "rsync +" पर आधारित था, लेकिन नवीनतम संस्करण एक नए कार्यान्वयन का उपयोग करता है।

मुझे लगता है कि आप कोशिश कर सकते हैं

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

सुझाई गई कमांड काम नहीं करती है:remote destination is not allowed with --read-batch
kynan

पूरा कमांड दिखाओ। -फ़ाइल नाम के लिए मानक इनपुट से पढ़ने का मतलब है, और STDIN fooउदाहरण में, स्थानीय फ़ाइल से भी पढ़ा जा रहा है ।
क्लो

2
यह जो मैं करने की कोशिश कर रहा था, उसके लिए अधिकतम सही समाधान प्रतीत होता है, हालांकि इसके लिए मेरा उपयोग मामला लंबे समय से एथर में वाष्पित हो गया है। : D
Jessie

4

आप एकसमान प्रयोग करके देख सकते हैं । यह फ़ाइल सूची बनाने में बहुत तेज़ होना चाहिए क्योंकि यह फ़ाइलों का कैश रखता है।


2
नोट: यूनिसन फाइलों का 'कैश' नहीं रखता है। यह केवल फ़ाइल नाम, टाइमस्टैम्प, चेकसम का डेटाबेस रखता है। यह अभी भी फ़ाइल सिस्टम का स्कैन करता है और रिमोट से तुलना करने के लिए एक चेकसम बनाता है। यूनिसन का एकमात्र लाभ दो-तरफा सिंक है। मैं यूनिसन की सलाह देता हूं, लेकिन यह यहां मदद नहीं करेगा।
च्लोए

4

rsync --batch-modeमल्टीकास्ट का समर्थन करता है। यदि यह आपके नेटवर्क पर संभव है, तो यह देखने लायक हो सकता है।


2

कैसे बदल रही फाइल सिस्टम के बारे में?

कुछ समय पहले, मैंने एक बहु-टेराबाइट FS को एक्स 3 से एक्सएफएस में बदल दिया। निर्देशिकाओं को स्कैन करने का समय (पिछली बार जाँच की गई लगभग 600,000 फाइलों के साथ) 15-17 मिनट से 30 सेकंड तक कम हो गया!


1

प्रत्यक्ष उत्तर नहीं है, लेकिन यदि आप rsync संस्करण 3+ का उपयोग करते हैं, तो इससे पहले कि यह संपूर्ण फाइललिस्ट उत्पन्न करता है, स्थानांतरित करना शुरू कर देगा।

एक और विकल्प, अभी भी बहुत कुशल नहीं है, उन्हें नौकरी के रूप में चलाना होगा ताकि एक ही समय में कुछ दौड़ सकें।

इसके अलावा, मैं सिर्फ इस अकड़ के बारे में सोचा था कि क्या आप टार का उपयोग करने से बुरा नहीं मानते:

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

जहां प्रत्येक लोकलहोस्ट कोर्स का अलग सर्वर होगा (कुंजी-आधारित लॉगिन मानता है)। हालांकि इससे पहले कभी भी ऊपर का इस्तेमाल नहीं किया।


हम्म! अजीब तरह से, cwrsync (rsync 3.0.7) ऐसा नहीं लगता है। मुझे इस बात पर ध्यान देना होगा कि इन भारी भरकम हमलों को काटने में एक बड़ी मदद क्यों की जाएगी। धन्यवाद!
जेसी

दोनों तरफ वह संस्करण?
काइल ब्रान्ड

असल में नहीं; स्थानीय मशीन cwrsync 3.0.7 है और दूरस्थ होस्ट (अच्छी तरह से, मैं अब साथ काम कर रहा हूं) डेबियन लेन पर rsync 3.0.3 है। ऐसा लगता नहीं है कि यह दुर्व्यवहार करने के लिए बहुत बड़ा संस्करण अंतर होगा, लेकिन मुझे पता नहीं है .. मैं डेबियन पक्ष को अपग्रेड करने पर ध्यान दूंगा।
जेसी

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

"टार सीएफ -" नहीं है। के रूप में ही "टार सी।" ?
जोहान बोले

1

होस्ट 1, होस्ट 2 और होस्ट 3 से rsync नौकरियों को चलाने के बारे में कैसे? या, host1 पर कॉपी करने के लिए नौकरी चलाएं, और फिर इसे host2 से प्राप्त करने के लिए host2 और host3 पर चलाएं।


1

एक बेहतर समाधान जीआईटी के साथ एक रिपॉजिटरी का निर्माण होगा और सिर्फ 3 मेजबानों को आगे बढ़ाएगा। तेज़, आपको फ़ाइल सूची भाग की आवश्यकता नहीं होगी और यह कम संसाधनों की खपत करता है।

सौभाग्य,
जोओ मिगुएल नेव्स


10
git संशोधन समय को संरक्षित नहीं करता है और न ही अनुमतियाँ (निष्पादित बिट को छोड़कर) और डेटा की दूसरी प्रति संग्रहीत करने की आवश्यकता होगी क्योंकि इसमें git ऑब्जेक्ट्स को .git/फिर से दबाया जाता है जिसमें पहले से ही अधिकांश डेटा अधिक तेज़ होगा। gs rsync का प्रतिस्थापन नहीं है।
डेन डी।

इसके अलावा, गिट सार्वजनिक रूप से देखने योग्य है, जब तक आप भुगतान नहीं करते हैं।
च्लोए

8
@ चलो, तुम गलती GitHub के लिए। Git अपने आप में मुक्त ओपनसोर्स वितरित संस्करण नियंत्रण प्रणाली है, और कोई भी http, nfsऔर सहित किसी भी तरह से गिट रिपॉजिटरी की मेजबानी कर सकता है afp। GitHub एक वेबसाइट है जो आपके लिए git repos बनाने और बनाए रखने का ध्यान रखती है, और उन्हें सार्वजनिक करती है (जब तक कि आप भुगतान नहीं करते हैं)।
टॉरनिंगन

1
@ चालो गीथहब सार्वजनिक रूप से देखने योग्य है, लेकिन बिटबकेट निजी भंडार प्रदान करता है।
SWS

2
इसके अलावा, गिट खाली निर्देशिकाओं का ट्रैक नहीं रखता है।
फ्लि‍म

1

अपने आप को इस उत्तर की तलाश में, मुझे लगता है कि आपको पहले rsync का उपयोग करके एक बैच बनाने की आवश्यकता होगी और फिर उन सभी को भेजना होगा, जो इसे बनाएगा ताकि फ़ाइल सूची को केवल एक बार क्रंच करने की आवश्यकता हो, और फिर आप बस उन्हें समानांतर में चलाने के लिए सभी तीन rsyncs पृष्ठभूमि।


1

एक और संभावित समाधान सिर्फ समानांतर में कई rsync प्रक्रियाओं के रूप में चल रहा है, जैसे कि आपके पास मेजबान, फोर्क है।

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