2012-10-10 22 views
12

में प्रतिलिपि सेट के खिलाफ रन स्क्रिप्ट मेरे पास 3 नोड्स का प्रतिकृति सेट है और मैं दिन के हर छोर के खिलाफ एक क्लीनअप स्क्रिप्ट चलाने के लिए चाहता हूं। मैं अगर वहाँ केवल एक नोड होता था एक सरल बैश स्क्रिप्ट हो क्या करना होगा:मोंगोडीबी

~/mongo/bin/mongo host:port cleanupScript.js 

लेकिन चूंकि मैं के खिलाफ एक ही स्क्रिप्ट चलाना चाहते प्रतिकृति सेट मैं इस दृष्टिकोण का उपयोग नहीं कर सकते। मुझे किसी भी तरह से पता होना चाहिए कि कौन सा नोड प्राथमिक है और उस नोड के खिलाफ स्क्रिप्ट चलाएं।

तो प्रश्न: क्या कोई तरीका है कि पूरे प्रतिकृति सेट के खिलाफ स्क्रिप्ट को कैसे चलाया जाए और mongo प्रक्रिया को प्राथमिक नोड चुनें और उस पर निष्पादित करें?

धन्यवाद!

+0

मुझे ऐसा करने के किसी भी तरीके से अवगत नहीं है, लेकिन यह मोंगो जावास्क्रिप्ट खोल के लिए 10gen के लिए एक शानदार विशेषता सुझाव है। जावा ड्राइवर, कम से कम, आपको मेजबान को संग्रह के रूप में प्रतिलिपि में निर्दिष्ट करने देता है: http://api.mongodb.org/java/2.9.0/com/mongodb/Mongo.html Mongo (java.util.List seed , com.mongodb.MongoOptions विकल्प)। अकेले इस सुविधा के लिए मैंने अपने रखरखाव कार्यों के लिए जावास्क्रिप्ट खोल पर छोड़ दिया है और जावा ड्राइवर के साथ ग्रोवी के माध्यम से इसे स्क्रिप्ट किया है। –

+0

खोल पहले से ही 2.0 शाखा के रूप में पहले से ही इसका समर्थन करता है। –

उत्तर

13

मोंगो खोल सीधे प्रतिकृति सेट से कनेक्ट हो सकता है - यह 2.4 (वर्तमान), 2.2 (पिछला) और 2.0 (इससे पहले संस्करण) के साथ काम करता है।

मान लिया जाये कि आप myrs एक प्रतिकृति सेट कहा जाता है और अपने मेजबान host1 हैं: 27017, आदि निम्न सिंटैक्स का उपयोग:

mongo -host myrs/host1:27017

खोल शेष का पता लगा, प्राथमिक से कनेक्ट होने सहित जाएगा और यदि प्राथमिक कदम नीचे या चला जाता है तो यह चुने जाने के बाद नए प्राथमिक से जुड़ जाएगा।

+1

कोशिश करेंगे! (+1 सोफर :) –

+0

धन्यवाद @ asya-kamsky - IHMO यह इस प्रश्न का सबसे अच्छा जवाब है। यह एक लाइनर मेरे लिए किसी भी मेजबान, प्राथमिक या माध्यमिक से काम करता है ... 'mongo -host myReplicaset/myServer1 myDb --eval "db.myCollection.remove ({})" –

+0

धन्यवाद। यह प्रतिलिपि सेट के पूर्ण टोपोलॉजी को जानने के लिए सर्वर के नामों का उपयोग बीज के रूप में करता है, यही कारण है कि आप इसे एक प्रतिकृति सेट में कोई नोड दे सकते हैं जो ऊपर और प्रतिक्रिया दे रहा है। –

3

मैं सामान्य रूप से प्रतिलिपि में नोड के लिए प्राथमिकता निर्धारित करता हूं। यह मुझे यह चुनने की स्वतंत्रता देता है कि कौन सा नोड पढ़ना चाहिए और लोड लिखना चाहिए।

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

प्राथमिकता सेट करना काफी सरल और सीधे आगे है। आप इस लिंक को देख सकते हैं http://docs.mongodb.org/manual/tutorial/force-member-to-be-primary/

मुझे आशा है कि इससे आपकी समस्या हल हो जाएगी।

ठीक है .... शायद यह है कि तुम क्या जरूरत है ..

#!/bin/bash 

PRIMARY=`~/mongo/bin/mongo localhost:27017 --eval "printjson(rs.isMaster())" | grep "primary" | cut -d"\"" -f4` 

echo "$PRIMARY" 

~/mongo/bin/mongo "$PRIMARY" cleanupScript.js 

किसी भी नोड पर चलाएँ इस और यह आपको दे देंगे: प्राथमिक की "सर्वर पोर्ट"। मोंगो निष्पादन योग्य के लिए पूरा रास्ता दें .. केवल त्रुटियों से बचने के लिए।

पीएस: पूरा आदेश बैकटिक्स में है। किसी भी तरह वे आपको बताने के बारे में सोचा नहीं है।

+1

हां, मुझे प्राथमिकताओं के बारे में पता है। समस्या यह है: "लगभग" हर समय। अगर उच्चतम प्राथमिकता वाला नोड मर जाता है तो क्या होगा? मुझे स्क्रिप्ट चलाने के लिए 100% विश्वसनीय तरीका चाहिए ताकि मैं प्राथमिकताओं पर भरोसा न कर सकूं। –

+0

हां, मैं शायद आउटपुट को पार्सिंग और प्राथमिक से कनेक्ट कर दूंगा, धन्यवाद +1 –

+0

पूरी तरह से काम करता है। मैंने थोड़ा संशोधित किया क्योंकि मुझे बस पोर्ट नंबर की आवश्यकता थी: पोर्ट ' – rgubby

3

दुर्भाग्यवश, 'मोंगो' खोल एक प्रतिकृति सेट से कनेक्शन बनाने का समर्थन नहीं करता है: केवल व्यक्तिगत नोड्स के लिए। यदि आप ऐसा करना चाहते हैं तो आपके पास दो विकल्प हैं:

  • एक अलग भाषा का उपयोग करें, जो प्रतिकृति सेट से कनेक्शन बनाने का समर्थन करता है। (PHP, पायथन, पर्ल, जावा और रूबी सभी इसका समर्थन करते हैं।)
  • एक ड्राइवर स्क्रिप्ट है जो 'rs.status()' कमांड चलाती है, उस कमांड के आउटपुट को पार करती है, और वर्तमान प्राथमिक निर्धारित करती है। यदि यह नोड नहीं है जिसे आपने कनेक्ट किया है, तो सही प्राथमिक नोड

मेरी इच्छा है कि मेरे पास आपके लिए बेहतर जवाब हो।

+0

हाँ, मैंने सोचा कि शुद्ध खोल अच्छा समाधान होगा लेकिन चूंकि यह इसका समर्थन नहीं करता है ... सुझावों के लिए धन्यवाद +1 –

+0

मैं जावा ड्राइवर के माध्यम से चल रहा था ... साफ समाधान प्रतीत होता है। अगर मैंने rs.status को पार्स किया है() अभी भी पार्स के बाद प्राथमिक हो रही है और स्क्रिप्ट चलाने से पहले गैर-0 संभावना है :) –

+1

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