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

MongoDB में डेटा माइग्रेट कैसे करें

इस पोस्ट का लक्ष्य MongoDB में डेटा माइग्रेशन के विभिन्न तरीकों के बारे में जानना है जो हमें स्क्रिप्ट लिखने में मदद कर सकते हैं जो नए दस्तावेज़ जोड़कर, मौजूदा दस्तावेज़ों को संशोधित करके आपके डेटाबेस को बदलते हैं।

अगर आप पहली बार यहां आ रहे हैं, तो कृपया प्रीक्वल सेल्फ-होस्टेड मोंगोडीबी पर एक नज़र डालें।

ठीक है, फिर जहां से हमने छोड़ा था, वहां से चुनते हुए, आइए MongoDB में डेटा माइग्रेशन के साथ शुरुआत करें।

अब, डेटा को एक MongoDB से दूसरे में माइग्रेट करने के मूल चरण होंगे:

  1. मौजूदा डेटा का ज़िप्ड बैकअप बनाएं
  2. डेटा को एक नए DB में डंप करें

जब स्रोत डेटाबेस ऑनलाइन नहीं होता है तो यह बहुत सीधा होता है क्योंकि हम जानते हैं कि माइग्रेशन प्रक्रिया के दौरान कोई नया दस्तावेज़ नहीं बनाया/अपडेट किया जाएगा। लाइव परिदृश्य में गोता लगाने से पहले आइए पहले सरल माइग्रेशन देखें।

MongoDB में एक ऑफ़लाइन डेटाबेस से माइग्रेट करना

बैकअप बनाना

हम डेटाबेस बैकअप बनाने के लिए एक मौजूदा उपयोगिता प्रोग्राम mongodump का उपयोग करने जा रहे हैं।

इस कमांड को सोर्स डेटाबेस सर्वर में रन करें

mongodump --host="hostname:port" \
  --username="username" --password="password" \
  --authenticationDatabase "admin" \
  --db="db name" --collection="collection name" --query='json' \
  --forceTableScan -v --gzip --out ./dump

--host :स्रोत MongoDB होस्टनाम पोर्ट के साथ। यह डिफ़ॉल्ट रूप से localhost:27017 . है . यदि यह एक कनेक्शन स्ट्रिंग है तो आप इस विकल्प का उपयोग कर सकते हैं —-uri="mongodb://username:password@host1[:port1]..."

--username :प्रमाणीकरण का उपयोग करने वाले MongoDB डेटाबेस को प्रमाणित करने के लिए एक उपयोगकर्ता नाम निर्दिष्ट करता है।

--password :प्रमाणीकरण का उपयोग करने वाले MongoDB डेटाबेस को प्रमाणित करने के लिए पासवर्ड निर्दिष्ट करता है।

--authenticationDatabase :प्रमाणीकरण डेटाबेस को निर्दिष्ट करता है जहां निर्दिष्ट --username . है बनाया गया है।

<ब्लॉकक्वॉट>

यदि आप निर्यात करने के लिए प्रमाणीकरण डेटाबेस या डेटाबेस निर्दिष्ट नहीं करते हैं, तो mongodump मानता है कि व्यवस्थापक डेटाबेस उपयोगकर्ता के क्रेडेंशियल रखता है।

--db :बैकअप लेने के लिए डेटाबेस को निर्दिष्ट करता है। यदि आप एक डेटाबेस निर्दिष्ट नहीं करते हैं, तो mongodump इस उदाहरण में सभी डेटाबेस से एकत्र करता है।

<ब्लॉकक्वॉट>

वैकल्पिक रूप से, आप डेटाबेस को सीधे यूआरआई कनेक्शन स्ट्रिंग में भी निर्दिष्ट कर सकते हैं अर्थात mongodb://username:password@uri/dbname .
--db . का उपयोग करते हुए एक कनेक्शन स्ट्रिंग प्रदान करना और परस्पर विरोधी जानकारी निर्दिष्ट करने से एक त्रुटि होगी

--collection :बैकअप के लिए संग्रह निर्दिष्ट करता है। यदि आप कोई संग्रह निर्दिष्ट नहीं करते हैं, तो यह विकल्प निर्दिष्ट डेटाबेस या उदाहरण में सभी संग्रह को डंप फ़ाइलों में कॉपी करता है।

