दूरस्थ सर्वर के साथ 1 मिलियन फ़ाइलों को कुशलतापूर्वक सिंक्रनाइज़ करने के विकल्प?


27

जिस कंपनी में मैं काम करता हूं, वहां हमारे पास "प्लेलिस्ट" नाम की एक ऐसी चीज है, जो छोटी फाइलें हैं ~ 100-300 बाइट्स प्रत्येक। उनमें से लगभग एक लाख है। हर घंटे उनमें से लगभग 100,000 बदल जाते हैं। इन प्लेलिस्ट को हर घंटे अलग-अलग महाद्वीपों पर 10 अन्य दूरस्थ सर्वरों पर अपलोड करने की आवश्यकता होती है और इसे 2 मिनट से कम समय में आदर्श रूप से जल्दी होना चाहिए। यह बहुत महत्वपूर्ण है कि मास्टर पर डिलीट की गई फाइलें भी सभी प्रतिकृतियों पर डिलीट हो जाएं। वर्तमान में हम अपने बुनियादी ढांचे के लिए लिनक्स का उपयोग करते हैं।

मैं सामग्री की तुलना किए बिना पूरी फ़ाइलों को कॉपी करने के लिए -W विकल्प के साथ rsync की कोशिश करने के बारे में सोच रहा था। मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन शायद जिन लोगों के पास rsync का अधिक अनुभव है, वे मुझे बता सकते हैं कि क्या यह एक व्यवहार्य विकल्प है?

अन्य विकल्प क्या विचार करने योग्य हैं?

अद्यतन: मैंने उत्तर के रूप में lsyncd विकल्प चुना है, लेकिन केवल इसलिए कि यह सबसे लोकप्रिय था। अन्य सुझाए गए विकल्प भी अपने तरीके से मान्य हैं।


1
क्या आपके पास एक लॉग है जो दर्शाता है कि क्या फाइलें बदल दी गई हैं या हटा दी गई हैं?
ओलिवर

3
यदि केवल प्लेलिस्ट ही मैकल रिकॉर्ड होते थे। आप तब डेटाबेस प्रतिकृति का उपयोग कर सकते हैं और mysql को काम करने के लिए प्राप्त कर सकते हैं जिसे भेजने / प्राप्त करने की आवश्यकता है।
मैट

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

क्या आप चाहते हैं कि परिवर्तन केवल हर घंटे लागू हो? या तत्काल प्रतिकृति भी स्वीकार्य है?
फ़ेकर

1
एक लाख फाइलों के माध्यम से rsync को काम करने में लगने वाले समय को कम न समझें। बस इसे आज़माएं और आप देखेंगे कि आप क्या कर रहे हैं। यदि आपके पास वह लॉग है, तो उसका उपयोग करें या किसी अन्य प्रस्तावित समाधान का प्रयास करें।
ओलिवर

जवाबों:


39

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

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


फिर से एक शानदार टिप :)
Zilvinas

1
+1 यह अनिवार्य रूप से एक कैश सुसंगतता की समस्या है, एक मॉनिटर जो परिवर्तनों को आगे बढ़ाता है वह सबसे आसान समाधान है। lsyncdऔजार है कि ...
क्रिस एस

1
जैसा कि आपके विशिष्ट सर्वर OS पर लागू होता है, मैं उसकी जाँच lsyncdऔर inotifyगहराई से जाँच करूँगा । उपलब्ध घड़ियों की संख्या पर एक सीमा है। मेरा मानना ​​है कि डिफ़ॉल्ट आपके विशेष लिनक्स संस्करण के आधार पर लगभग 1500 या 8000 है। अधिकांश कर्नेल आपको सीमा बढ़ाने देते हैं, लेकिन 1 मिलियन फाइलों की निगरानी व्यावहारिक से अधिक हो सकती है। यह मेरे लिए 2008 में काम नहीं आया। इसके अलावा, घटना की कतार कतार से बाहर निकल सकती है, जिससे आप घटनाओं को कम कर सकते हैं, और आपको इससे उबरने का एक तरीका चाहिए। 2012 में एक सावधानी से lsyncdकिया गया कार्यान्वयन प्लस rsyncअब आपके अड्डों को कवर करने के लिए 2012 में काम कर सकता है।
ओल्ड प्रो

