2011-06-23 23 views
14

मैं एक लोड संतुलित वातावरण में हमारे क्रॉन कार्यों को प्रबंधित करने के लिए बेहतर समाधान के लिए देख रहा हूँ।क्रॉन कार्य

वर्तमान में है:

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

के लिए खोज रहे:

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

समाधान को PHP में लागू करने की आवश्यकता नहीं है, लेकिन यह अच्छा होगा क्योंकि यह आवश्यक होने पर हमें आसानी से ट्विक करने की अनुमति देगा।

मैं दो परियोजनाओं कि promissing लग पाया है। GNUBatch और Job Scheduler। सबसे अधिक संभावना है कि दोनों परीक्षण करें लेकिन मुझे आश्चर्य है कि किसी के ऊपर उपरोक्त के लिए बेहतर समाधान है या नहीं।

धन्यवाद।

+0

एक-एक-एक समय पर क्रॉन नौकरी करके हल किया जा सकता है सबसे विश्वसनीय सर्वर (या कुछ अन्य सर्वर पूरी तरह से) वें में से एक पर वास्तविक नौकरी निष्पादित करें एसएसएच के माध्यम से यादृच्छिक रूप से ई सर्वर। चूंकि शेड्यूलिंग के लिए केवल एक मशीन ज़िम्मेदार है, इसलिए आपको सभी सर्वरों के बीच सिंक/लॉकिंग के बारे में चिंता करने की ज़रूरत नहीं है। –

उत्तर

5

कि आपको अस्थायी समय लॉक बनाने के लिए redis का उपयोग करता है यह छोटा सा पुस्तकालय का उपयोग कर सकते हैं:

https://github.com/AlexDisler/MutexLock

सर्वर समान होना चाहिए और एक ही क्रॉन विन्यास है। वह सर्वर जो लॉक बनाने वाला पहला होगा, कार्य को निष्पादित करेगा। अन्य सर्वर लॉक और बाहर निकलने के बिना बाहर निकलेंगे।

उदाहरण के लिए

, php फ़ाइल है कि निर्धारित कार्य निष्पादित करता है में:

MutexLock\Lock::init([ 
    'host' => $redisHost, 
    'port' => $redisPort 
]); 

// check if a lock was already created, 
// if it was, it means that another server is already executing this task 
if (!MutexLock\Lock::set($lockKeyName, $lockTimeInSeconds)) { 
    return; 
} 

// if no lock was created, execute the scheduled task 
scheduledTaskThatRunsOnlyOnce(); 

एक de-केंद्रीकृत तरीके से कार्य चलाने के लिए और लोड वितरित करने के लिए पर एक नज़र डालें: https://github.com/chrisboulton/php-resque यह एक php बंदरगाह है रेस्क्यू के रूबी संस्करण का और यह डेटा को उसी सटीक प्रारूप में संग्रहीत करता है ताकि आप श्रमिकों की निगरानी के लिए https://github.com/resque/resque-web या http://resqueboard.kamisama.me/ का उपयोग कर सकें और रिपोर्ट देख सकें

3

मान लें कि आप एक डेटाबेस उन 3 सर्वरों में से एक पर होस्ट नहीं उपलब्ध है;

एक "आवरण" स्क्रिप्ट कि क्रॉन में चला जाता है, और कार्यक्रम आप अपने तर्क के रूप में चला रहे हैं लेता है लिखो। यह पहली चीज है जो रिमोट डेटाबेस से कनेक्ट होती है, और जांच करें कि आखिरी बार एक टेबल में एक प्रविष्टि डाली गई थी (इस रैपर के लिए बनाई गई)। यदि अंतिम सम्मिलन समय चलाने के बाद से बड़ा होता है, तो वर्तमान समय के साथ तालिका में एक नया रिकॉर्ड डालें, और रैपर के तर्क (आपके क्रॉन जॉब) को निष्पादित करें।

प्रत्येक सर्वर पर रैपर को क्रोन करें, प्रत्येक सेट एक्स के पीछे एक्स मिनट (सर्वर ए घंटे के शीर्ष पर चलता है, सर्वर बी 5 मिनट, सी 10 मिनट, आदि पर चलता है)।

पहला सर्वर हमेशा क्रॉन को पहले निष्पादित करेगा, इसलिए अन्य दो सर्वर कभी नहीं करेंगे। यदि पहला सर्वर नीचे चला जाता है, तो दूसरा सर्वर देखेगा कि यह नहीं चला है, और इसे चलाएगा।

यदि आप उस तालिका में भी रिकॉर्ड करते हैं जो सर्वर पर काम करता है, तो आपके पास यह होगा कि स्क्रिप्ट को कब/कहाँ निष्पादित किया गया था।

+0

धन्यवाद कोरी। हमें पहले से ही कुछ समाधान मिल रहे हैं। हालांकि यह वास्तव में हमारे मानदंडों को पूरा नहीं करता है और शुद्ध क्रॉन की तुलना में एकमात्र लाभ दूसरे या तीसरे सर्वर पर फॉलबैक होता है यदि पहला व्यक्ति नीचे जाता है। सवाल यह लिखने के बारे में इतना नहीं था कि यह कैसे लिखना है, बल्कि वहां पहले से ही एक परीक्षण किया गया परिपक्व समाधान है या नहीं। – poisson

+0

मैं अब क्या कर रहा हूं इसके बारे में उत्सुक हूं? –

+0

हम केवल वर्तमान में अनुभाग में वर्णित मैंने जो कुछ भी बताया है उसका उपयोग करते हैं। यह क्रॉन आवश्यक कार्यों को सीधे पहले बॉक्स पर ट्रिगर कर रहा है। – poisson

0

क्या यह संदेश/कार्य कतार का उपयोग करने के लिए आदर्श स्थिति नहीं होगी?

संबंधित मुद्दे