--query :एक JSON दस्तावेज़ को एक क्वेरी के रूप में प्रदान करता है जो वैकल्पिक रूप से mongodump के आउटपुट में शामिल दस्तावेज़ों को सीमित करता है।
आपको क्वेरी दस्तावेज़ को सिंगल कोट्स में संलग्न करना होगा ('{ ... }') यह सुनिश्चित करने के लिए कि यह आपके पर्यावरण के साथ इंटरैक्ट नहीं करता है।
क्वेरी विस्तारित JSON v2 प्रारूप (या तो आराम से या विहित/सख्त मोड) में होनी चाहिए, जिसमें फ़ील्ड नामों और ऑपरेटरों को उद्धरणों में संलग्न करना शामिल है। '{ "created_at": { "\$gte": ISODate(...) } }'

<ब्लॉकक्वॉट>

--query का उपयोग करने के लिए विकल्प, आपको --collection . भी निर्दिष्ट करना होगा विकल्प।

--forceTableScan :mongodump को डेटा स्टोर को सीधे स्कैन करने के लिए बाध्य करता है। आम तौर पर, mongodump प्रविष्टियों को सहेजता है क्योंकि वे _id . की अनुक्रमणिका में दिखाई देते हैं खेत।

<ब्लॉकक्वॉट>

यदि आप कोई क्वेरी निर्दिष्ट करते हैं --query , mongodump उस क्वेरी का समर्थन करने के लिए सबसे उपयुक्त अनुक्रमणिका का उपयोग करेगा।
इसलिए , आप --forceTableScan . का उपयोग नहीं कर सकते --query . के साथ विकल्प

--gzip :आउटपुट को कंप्रेस करता है। यदि mongodump डंप निर्देशिका में आउटपुट करता है, तो नई सुविधा अलग-अलग फ़ाइलों को संपीड़ित करती है। फाइलों में प्रत्यय है .gz

--out :उस निर्देशिका को निर्दिष्ट करता है जहां mongodump BSON write लिखेगा डंप किए गए डेटाबेस के लिए फ़ाइलें। डिफ़ॉल्ट रूप से, mongodump आउटपुट फ़ाइलों को वर्तमान कार्यशील निर्देशिका में डंप नामक निर्देशिका में सहेजता है।

बैकअप बहाल करना

हम mongorestore . नामक एक उपयोगिता कार्यक्रम का उपयोग करेंगे डेटाबेस बैकअप को पुनर्स्थापित करने के लिए।

बैकअप निर्देशिका डंप को नए डेटाबेस इंस्टेंस में कॉपी करें और निम्न कमांड चलाएँ:

mongorestore --uri="mongodb://user:password@host:port/?authSource=admin" \
  --drop --noIndexRestore --gzip -v ./dump

क्रेडेंशियल्स को नए डेटाबेस क्रेडेंशियल्स से बदलें। पिछले चरण में अनलाइन करें, --authenticationDatabase विकल्प यूआरआई स्ट्रिंग में निर्दिष्ट है।

साथ ही, --gzip . का उपयोग करें यदि बैकअप बनाते समय उपयोग किया जाता है।

--drop :डंप किए गए बैकअप से संग्रह को पुनर्स्थापित करने से पहले, संग्रह को लक्ष्य डेटाबेस से छोड़ देता है। यह उन संग्रहों को नहीं छोड़ता जो बैकअप में नहीं हैं।--noIndexRestore :mongorestore को संबंधित mongodump आउटपुट में निर्दिष्ट के अनुसार अनुक्रमणिका को पुनर्स्थापित करने और बनाने से रोकता है।

<ब्लॉकक्वॉट>

यदि आप पुनर्स्थापित करते समय डेटाबेस का नाम बदलना चाहते हैं, तो आप
--nsFrom="old_name.*" --nsTo="new_name.*" का उपयोग करके ऐसा कर सकते हैं। विकल्प।

हालांकि, अगर आप oplogs के साथ माइग्रेट करते हैं तो यह काम नहीं करेगा जो एक ऑनलाइन इंस्टेंस से माइग्रेशन में एक आवश्यकता है।

MongoDB में एक ऑनलाइन डेटाबेस से माइग्रेट करना

