Podman (Compose) के साथ MongoDB रेप्लिका सेट की चेतावनियाँ

लेखक
Damian
Terlecki
6 मिनट पढ़ें
डेटाबेस

आपको इंटरनेट पर MongoDB रेप्लिका सेट स्थापित करने के लिए काम कर रहे डॉकर/डॉकर-कंपोज कॉन्फ़िगरेशन आसानी से मिल सकते हैं। किसी तरह, जब मुझे पॉडमैन-कंपोज के साथ एक लिनक्स होस्ट मशीन से कनेक्शन सेट अप करने की आवश्यकता हुई तो कोई भी काम नहीं कर रहा था। समस्या को रेखांकित करने के लिए, मान लें कि, एक रेप्लिका सेट आमतौर पर --replSet और --bind_ip के साथ चल रहे mongod इंस्टेंस से कनेक्ट होने के बाद एक शेल के माध्यम से आरंभ किया जाता है (वैकल्पिक रूप से --port):

rs.initiate(
   {
      _id: "myReplSet",
      version: 1,
      members: [
         { _id: 0, host : "mongodb0.example.net:27017" },
         { _id: 1, host : "mongodb1.example.net:27017" },
         { _id: 2, host : "mongodb2.example.net:27017" }
      ]
   }
)

सभी पर शासन करने के लिए एक होस्टनाम

कॉन्फ़िगरेशन में परिभाषित होस्ट सदस्य प्रत्येक नोड और क्लाइंट पक्ष दोनों से सुलभ होने चाहिए। अक्सर, आप पाएंगे कि host.docker.internal का उपयोग mongodbN.example.net के स्थान पर किया जा रहा है। एक डिफ़ॉल्ट ब्रिज नेटवर्क में, इसे सेवा extra_hosts प्रॉपर्टी का उपयोग करके डॉकर नेटवर्क के host-gateway पर मैप किया जाता है। पॉडमैन का उपयोग करते समय, एक समतुल्य host.containers.internal है जो अतिरिक्त होस्ट को परिभाषित किए बिना काम करना चाहिए।

ध्यान दें: यदि आप एक 'invalid IP address in add-host: "host-gateway"' के साथ समाप्त होते हैं, तो हो सकता है कि आप लिनक्स पर डॉकर इंजन/पॉडमैन का पुराना संस्करण चला रहे हों। सबसे बुनियादी मामलों में, आप इसे 172.17.0.1 से स्वैप कर सकते हैं, लेकिन कई नेटवर्कों के साथ चलने पर यह भिन्न हो सकता है। बेहतर लेकिन अधिक जटिल समाधान खोजने के लिए इस SO थ्रेड की जाँच करें।

वैकल्पिक रूप से, आप सेवा नाम का उपयोग कर सकते हैं या कस्टम होस्टनाम के साथ आरएस सेट अप करने के लिए सेवा container_name और hostname को कॉन्फ़िगर कर सकते हैं।

पोर्ट बाइंडिंग

दूसरी चेतावनी पोर्ट कॉन्फ़िगरेशन है। एक एकल ब्रिज का मतलब है कि प्रत्येक नोड के लिए पोर्ट अलग-अलग होने चाहिए (उदाहरण के लिए, 27017, 27018, 27019) और सदस्यों की परिभाषा, mongod कॉन्फ़िगरेशन, और होस्ट पोर्ट बाइंडिंग से मेल खाने चाहिए।

बेमेल होने से हो सकता है:

  • क्लस्टर के क्लाइंट दृश्य से एक नोड को हटाना (नोड का कैनोनिकल पता सर्वर पते से मेल नहीं खाता है);
  • होस्ट मशीन से सभी नोड्स तक पहुँचने में समस्याएँ;
  • आरएस इनिशिएशन त्रुटियां रेप्लसेट कॉन्फिग में स्वयं को खोजने की कोशिश कर रही हैं।

UnknownHostException

तीसरी चेतावनी यह है कि host.docker.internal लिनक्स होस्ट पर गैर-समाधान योग्य है और इसके लिए /etc/hosts में एक प्रविष्टि जोड़ने की आवश्यकता है जो डिफ़ॉल्ट लूपबैक पते 127.0.0.1 पर मैप करती है। हालांकि, पॉडमैन के साथ, होस्ट /etc/hosts कंटेनरों के /etc/hosts में शामिल हैं, जिससे आरएस इनिशिएशन त्रुटियां होती हैं।

कंटेनर के '/etc/hosts' में मशीन होस्ट से डुप्लीकेट की गई 'host.docker.internal' एंट्री का स्क्रीनशॉट। '/etc/hosts' में डुप्लीकेट 'host.docker.internal' के कारण गलत आईपी पर हल होने पर प्रतिकृति त्रुटि का स्क्रीनशॉट।

--no-hosts विकल्प हाल ही में उपलब्ध कराया गया है (पॉडमैन 4.0), लेकिन यह host.containers.internal/host.docker.internal के साथ टकराव करता है। एक कामचलाऊ समाधान mongod स्टार्टअप से पहले कंटेनर के /etc/hosts को अपडेट करना है। हालांकि, नवीनतम (पॉडमैन 4.1) कॉन्फिग प्रॉपर्टी के माध्यम से भी इस व्यवहार को विश्व स्तर पर अक्षम करना बहुत बेहतर है $HOME/.config/containers/containers.conf में:

[containers]
base_hosts_file="none"

सारांश

यदि आपको विकास के लिए डॉकराइज़्ड MongoDB रेप्लिका सेट स्थापित करने में समस्या आती है, खासकर लिनक्स पर या पॉडमैन का उपयोग करते समय, तो निम्नलिखित की समीक्षा करें:

  • रेप्लिका सेट को होस्टनाम और पोर्ट संयोजनों के साथ कॉन्फ़िगर किया जाना चाहिए जो प्रत्येक नोड के साथ-साथ क्लाइंट (जैसे, होस्ट मशीन) से भी पहुँचा जा सकता है;
  • प्रत्येक नोड के लिए अलग-अलग पोर्ट का उपयोग करें ताकि आरएस दृश्य एक ब्रिज नेटवर्क पर पोर्ट बाइंडिंग से मेल खाए;
  • सदस्यों की होस्ट प्रॉपर्टी के लिए host.docker.internal (अतिरिक्त extra_hosts की आवश्यकता हो सकती है)/host.containers.internal (पॉडमैन) का उपयोग करें;
  • वैकल्पिक रूप से, यदि आपको कस्टम होस्टनाम के साथ एक आरएस सेट अप करने की आवश्यकता है तो सेवा container_name और hostname का उपयोग करें;
  • होस्ट मशीन पर अप्राप्य होस्टनाम त्रुटि के मामले में, होस्ट के /etc/hosts में आरएस होस्ट नाम जोड़ें;
  • पॉडमैन के लिए containers.conf फ़ाइल के माध्यम से होस्ट मशीन से /etc/hosts कॉपी को अक्षम करें;
  • लिनक्स पर अंतिम उपाय के रूप में, सेवा प्रॉपर्टी network_mode: host का उपयोग करें और स्थानीय होस्ट पर आरएस से कनेक्ट करें।