2
वास्तव में यह निर्देशिकाiontify पर व्यक्तिगत फ़ाइलों को नहीं करता है। आप कितनी निर्देशिका देख सकते हैं? जांचें (आमतौर पर 8192)। /proc/sys/fs/inotify/max_user_watches
faker

2
~ 50k निर्देशिका के साथ inotify काफी अच्छी तरह से पैमाने पर नहीं होगा। जब हमने 2009 में 100k निर्देशिकाओं के साथ एक समान दृष्टिकोण की कोशिश की, तो सभी निर्देशिकाओं की सदस्यता के लिए यह कर्नेल का रास्ता लंबा हो गया। @OldPro की तरह यह हमारे लिए काम नहीं करता था।
नववरवधू

11

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

इस विशेष उपयोग के मामले के लिए, कोई 10 प्रतिकृतियां (यानी 1 प्रतिकृति / ईंट प्रति सर्वर) के 10-सर्वर GlusterFS मात्रा का निर्माण कर सकता है, ताकि प्रत्येक प्रतिकृति वॉल्यूम में हर दूसरे प्रतिकृति का एक सटीक दर्पण हो। GlusterFS स्वचालित रूप से सभी प्रतिकृतियों के लिए फाइलसिस्टम अपडेट का प्रसार करेगा।

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


Glusterfs के लिए +1
टॉम ओ'कॉनर

8

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

संपादित करें: थोड़े से काम के साथ, आप मॉड्यूल्स के होते ही फाइलों को कॉपी करने के लिए इस inotify / log watch दृष्टिकोण का भी उपयोग कर सकते हैं।


5

कुछ और विकल्प:

  • RabbitMQ या Gearman में नौकरी सम्मिलित करें अतुल्य रूप से बंद करने के लिए और जब भी आप हटाते हैं या प्राथमिक सर्वर पर फ़ाइल जोड़ते हैं, तो सभी दूरस्थ सर्वरों पर एक ही फ़ाइल हटाएं (या जोड़ें)।
  • एक डेटाबेस में फ़ाइलों को स्टोर करें और दूरस्थ सर्वर को सिंक में रखने के लिए प्रतिकृति का उपयोग करें।
  • यदि आपके पास ZFS है तो आप ZFS प्रतिकृति का उपयोग कर सकते हैं
  • कुछ SAN में फ़ाइल प्रतिकृति है। मुझे नहीं पता कि यह इंटरनेट पर इस्तेमाल किया जा सकता है या नहीं।

4

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

MongoDB एक nosql डेटाबेस है और GridFS इसके ऊपर एक फ़ाइल स्टोरेज बिल्ड है। MongoDB में प्रतिकृति और तेज करने के लिए बहुत सारे विकल्प हैं , इसलिए यह आपके उपयोग के मामले में बहुत अच्छा होना चाहिए।

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


0

मैं एक S3 बैकएंड का उपयोग करता हूं और फिर बस उन सभी सर्वरों पर माउंट करता हूं जिनकी मुझे आवश्यकता है - इस तरह, हर कोई तुरंत सिंक में है


जबकि भंडारण सिंक्रनाइज़ हो जाएगा आपको एप्लिकेशन को सूचित करना होगा, इसलिए आप एक वर्ग में वापस आ जाएंगे, या ऐप को हर बार इन प्लेलिस्ट पर किसी को एक्सेस करने के लिए भंडारण को रोकना होगा। प्रदर्शन किसी भी मामले में भयानक होगा।
क्रिस एस

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

0

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

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

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