मोंगोडीबी एसएसएल को नोड.जेएस में स्व-हस्ताक्षरित प्रमाणपत्रों से जोड़ने पर हमारी पोस्ट की लोकप्रियता को देखते हुए, हमने रूबी के साथ मोंगोडीबी को जोड़ने पर एक ट्यूटोरियल लिखने का फैसला किया। इस ब्लॉग में, हम आपको दिखाएंगे कि रूबी मोंगोडीबी ड्राइवर और लोकप्रिय ऑब्जेक्ट-डॉक्यूमेंट-मैपर (ओडीएम) मोंगोइड दोनों का उपयोग करके एसएसएल के लिए स्व-हस्ताक्षरित प्रमाणपत्रों के साथ कॉन्फ़िगर किए गए मोंगोडीबी सर्वर से कैसे कनेक्ट किया जाए।
ScaleGrid वर्तमान में नए क्लस्टर के लिए नोड बनाते समय SSL के लिए स्व-हस्ताक्षरित प्रमाणपत्रों का उपयोग करता है। इसके अतिरिक्त, हम आपको अपने स्वयं के SSL प्रमाणपत्र खरीदने और उन्हें MongoDB सर्वर पर कॉन्फ़िगर करने का विकल्प भी प्रदान करते हैं, और आप इस ऑफ़र के बारे में अधिक जानने के लिए [email protected] पर ईमेल कर सकते हैं।
Ruby MongoDB Driver का उपयोग करके रेप्लिका सेट से कनेक्ट करना
हम इस उदाहरण के लिए नवीनतम स्थिर Ruby MongoDB ड्राइवर संस्करण 2.8 का उपयोग करेंगे। ड्राइवर के 2.5.x संस्करणों में एक ज्ञात बग है जो उन्हें स्केलग्रिड परिनियोजन के साथ कार्य करने से रोकता है। नीचे दिए गए दोनों उदाहरणों में इस्तेमाल किया गया रूबी संस्करण 2.6.3 है।
ड्राइवर के लिए उपलब्ध कनेक्शन विकल्प यहां प्रलेखित हैं, और हमें जिन विकल्पों की आवश्यकता होगी वे हैं:
- :ssl
- :ssl_verify
- :ssl_ca_cert ।
सबसे पहले, स्केलग्रिड कंसोल पर क्लस्टर विवरण पृष्ठ से अपनी MongoDB कनेक्शन स्ट्रिंग ढूंढें और कॉपी करें:
CA प्रमाणपत्र फ़ाइल क्लस्टर विवरण पृष्ठ से डाउनलोड के लिए भी उपलब्ध है। एप्लिकेशन के लिए उपलब्ध स्थान पर प्रमाणपत्र फ़ाइल को डाउनलोड और संग्रहीत करें:
यहां एक स्निपेट दिया गया है जिसमें दिखाया गया है कि रूबी से एक MongoDB प्रतिकृति सेट से कैसे कनेक्ट किया जाए:
require 'mongo'Mongo::Logger.logger.level =::Logger::DEBUGMONGODB_CA_CERT ="/path/to/ca_cert.pem"MONGODB_CONN_URL ="mongodb://testuser:@SG-example- 17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet=RS-example-0&ssl=true" विकल्प ={ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT}client =Mongo::Client.new(MONGODB_CONN_URL, options)db =client.databasecollections =db.collection_namesputs "db #{db.name} में संग्रह हैं # {संग्रह}"client.close
उदाहरण को सरल रखने के लिए, हमने सीधे कोड स्निपेट में कनेक्शन स्ट्रिंग और प्रमाणपत्र फ़ाइल पथ निर्दिष्ट किया है - आप आम तौर पर उन्हें या तो एक yaml फ़ाइल में डालेंगे या उन्हें इस रूप में निर्दिष्ट करेंगे पर्यावरण चर। साथ ही, उदाहरण लॉग स्तर को DEBUG
. पर सेट करता है ताकि किसी भी कनेक्टिविटी मुद्दे को डीबग किया जा सके। एक बार कनेक्टिविटी मुद्दों को हल कर लेने के बाद इसे कम वर्बोज़ स्तर में बदल दिया जाना चाहिए।
एसएसएलक्लिक टू ट्वीट के साथ मोंगोडीबी को रूबी एप्लिकेशन से कैसे कनेक्ट करें
Mongoid का उपयोग करके कनेक्ट करना
मोंगोइड संस्करण जिसका हम अपने उदाहरण में उपयोग करेंगे, वह नवीनतम स्थिर संस्करण है - 7.0.2। हम मोंगोइड को कॉन्फ़िगरेशन प्रदान करने के लिए एक yaml फ़ाइल का उपयोग करेंगे, और ऐसी कॉन्फ़िग फ़ाइल का विवरण यहाँ प्रलेखित है। एसएसएल-विशिष्ट कॉन्फ़िगरेशन विकल्प जिन्हें हमें अपने प्रतिकृति सेट से कनेक्ट करने की आवश्यकता होगी वे हैं:
- एसएसएल
- ssl_verify
- ssl_ca_cert
हमारी yml फ़ाइल:
विकास:# उपलब्ध डेटाबेस क्लाइंट को कॉन्फ़िगर करें। (आवश्यक) क्लाइंट:# डिफ़ॉल्ट क्लाइंट को परिभाषित करें। (आवश्यक) डिफ़ॉल्ट:# क्लाइंट के लिए एक यूरी परिभाषित किया जा सकता है:# यूरी:'mongodb://user:[email protected]:27017/my_db' # विवरण के लिए कृपया ड्राइवर दस्तावेज़ देखें। वैकल्पिक रूप से, आप निम्नलिखित को परिभाषित कर सकते हैं:# # डिफ़ॉल्ट डेटाबेस का नाम परिभाषित करें जिससे Mongoid कनेक्ट हो सकता है। # (आवश्यक)। डेटाबेस:परीक्षण # उन मेजबानों को प्रदान करें जिनसे डिफ़ॉल्ट क्लाइंट कनेक्ट हो सकता है। होस्ट की एक सरणी # होनी चाहिए:पोर्ट जोड़े। (आवश्यक) होस्ट:- SG-example-17026.servers.mongodirector.com:27017 - SG-example-17027.servers.mongodirector.com:27017 - SG-example-17028.servers.mongodirector.com:47100 विकल्प:# प्रमाणीकरण के लिए उपयोगकर्ता का नाम। उपयोगकर्ता:'परीक्षक' # प्रमाणीकरण के लिए उपयोगकर्ता का पासवर्ड। पासवर्ड:'pwd' # उपयोगकर्ता की डेटाबेस भूमिकाएँ। भूमिकाएँ:- 'रीडराइट' # डिफ़ॉल्ट प्रमाणीकरण तंत्र बदलें। मान्य विकल्प हैं::scram, # :mongodb_cr, :mongodb_x509, और :plain। (3.0 पर डिफ़ॉल्ट है:स्क्रैम, 2.4 पर डिफ़ॉल्ट # और 2.6 है:सादा) auth_mech::scram # उपयोगकर्ता को प्रमाणित करने के लिए डेटाबेस या स्रोत। (डिफ़ॉल्ट:व्यवस्थापक) auth_source:परीक्षण # ड्राइवर को ऑटो- # डिस्कवरी के बजाय एक विशिष्ट तरीके से कनेक्ट करने के लिए बाध्य करें। इनमें से एक हो सकता है::प्रत्यक्ष, :प्रतिकृति_सेट, :शार्डेड। प्रतिकृति सेट के छिपे हुए सदस्यों से कनेक्ट करते समय :प्रत्यक्ष # पर सेट करें। कनेक्ट करें::replica_set ... ... # से कनेक्ट करने के लिए सेट की गई प्रतिकृति का नाम। बीज के रूप में प्रदान किए गए सर्वर जो # इस प्रतिकृति सेट से संबंधित नहीं हैं, उन पर ध्यान नहीं दिया जाएगा। प्रतिकृति_सेट:RS-example-0 # एसएसएल के माध्यम से सर्वर से जुड़ना है या नहीं। (डिफ़ॉल्ट:गलत) ssl:true # पीयर सर्टिफिकेशन वेलिडेशन करना है या नहीं। (डिफ़ॉल्ट:सत्य) ssl_verify:true # कनेक्शन के दूसरे छोर से पारित प्रमाणपत्रों को मान्य करने के लिए उपयोग की जाने वाली फ़ाइल में समेकित प्रमाणन प्राधिकरण प्रमाणपत्रों का एक सेट होता है। ssl_ca_cert:/path/to/ca_cert.pem # Mongoid विशिष्ट विकल्पों को कॉन्फ़िगर करें। (वैकल्पिक) विकल्प:# मोंगोइड और रूबी ड्राइवर लॉग स्तर सेट करें। (डिफ़ॉल्ट::जानकारी) log_level::debug
कनेक्शन उदाहरण:
gem 'mongoid', '7.0.2'require 'mongoid'Mongoid.load!("/path/to/mongoid.yml", :Development)# किसी भी ओडीएम फीचर का इस्तेमाल नहीं कर रहे हैं - बस अंतर्निहित मोंगो को लाएं क्लाइंट और कनेक्ट करने का प्रयास =Mongoid::Clients.defaultdb =client.databasecollections =db.collection_namesputs "db #{db.name} में #{Collections}"Mongoid::Clients.disconnectसंग्रह हैं।
फिर से, रूबी ऑन रेल्स अनुप्रयोगों के उत्पादन में, yaml फ़ाइल पथ को पर्यावरण चर से उठाया जाएगा।
विफलता व्यवहार का परीक्षण करना
अन्य MongoDB ड्राइवरों की तरह, Ruby MongoDB ड्राइवर भी विफलता जैसी घटनाओं के कारण टोपोलॉजी में परिवर्तनों को आंतरिक रूप से पहचानने के लिए डिज़ाइन किया गया है। हालांकि, उत्पादन में आश्चर्य से बचने के लिए विफलता के दौरान ड्राइवर के व्यवहार का परीक्षण और सत्यापन करना अच्छा है।
MongoDB PyMongo पर मेरी पिछली पोस्ट की तरह, हम ड्राइवर के फेलओवर व्यवहार का निरीक्षण करने के लिए एक सतत लेखक परीक्षण कार्यक्रम लिख सकते हैं।
असफलता को प्रेरित करने का सबसे आसान तरीका rs.stepDown() कमांड चलाना है:
RS-example-0:PRIMARY> rs.stepDown()2019-04-18T19:44:42.257+0530 E QUERY [thread1] त्रुटि:क्वेरी करने में त्रुटि:विफल:कमांड 'replSetStepDown' चलाने का प्रयास करते समय नेटवर्क त्रुटि होस्ट पर 'SG-example-1.servers.mongodirector.com:27017' :DB.prototype.runCommand@src/mongo/shell/db.js:168:1DB.prototype.adminCommand@src/mongo/shell/db. js:185:1rs.stepDown@src/mongo/shell/utils.js:1305:12@(shell):1:12019-04-18T19:44:42.261+0530 मैं नेटवर्क [thread1] SG-example से पुन:कनेक्ट करने का प्रयास कर रहा हूं -1.servers.mongodirector.com:27017 (X.X.X.X) विफल2019-04-18T19:44:43.267+0530 I नेटवर्क [thread1] SG-example-1.servers.mongodirector.com:27017 (X.X.X.X) को फिर से कनेक्ट करें okRS-example- 0:माध्यमिक>
यहां हमारे परीक्षण कोड के प्रासंगिक भाग दिए गए हैं:
'mongo' की आवश्यकता है... लकड़हारा =लकड़हारा. SG-example-17026.servers.mongodirector.com:27017,SG-example-17027.servers.mongodirector.com:27017,SG-example-17028.servers.mongodirector.com:27017/test?replicaSet=RS-example- 0&ssl=true"options ={ssl:true, ssl_verify:true, :ssl_ca_cert => MONGODB_CA_CERT} start logger.info("कनेक्ट करने का प्रयास...") क्लाइंट =Mongo::Client.new(MONGODB_CONN_URL, options) i =0 लूप do db =client.database collection =db[:test] start doc ={"idx":i, "date":DateTime.now, "text":SecureRandom.base64(3)} result =collection.insert_one( doc) logger.info ("रिकॉर्ड डाला गया - आईडी:# {result.inserted_id}") i + =1 स्लीप (3) रेस्क्यू Mongo::Error => e logger.error ("मोंग एरर देखा गया:#{e.message }") logger.error(e.backtrace) logger.i nfo ("पुन:प्रयास कर रहा है ...") अंत अंत logger.info ("हो गया") बचाव => त्रुटि लकड़हारा। त्रुटि ("अपवाद देखा गया:#{err.message}") logger.error(err.backtrace)ग्राहक सुनिश्चित करें। बंद करें जब तक कि client.nil?end
यह लगातार परीक्षण डेटाबेस पर परीक्षण संग्रह में इस तरह की प्रविष्टियां लिखता है:
RS-test-0:PRIMARY> db.test.find(){ "_id" :ObjectId("5cf50ff1896cd172a4f7c6ee"), "idx" :0, "date" :ISODate("2019-06-03T12:17 :53.008Z"), "text" :"HTvd" }{ "_id" :ObjectId("5cf50ff6896cd172a4f7c6ef"), "idx" :1, "date" :ISODate("2019-06-03T12:17:58.697Z" ), "पाठ" :"/e5Z" }{ "_id" :ObjectId("5cf50ff9896cd172a4f7c6f0"), "idx" :2, "date" :ISODate("2019-06-03T12:18:01.940Z"), " text" :"quuw" }{ "_id" :ObjectId("5cf50ffd896cd172a4f7c6f1"), "idx" :3, "date" :ISODate("2019-06-03T12:18:05.194Z"), "text" :" gTyY" }{ "_id" :ObjectId("5cf51000896cd172a4f7c6f2"), "idx" :4, "date" :ISODate("2019-06-03T12:18:08.442Z"), "text" :"VDXX" }{ "_id" :ObjectId("5cf51003896cd172a4f7c6f3"), "idx" :5, "date" :ISODate("2019-06-03T12:18:11.691Z"), "text" :"UY87" }...
आइए एक विफलता के दौरान व्यवहार देखें:
I, [2019-06-03T17:53:25.079829 #9464] जानकारी -- :कनेक्ट करने का प्रयास...I, [2019-06-03T17:53:30.577099 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf5113f896cd124f8f31062I, [2019-06-03T17:53:33.816528 # 9464] जानकारी -:रिकॉर्ड डाला गया - आईडी:5cf51145896cd124f8f31063I, [2019-06-03T17:53:37.047043 #9464] जानकारी - रिकॉर्ड:5cf51148896cd124f8f31064I, [2019-06-03T17:53:40.281537 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf5114c896cd124f8f31065I, [2019-06-03T17:53:43.520010 #9464] 31066I, 5c 5114f8cd [2019-06-03T17:53:46.747080 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf51152896cd124f8f31067I, [2019-06-03T17:53:49.978077 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf51155896cd124<8f31068 <<8f31068 यहां विफलता शुरू हुईई, [2019-06-03टी17:53:52.980434 #9464] त्रुटि -- :मोंग त्रुटि देखी गई:EOFError:फ़ाइल का अंत पहुंच गया (x.x.x.x:27017 के लिए (sg-example-17026.servers.mongodirector.com:27017) , टीएलएस))ई, [2019-06-03टी17:53:52.980533 #9464] त्रुटि -- :["सी:/रूबी 26-x64/lib/ruby/gems/2.6.0/gems/mongo-2.8.0/lib/mongo/socket.rb:300:in `rescue in handle_errors'", "C:/Ruby26-x64/lib/ ruby/gems/2.6.0/gems/mongo-2.8.0/lib/mongo/socket.rb:294:in `handle_errors'", "C:/Ruby26-x64/lib/ruby/gems/2.6.0/ James/mongo-2.8.0/lib/mongo/socket.rb:126:in `read'", "C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/mongo-2.8.0/ lib/mongo/protocol/message.rb:139:in `deserialize'",......I, [2019-06-03T17:53:52.980688 #9464] जानकारी -- :पुन:प्रयास...डब्ल्यू, [ 2019-06-03T17:53:52.981575 # 9464] चेतावनी -:sg-example-17026.servers.mongodirector.com:27017 पर ismaster का पुन:प्रयास करने के कारण:Mongo::Error::SocketError EOFError:फ़ाइल का अंत (के लिए) x.x.x.x:27017 (sg-example-17026.servers.mongodirector.com:27017, TLS))I, [2019-06-03T17:54:06.293100 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf51163896cd124f8f3106aI, [2019- 06-03T17:54:09.547716 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf51169896cd124f8f3106bI, [2019-06-03T17:54:12.806636 #9464] जानकारी -- :रिकॉर्ड डाला गया - आईडी:5cf5116c896cd124f8f3106c पुन>यह स्पष्ट है कि यदि सही त्रुटियां पकड़ी जाती हैं और पढ़ने/लिखने का पुन:प्रयास किया जाता है, तो ड्राइवर स्वचालित रूप से टोपोलॉजी परिवर्तन का पता लगा लेगा और नए मास्टर से फिर से जुड़ जाएगा। लिखने के लिए, विकल्प :retry_writes सुनिश्चित करें कि त्रुटि के आवेदन को सूचित करने से पहले ड्राइवर स्वयं एक बार पुनः प्रयास करेगा।
ऐसे कई ड्राइवर टाइमआउट भी हैं जिन्हें आपके सेटअप पर दिखाई देने वाले सटीक व्यवहार और विलंबता के आधार पर ट्वीक किया जा सकता है। ये यहां प्रलेखित हैं।
समस्या निवारण
यदि आपको अपने SSL-सक्षम MongoDB परिनियोजन से कनेक्ट करने में समस्या हो रही है, तो डिबगिंग के लिए यहां कुछ युक्तियां दी गई हैं:
- पहले, सत्यापित करें कि आप वास्तव में उस सर्वर से MongoDB सर्वर से कनेक्ट हो सकते हैं जहां आपका एप्लिकेशन चल रहा है। ऐसा करने का सबसे सरल तरीका क्लाइंट मशीन पर मोंगो शेल स्थापित करना है। लिनक्स पर, आपको संपूर्ण MongoDB सर्वर स्थापित करने की आवश्यकता नहीं होगी - आप केवल शेल को अलग से स्थापित करना चुन सकते हैं। एक बार शेल उपलब्ध हो जाने पर, सर्वर से कनेक्ट करने का प्रयास करने के लिए हमारे द्वारा प्रदान किए गए 'कमांड लाइन सिंटैक्स' का उपयोग करने का प्रयास करें।
- यदि आप मोंगो शेल के माध्यम से कनेक्ट करने में असमर्थ हैं, तो इसका मतलब है कि क्लाइंट मशीन MongoDB सर्वर के पोर्ट 27017 तक पहुंचने में असमर्थ है। क्लाइंट और सर्वर मशीनों के बीच कनेक्टिविटी सुनिश्चित करने के लिए अपने सुरक्षा समूह, वीपीसी और स्केलग्रिड फ़ायरवॉल सेटिंग्स को देखें।
- यदि नेटवर्क कनेक्टिविटी सही है, तो जांच करने के लिए अगली बात यह है कि आप रूबी, मोंगोइड और मोंगो रत्न के संस्करणों का उपयोग कर रहे हैं जो संस्करण के साथ संगत हैं आपके MongoDB सर्वर का।
- यदि आपने पुष्टि की है कि ड्राइवर संस्करण सही हैं, तो रूबी स्क्रिप्ट का एक नमूना चलाने का प्रयास करें, जैसा कि हमने ऊपर दिए गए उदाहरण के समान IRB पर किया है। चरण-दर-चरण निष्पादन इंगित कर सकता है कि समस्या कहाँ है।
- यदि परीक्षण स्क्रिप्ट ठीक चलती है, लेकिन आप अभी भी मोंगोइड से कनेक्ट करने में असमर्थ हैं, तो एक साधारण परीक्षण स्क्रिप्ट चलाने का प्रयास करें, जैसा कि हमने ऊपर दिया उदाहरण ।
- यदि आपको अभी भी अपने इंस्टेंस से कनेक्ट करने में समस्या हो रही है, तो कृपया हमें [email protected] पर उपरोक्त समस्या निवारण चरणों के विस्तृत परिणामों के साथ लिखें और साथ में आपके द्वारा उपयोग किए जा रहे रूबी, मोंगोइड और मोंगो ड्राइवर के सटीक संस्करण। Gemfile.lock आपको सटीक संस्करण प्रदान करेगा।
यदि आप स्केलग्रिड में नए हैं और इस ट्यूटोरियल को आज़माना चाहते हैं, तो प्लेटफ़ॉर्म को एक्सप्लोर करने और परीक्षण करने के लिए 30-दिन के निःशुल्क परीक्षण के लिए साइन अप करें। MongoDB को अपने रूबी एप्लिकेशन से कनेक्ट करना।