Podman (Compose) के साथ MongoDB रेप्लिका सेट की चेतावनियाँ
आपको इंटरनेट पर 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
में शामिल हैं,
जिससे आरएस इनिशिएशन त्रुटियां होती हैं।


--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
का उपयोग करें और स्थानीय होस्ट पर आरएस से कनेक्ट करें।