उस फ़ाइल के साथ rsync का व्यवहार जो अभी भी लिखा जा रहा है?


13

यदि अपाचे एक बड़ी फ़ाइल लिखने के बीच में है और एक rsync क्रोन जॉब उस फ़ाइल पर चलती है, तो क्या rsync फ़ाइल को कॉपी करने का प्रयास करता है?

उदाहरण

  • अपाचे -1: फ़ाइल बड़ी लिखी जा रही है /var/www
  • अपाचे -2: अपाचे -1 का क्लोन। हर पाँच मिनट में क्रोन रन rsync को /var/wwwसिंक किया जाता है।

जवाबों:


21

यदि अपाचे किसी जगह पर किसी तरह की एक फाइल लिख रहा है और उसने लिखना पूरा नहीं किया है और फिर उसमें rsyncकिक करता है, तोrsync जो कुछ भी वहां बैठा है उसे कॉपी करेगा।

मतलब अगर अपाचे 5MB फ़ाइल के साथ काम कर रहा है, तो केवल 2MB लिखा है और इसमें rsyncकिक करता है, आंशिक 2MB फ़ाइल की प्रतिलिपि बनाई जाएगी। तो ऐसा लगता है कि फ़ाइल गंतव्य सर्वर पर "दूषित" है।

आपके द्वारा उपयोग की जा रही फ़ाइलों के आकार के आधार पर, आप निम्न करने के लिए --inplaceविकल्प का उपयोग कर सकते हैं rsync:

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

इसका लाभ यह है कि यदि 5MB फ़ाइल में पहले रन पर केवल 2MB कॉपी है, तो अगला रन 2MB पर आएगा और फ़ाइल की प्रतिलिपि तब तक जारी रहेगी जब तक कि पूर्ण 5MB नहीं हो जाता।

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

यह कहा कि आप यह राज्य करते हैं; जोर मेरा है:

हर पांच मिनट में क्रोन रन rsync है ...

तो मुझे लगता है कि आपके पास इस क्रॉन जॉब को प्रबंधित करने के लिए कुछ बैश स्क्रिप्ट है? खैर, यह बात बहुत rsyncही स्मार्ट है कि केवल उन फ़ाइलों को कॉपी करें जिन्हें कॉपी करने की आवश्यकता है। और अगर आपके पास एक स्क्रिप्ट है जो हर 5 मिनट में चलती है तो ऐसा प्रतीत होता है कि आप rsyncतेजी से आगे बढ़ने पर एक दूसरे पर कदम रखने से बचने की कोशिश कर रहे हैं । मतलब, यदि आप इसे हर मिनट चलाते हैं, तो एक जोखिम है कि एक या अधिक rsyncप्रक्रियाएं अभी भी फ़ाइल आकार या नेटवर्क की गति के कारण चल रही हैं और अगली प्रक्रिया बस इसके साथ प्रतिस्पर्धा में होगी; एक रेसिंग हालत।

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

ध्यान दें कि कुछ लोग उपयोग करने की सलाह देंगे, flockलेकिन चूंकि flockमैं उपयोग किए जाने वाले कुछ सिस्टम पर स्थापित नहीं हूं - और मैं उबंटू (जो इसके पास है) और मैक ओएस एक्स (जो नहीं करता है) के बीच कूदता है - मैं बिना किसी वास्तविक मुद्दे के इस सरल ढांचे का उपयोग करता हूं:

LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'

if mkdir ${LOCK_DIR} 2>/dev/null; then
  # If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
  echo $$ > ${PID_FILE}

  echo "Hello world!"

  rm -rf ${LOCK_DIR}
  exit
else
  if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
    # Confirm that the process file exists & a process
    # with that PID is truly running.
    echo "Running [PID "$(cat ${PID_FILE})"]" >&2
    exit
  else
    # If the process is not running, yet there is a PID file--like in the case
    # of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
    rm -rf ${LOCK_DIR}
    exit
  fi
fi

विचार यह है कि सामान्य कोर-जहां मेरे पास है-जहां echo "Hello world!"आपकी स्क्रिप्ट का दिल है। बाकी यह मूल रूप से एक लॉकिंग तंत्र / तर्क पर आधारित है mkdirइस उत्तर में अवधारणा की एक अच्छी व्याख्या है :

mkdir एक निर्देशिका बनाता है यदि यह अभी तक मौजूद नहीं है, और यदि ऐसा होता है, तो यह एक निकास कोड सेट करता है। इससे भी महत्वपूर्ण बात, यह एक एकल परमाणु क्रिया में यह सब करता है जिससे यह इस परिदृश्य के लिए एकदम सही है।

तो आपकी rsyncप्रक्रिया के मामले में , मैं केवल इस echoकमांड का उपयोग करके कमांड को आपकी rsyncकमांड में बदलने की सलाह दूंगा। इसके अलावा, LOCK_NAMEकुछ को बदलें RSYNC_PROCESSऔर फिर आप जाने के लिए अच्छे हैं।

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


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

@Louis आपका स्वागत है! इसके अलावा, यदि आप फ़ोल्डर को तत्काल फ़ाइल परिवर्तनों के आधार पर सिंक में रखना चाहते हैं, तो मैं अत्यधिक उपयोग / अदला-बदली करने की सलाह दूंगा lsyncd। यह आपको "हॉट फ़ोल्डर्स" की अनुमति देता है जो वास्तव में उनमें गतिविधि पर ध्यान देते हैं और फिर उन फ़ाइलों पर कार्य करते हैं जब परिवर्तन किए जाते हैं। मैं rsyncअपने उत्तर में उल्लिखित एक बहुत का उपयोग करता हूं, लेकिन मैं उन lsyncdमामलों के लिए उपयोग करता हूं जिनके लिए गैर-क्रोन / अधिक तत्काल रूप की कार्रवाई की आवश्यकता होती है।
जेकगोल्ड

3

हाँ - और फ़ाइल दूषित हो सकती है यदि rsync फ़ाइल को उसी समय पढ़ रहा हो, जिस पर फ़ाइल लिखी जा रही है।

आप इसे आज़मा सकते हैं: /unix//a/2558

आप इसे lsof से भी लिख सकते हैं:

lsof /path/to file

0 से बाहर निकलने का कोड का मतलब है कि फ़ाइल उपयोग में है, और 1 से बाहर निकलें कोड का मतलब है कि उस फ़ाइल पर कोई गतिविधि नहीं है।


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