MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB रूबी ड्राइवर 2.5.x प्रतिकृति सेट पर होस्टनाम के साथ केस-संवेदनशीलता मुद्दे

MongoDB रूबी ड्राइवर को 2.5.x में अपग्रेड करने के बाद MongoDB प्रतिकृति सेट से कनेक्ट करने में समस्या आ रही है? हमने हाल ही में इस मुद्दे के बारे में नवीनतम MongoDB रूबी ड्राइवर संस्करण के साथ कुछ पूछताछ प्राप्त की है और इस पोस्ट को समस्या और कारण पर अपने निष्कर्षों को साझा करने के लिए लिखा है।

कनेक्शन के प्रयास में जो त्रुटि संदेश आया वह था -

No server is available matching preference: #<Mongo::ServerSelector::Primary:...>

समस्या की रिपोर्ट पहले ही MongoDB को कर दी गई थी और इसे यहां ट्रैक किया जा रहा है। हमने इस मुद्दे की जांच करने के लिए कुछ समय बिताया और मूल कारण को 2.5.x में ड्राइवर कोड में पेश किया।

MongoDB रूबी ड्राइवर 2.5.x अंक सारांश

समस्या MongoDB रूबी ड्राइवर के 2.5.x संस्करण (संस्करणों) में मौजूद है और इसका सामना तब होता है जब प्रतिकृति सेट वाले होस्टनाम में केस-संवेदी वर्ण होते हैं, उदाहरण के लिए, ABC-server1.example.com . संभावित समाधान हैं:

  1.  2.4.x पर डाउनग्रेड करें या उपलब्ध होने के बाद 2.6.x अपग्रेड करें।
  2. प्रतिकृति सेट के सभी सदस्यों के होस्टनाम को डाउनकेस में बदलें। उदाहरण के लिए, ऊपर दिए गए उदाहरण में होस्टनाम को abc-server1.example.com. में बदलें।

इस मुद्दे पर विवरण

रूबी पर विस्तृत लॉगिंग को सक्षम करने से यह पता चलता है कि क्या हो रहा था:

...
#19140] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'unknown'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
#19140] DEBUG -- : MONGODB | There was a change in the members of the 'replica set' topology.
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/server_selector/selectable.rb:119:in `select_server': No server is available matching preference: # using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/database.rb:157:in `command'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:404:in `list_databases'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:385:in `database_names'
...

यह स्पष्ट लग रहा था कि ड्राइवर प्रतिकृति सेट की प्राथमिक भूमिका का सही ढंग से पता लगाने में सक्षम नहीं था। 2.4.x के लॉग के साथ तुलना करने पर, यह स्पष्ट था कि यह उस संस्करण पर सही ढंग से हुआ करता था, यानी प्राथमिक को प्राथमिक के रूप में सही ढंग से पहचाना गया था।

] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'primary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.

दूसरा सुराग जो हमारे पास था वह यह था कि लॉग्स में हमारे सर्वर के नाम थोड़े बदले गए थे। वास्तविक नाम के बजाय SG -connectiontest1-2.servers.example.com , इसे sg . के रूप में लॉग किया जा रहा था -connectiontest1-2.servers.example.com

कनेक्शन इनिशियलाइज़ेशन के दौरान होस्टनाम को कैसे पार्स किया जाता है और उन्हें भूमिकाएँ सौंपी जाती हैं, इसके आसपास के कोड का निरीक्षण करने पर, हम यह निर्धारित करने में सक्षम थे कि ड्राइवर कोड डाउन-केसिंग था (यानी ABC. example.com से abc.example.com) कनेक्शन स्ट्रिंग को पार्स करते समय। इसके बाद, ड्राइवर isMaster कमांड का उपयोग करके टोपोलॉजी की खोज करने के लिए प्राथमिक से जुड़ता है। इस कमांड के परिणाम को पार्स करते समय, ड्राइवर प्रत्येक नोड की भूमिका निर्धारित करता है।

MongoDB रूबी ड्राइवर 2.5.x प्रतिकृति सेट पर होस्टनाम के साथ केस-संवेदनशीलता मुद्देट्वीट करने के लिए क्लिक करें

हालांकि, कनेक्शन स्ट्रिंग में कमांड से लौटाए गए होस्टनाम की तुलना करते समय, ड्राइवर केस-असंवेदनशील मिलान करने के लिए अनदेखा कर रहा था। इससे मोंगोडीबी द्वारा रिपोर्ट किए गए प्राथमिक के नामों में एक बेमेल हो गया, जो ड्राइवर ने कनेक्शन स्ट्रिंग से निर्धारित किया था। इससे प्राथमिक की भूमिका अज्ञात हो गई और कनेक्शन विफलता का कारण बना। रोल डिटेक्शन कोड में एड्रेस मैच चेक को 2.5.x में जोड़ा गया था।

समस्या का समाधान ड्राइवर के संस्करण 2.6.0 पर लक्षित किया गया है।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDb कोड 100 के साथ बंद हो जाता है

  2. सरणी में मैचों की संख्या द्वारा मोंगो क्रमबद्ध करें

  3. मैं कैसे जांचूं कि किसी अनुक्रमणिका का उपयोग किया जा रहा है या नहीं

  4. नेवला ऑटो वेतन वृद्धि

  5. आईडी सेट द्वारा कई दस्तावेज़ अपडेट करें। नेवला