ऑनलाइन डेटाबेस से माइग्रेट करने की एकमात्र चुनौती माइग्रेशन के दौरान अपडेट को रोकने में सक्षम नहीं है। तो यहां चरणों का अवलोकन दिया गया है,

  1. प्रारंभिक बल्क माइग्रेशन oplogs के साथ चलाएं कैप्चर करें
  2. डेटाबेस कनेक्शन स्विच विलंबता को कम करने के लिए एक समन्वयन कार्य चलाएं
<ब्लॉकक्वॉट>

अब, oplogs capture को कैप्चर करने के लिए , एक प्रतिकृति सेट को स्रोत और गंतव्य डेटाबेस में प्रारंभ किया जाना चाहिए। ऐसा इसलिए है क्योंकि oplogs local.oplog.rs . से कैप्चर किए गए हैं नाम स्थान, जो एक प्रतिकृति सेट को प्रारंभ करने के बाद बनाया गया है।

प्रतिकृति सेट को कॉन्फ़िगर करने के लिए आप इस मार्गदर्शिका का अनुसरण कर सकते हैं।

ओप्लॉग कैप्चर के साथ आरंभिक माइग्रेशन

Oplogs, सरल शब्दों में, डेटाबेस में प्रति ऑपरेशन बनाए गए ऑपरेशन लॉग हैं। वे आंशिक दस्तावेज़ स्थिति या दूसरे शब्दों में, डेटाबेस स्थिति का प्रतिनिधित्व करते हैं। इसलिए हम इन oplogs . का उपयोग करके माइग्रेशन प्रक्रिया के दौरान अपने पुराने डेटाबेस में किसी भी अपडेट को कैप्चर करने जा रहे हैं ।

निम्नलिखित विकल्पों के साथ मोंगोडम्प प्रोग्राम चलाएँ,

mongodump --uri=".../?authSource=admin" \
  --forceTableScan --oplog \
  --gzip -v --out ./dump

--oplog :oplog.bson . नाम की एक फाइल बनाता है mongodump के भाग के रूप में आउटपुट oplog.bson आउटपुट निर्देशिका के शीर्ष स्तर पर स्थित फ़ाइल में oplog . होता है मोंगोडम्प ऑपरेशन के दौरान होने वाली प्रविष्टियाँ। यह फ़ाइल हमारे डेटाबेस इंस्टेंस की स्थिति का एक प्रभावी पॉइंट-इन-टाइम स्नैपशॉट प्रदान करती है।

oplog replay के साथ डेटा को पुनर्स्थापित करें

ओप्लॉग को फिर से चलाने के लिए, एक विशेष भूमिका की आवश्यकता होती है। आइए माइग्रेशन के लिए उपयोग किए जा रहे डेटाबेस उपयोगकर्ता को भूमिका बनाएं और असाइन करें।

भूमिका बनाएं

db.createRole({
  role: "interalUseOnlyOplogRestore",
  privileges: [
    {
      resource: { anyResource: true },
      actions: [ "anyAction" ] 
    }
  ],
  roles: []
})

भूमिका असाइन करें

db.grantRolesToUser(
  "admin",
  [{ role:"interalUseOnlyOplogRestore", db:"admin" }]
);

अब आप निम्न विकल्पों के साथ mongorestore प्रोग्राम का उपयोग करके पुनर्स्थापित कर सकते हैं,

mongorestore --uri="mongodb://admin:.../?authSource=admin" \
  --oplogReplay 
  --gzip -v ./dump

उपरोक्त कमांड में, उसी उपयोगकर्ता का उपयोग करते हुए admin जिनके साथ भूमिका जुड़ी हुई थी।

--oplogReplay :डेटाबेस डंप को पुनर्स्थापित करने के बाद, एक bson फ़ाइल से oplog प्रविष्टियों को फिर से चलाता है और डेटाबेस को mongodump --oplog के साथ कैप्चर किए गए पॉइंट-इन-टाइम बैकअप में पुनर्स्थापित करता है। आदेश।

डेटाबेस कनेक्शन स्विच विलंबता को कम करना

ठीक है, अब तक हम अधिकांश भारी भारोत्तोलन के साथ कर चुके हैं। हमारे एप्लिकेशन सर्वर में कनेक्शन स्विच के दौरान डेटाबेस के बीच निरंतरता बनाए रखना केवल एक चीज है।

<ब्लॉकक्वॉट>

यदि आप मोंगोडीबी संस्करण 3.6+ चला रहे हैं, तो चेंज स्ट्रीम दृष्टिकोण के लिए जाना बेहतर है, जो आपके डेटाबेस में परिवर्तनों को अनुकूलित तरीके से कैप्चर करने के लिए पेश किया गया एक ईवेंट-आधारित तंत्र है। यहाँ एक लेख है जो इसे कवर करता है https://www.mongodb.com/blog/post/an-introduction-to-change-streams

सामान्य सिंक स्क्रिप्ट देखें, जिसे आप हर मिनट CRON जॉब के रूप में चला सकते हैं।

इस स्क्रिप्ट में वेरिएबल को अपडेट करें और इस रूप में चलाएं

$ ./delta-sync.sh from_epoch_in_milliseconds

# from_epoch_in_milliseconds is automatically picked with every iteration if not supplied

या आप इसे हर मिनट चलाने के लिए क्रॉन जॉब सेट कर सकते हैं।

* * * * * ~/delta-sync.sh

आउटपुट को निम्न कमांड के साथ मॉनिटर किया जा सकता है (मैं आरएचईएल 8 चला रहा हूं, क्रॉन आउटपुट के लिए अपने ओएस गाइड को देखें)

$ tail -f /var/log/cron | grep CRON

यह एक नमूना सिंक लॉग है।

CMD (~/cron/dsync.sh)
CMDOUT (INFO: Updated log registry to use new timestamp on next run.)
CMDOUT (INFO: Created sync directory: /home/ec2-user/cron/dump/2020-11-03T19:01:01Z)
CMDOUT (Fetching oplog in range [2020-11-03T19:00:01Z - 2020-11-03T19:01:01Z])
CMDOUT (2020-11-03T19:01:02.319+0000#011dumping up to 1 collections in parallel)
CMDOUT (2020-11-03T19:01:02.334+0000#011writing local.oplog.rs to /home/ec2-user/cron/dump/2020-11-03T19:01:01Z/local/oplog.rs.bson.gz)
CMDOUT (2020-11-03T19:01:04.943+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011done dumping local.oplog.rs (0 documents))
CMDOUT (INFO: Dump success!)
CMDOUT (INFO: Replaying oplogs...)
CMDOUT (2020-11-03T19:01:05.030+0000#011using write concern: &{majority false 0})
CMDOUT (2020-11-03T19:01:05.054+0000#011will listen for SIGTERM, SIGINT, and SIGKILL)
CMDOUT (2020-11-03T19:01:05.055+0000#011connected to node type: standalone)
CMDOUT (2020-11-03T19:01:05.055+0000#011mongorestore target is a directory, not a file)
CMDOUT (2020-11-03T19:01:05.055+0000#011preparing collections to restore from)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection local.oplog.rs bson to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection metadata from local.oplog.rs to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011restoring up to 4 collections in parallel)
CMDOUT (2020-11-03T19:01:05.055+0000#011replaying oplog)
CMDOUT (2020-11-03T19:01:05.055+0000#011applied 0 oplog entries)
CMDOUT (2020-11-03T19:01:05.055+0000#0110 document(s) restored successfully. 0 document(s) failed to restore.)
CMDOUT (INFO: Restore success!)

आप इस स्क्रिप्ट को यह सत्यापित करने के बाद रोक सकते हैं कि कोई और oplogs नहीं है बनाए जा रहे हैं, यानी, जब स्रोत डीबी ऑफ़लाइन हो गया।

यह पूर्ण स्व-होस्ट किए गए MongoDB डेटा माइग्रेशन गाइड का समापन करता है। यदि आप MongoDB के बारे में अधिक जानना चाहते हैं, तो यहां एक उपयोगी संसाधन है कि कैसे GoLang में डेटा स्रोत के रूप में MongoDB का उपयोग किया जाए।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB सभी संग्रहों से सभी सामग्री दिखाएं

  2. नेवले के साथ स्कीमा में फ़ील्ड जोड़ें नहीं

  3. सभी मेजबानों को मोंगोडब में एक प्रतिकृति सेट की अनुमति कैसे दें

  4. उल्का के पास कौन से सुरक्षा तंत्र हैं?

  5. MongoDB में गिनती () और खोज () के बीच अंतर। गिनती ()