एक से ज़्यादा डेटाबेस के साथ स्केल करें

Firebase Realtime Database में परफ़ॉर्मेंस को ऑप्टिमाइज़ करने और डेटा को स्केल करने का सबसे अच्छा तरीका है कि डेटा को Realtime Database के एक से ज़्यादा इंस्टेंस में बांटा जाए. इसे डेटाबेस शार्डिंग भी कहा जाता है. शार्डिंग की मदद से, लोड बैलेंसिंग और परफ़ॉर्मेंस ऑप्टिमाइज़ेशन के अलावा, डेटाबेस के अलग-अलग इंस्टेंस पर लागू होने वाली सीमाओं से ज़्यादा डेटा को स्केल किया जा सकता है.

डेटा को शार्ड कब करें

अगर Realtime Database का इस्तेमाल किया जा रहा है और इनमें से कोई भी स्थिति लागू होती है, तो डेटा को एक से ज़्यादा डेटाबेस में बांटा जा सकता है:

  • आपको एक साथ 2,00,000 कनेक्शन,हर सेकंड में 1, 000 राइट ऑपरेशन या किसी एक डेटाबेस इंस्टेंस के लिए तय की गई अन्य सीमाओंसे ज़्यादा डेटा को स्केल करना है.
  • आपके पास अलग-अलग डेटा सेट हैं और आपको परफ़ॉर्मेंस ऑप्टिमाइज़ करनी है. उदाहरण के लिए, कोई चैट ऐप्लिकेशन जो उपयोगकर्ताओं के अलग-अलग और स्वतंत्र ग्रुप को सेवा देता है.
  • आपको एक से ज़्यादा डेटाबेस में लोड को बैलेंस करना है, ताकि अपटाइम को बेहतर बनाया जा सके और किसी एक डेटाबेस इंस्टेंस पर ज़्यादा लोड पड़ने का खतरा कम किया जा सके.

डेटा को शार्ड कैसे करें

डेटा को शार्ड करने के लिए, यह तरीका अपनाएं. इसके बारे में यहां ज़्यादा जानकारी दी गई है:

  1. अपने ऐप्लिकेशन की ज़रूरतों के हिसाब से, डेटा को एक से ज़्यादा डेटाबेस में मैप करें.
  2. डेटाबेस के एक से ज़्यादा इंस्टेंस बनाएं.
  3. अपने ऐप्लिकेशन को इस तरह कॉन्फ़िगर करें कि वह हर डेटा सेट के लिए, ज़रूरी Realtime Database इंस्टेंस से कनेक्ट हो.

डेटा को मैप करना

डेटा को एक से ज़्यादा डेटाबेस में मैप करते समय, इन शर्तों को पूरा करने की कोशिश करें:

  • हर क्वेरी सिर्फ़ किसी एक डेटाबेस इंस्टेंस के ख़िलाफ़ चलती है. Realtime Database डेटाबेस के अलग-अलग इंस्टेंस के लिए क्वेरी करने की सुविधा नहीं देता.
  • डेटाबेस के अलग-अलग इंस्टेंस में डेटा शेयर या डुप्लीकेट नहीं किया जाना चाहिए. हालांकि, कम से कम शेयर या डुप्लीकेट किया जा सकता है.
  • ऐप्लिकेशन का हर इंस्टेंस, किसी भी समय सिर्फ़ एक डेटाबेस से कनेक्ट होता है.

डेटा को मैप करते समय, इन रणनीतियों को लागू करने पर विचार करें:

"मास्टर शार्ड" बनाना

यह जानकारी सेव करें कि आपका डेटा, डेटाबेस के अलग-अलग इंस्टेंस में कैसे सेव किया जाता है. इस तरह, प्रोग्राम के ज़रिए यह देखा जा सकता है कि कनेक्ट होने वाले क्लाइंट के लिए, डेटाबेस का कौनसी इंस्टेंस काम का है. ध्यान रखें कि जब आपको किसी खास डेटाबेस इंस्टेंस की ज़रूरत हो, तो उससे सीधे कनेक्ट करने के मुकाबले, इसमें ज़्यादा समय लग सकता है.

डेटा को कैटगरी या ग्राहक के हिसाब से बकेट करना

डेटा को अलग-अलग डेटाबेस इंस्टेंस में सेव करें. इसे उपयोगकर्ता या डेटा टाइप के हिसाब से ग्रुप में बांटा जा सकता है. उदाहरण के लिए, अगर आपने कोई चैट ऐप्लिकेशन बनाया है जो कई संगठनों को सेवा देता है, तो हर संगठन के लिए डेटाबेस का एक इंस्टेंस बनाया जा सकता है. साथ ही, चैट का सारा डेटा, डेटाबेस के अलग-अलग इंस्टेंस में सेव किया जा सकता है.

इस मामले में, संगठन A और संगठन B डेटा शेयर नहीं करते. आपके डेटाबेस में कोई डुप्लीकेट डेटा नहीं होता. साथ ही, सिर्फ़ किसी एक डेटाबेस इंस्टेंस के ख़िलाफ़ क्वेरी की जाती है. इसके अलावा, हर संगठन के उपयोगकर्ता, चैट ऐप्लिकेशन का इस्तेमाल करते समय सिर्फ़ अपने संगठन के डेटाबेस से कनेक्ट होते हैं.

इसके बाद, डेटाबेस के कई इंस्टेंस पहले से बनाए जा सकते हैं. साथ ही, किसी टीम को उसके डेटाबेस इंस्टेंस में मैप करने के लिए, संगठन की आईडी का इस्तेमाल किया जा सकता है. उदाहरण के लिए, संगठन A को Realtime Database A में मैप किया जाता है.

आपके ऐप्लिकेशन के लिए डेटा को मैप करने का तरीका, आपके इस्तेमाल के हिसाब से अलग-अलग हो सकता है. हालांकि, ऊपर बताई गई शर्तें और रणनीतियां, यह तय करने में आपकी मदद कर सकती हैं कि आपके डेटा के लिए क्या काम करता है.

एक से ज़्यादा Realtime Database इंस्टेंस बनाना

अगर आपके पास ब्लेज़ कीमत का प्लान है, तो एक ही Firebase प्रोजेक्ट में डेटाबेस के 1,000 इंस्टेंस बनाए जा सकते हैं.

डेटाबेस सेक्शन में जाकर, कॉन्टेक्स्ट मेन्यू की मदद से Firebase कंसोल में डेटाबेस बनाएं

  1. Firebase console में, डेटाबेस और स्टोरेज > Realtime Database > डेटा टैब पर जाएं.

  2. ड्रॉप-डाउन मेन्यू से, नया डेटाबेस बनाएं को चुनें.

  3. अपनी ज़रूरत के हिसाब से डेटाबेस रेफ़रंस और Security Rules को बनाएं. इसके बाद, ठीक है पर क्लिक करें.

डेटाबेस के जितने इंस्टेंस बनाने हैं, उनके लिए इस प्रोसेस को दोहराएं. डेटाबेस के हर इंस्टेंस के लिए, Firebase Realtime Database Security Rules के नियम अलग-अलग होते हैं. इसलिए, अपने डेटा के ऐक्सेस को बेहतर बनाया जा सकता है.

आप Firebase कंसोल में या Realtime Database Management REST API का इस्तेमाल करके, डेटाबेस के इंस्टेंस बना और मैनेज कर सकते हैं.

सीएलआई का इस्तेमाल करके, खास इंस्टेंस को मैनेज करना और उनसे इंटरैक्ट करना

खास Realtime Database इंस्टेंस को मैनेज किया जा सकता है और उनसे इंटरैक्ट किया जा सकता है. इसके लिए, Firebase CLI का इस्तेमाल करें.

डिफ़ॉल्ट रूप से, सीएलआई के निर्देश, डेटाबेस के डिफ़ॉल्ट इंस्टेंस के साथ इंटरैक्ट करते हैं. हालांकि, नॉन-डिफ़ॉल्ट डेटाबेस इंस्टेंस के साथ इंटरैक्ट किया जा सकता है. इसके लिए, --instance DATABASE_NAME फ़्लैग का इस्तेमाल करें.

उदाहरण के लिए, my-example-shard.firebaseio.com नाम के डेटाबेस इंस्टेंस के लिए, प्रोफ़ाइलर चलाने के लिए यह निर्देश इस्तेमाल करें:

firebase database:profile --instance "my-example-shard"

इन निर्देशों में --instance फ़्लैग का इस्तेमाल किया जा सकता है:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

हर इंस्टेंस के लिए, Realtime Database Security Rules में बदलाव करना और उन्हें डिप्लॉय करना

पक्का करें कि आपके Realtime Database Security Rules आपके प्रोजेक्ट में डेटाबेस के हर इंस्टेंस को सही ऐक्सेस दें. हर डेटाबेस के लिए नियमों का अपना सेट होता है, इनमें Firebase console से बदलाव किया जा सकता है और इन्हें डिप्लॉय किया जा सकता है. इसके अलावा, टारगेट डिप्लॉय करने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.

  • Firebase console से नियमों में बदलाव करने और उन्हें डिप्लॉय करने के लिए, यह तरीका अपनाएं:

    1. Firebase console में, डेटाबेस और स्टोरेज > Realtime Database > नियम टैब पर जाएं.

    2. उस डेटाबेस को चुनें जिसमें बदलाव करना है. इसके बाद, नियमों में बदलाव करें.

  • Firebase CLI से नियमों में बदलाव करने और उन्हें डिप्लॉय करने के लिए, यह तरीका अपनाएं:

    1. डेटाबेस के इंस्टेंस के लिए, नियमों की फ़ाइलों में नियमों में बदलाव करें. उदाहरण के लिए, foo.rules.json.

    2. डिप्लॉय टारगेट बनाएं और उन्हें लागू करें, ताकि एक ही नियमों की फ़ाइल का इस्तेमाल करने वाले डेटाबेस को जोड़ा जा सके. उदाहरण के लिए:

      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3

    3. firebase.json कॉन्फ़िगरेशन फ़ाइल को डिप्लॉय टारगेट के साथ अपडेट करें:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. डिप्लॉय कमांड चलाएं:

      firebase deploy

पक्का करें कि नियमों में बदलाव और उन्हें डिप्लॉय करने के लिए, एक ही जगह का इस्तेमाल किया जाए. Firebase CLI से नियमों को डिप्लॉय करने पर, Firebase console में किए गए सभी बदलाव ओवरराइड हो जाते हैं. वहीं, Firebase console में सीधे नियमों में बदलाव करने पर, Firebase CLI के ज़रिए डिप्लॉय किए गए हाल के सभी बदलाव ओवरराइड हो जाते हैं.

अपने ऐप्लिकेशन को डेटाबेस के एक से ज़्यादा इंस्टेंस से कनेक्ट करना

डेटाबेस के दूसरे इंस्टेंस में सेव किए गए डेटा को ऐक्सेस करने के लिए, डेटाबेस रेफ़रंस का इस्तेमाल करें. यूआरएल या ऐप्लिकेशन की मदद से, डेटाबेस के किसी खास इंस्टेंस का रेफ़रंस पाया जा सकता है. अगर कोई यूआरएल नहीं दिया जाता है, तो आपको ऐप्लिकेशन के डिफ़ॉल्ट डेटाबेस इंस्टेंस का रेफ़रंस मिलेगा.

Web

import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";

const app1 = initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
const database1 = getDatabase(app1);

// Get a database instance for app2
const database2 = getDatabase(app2);

Web

const app1 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
var database1 = firebase.database();

// Get a database instance for app2
var database2 = firebase.database(app2);
Swift
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip टारगेट पर उपलब्ध नहीं है.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip टारगेट पर उपलब्ध नहीं है.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin

// Get the default database instance for an app
val primary = Firebase.database.reference

// Get a secondary database instance by URL
val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference

Java

// Get the default database instance for an app
DatabaseReference primary = FirebaseDatabase.getInstance()
        .getReference();

// Get a secondary database instance by URL
DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com")
        .getReference();

हर डेटाबेस पर कनेक्शन ऑप्टिमाइज़ करना

अगर हर क्लाइंट को किसी सेशन के दौरान, एक से ज़्यादा डेटाबेस से कनेक्ट करना पड़ता है, तो हर डेटाबेस इंस्टेंस से एक साथ कनेक्ट होने वाले कनेक्शन की संख्या कम की जा सकती है. इसके लिए, हर डेटाबेस इंस्टेंस से सिर्फ़ तब तक कनेक्ट करें, जब तक ज़रूरी हो.

ज़्यादा सलाह पाना

अगर आपको डेटाबेस के एक से ज़्यादा इंस्टेंस में डेटा को शार्ड करने के बारे में ज़्यादा मदद चाहिए, तो हमारे Slack चैनल या Stack Overflow पर Firebase के विशेषज्ञों से संपर्क करें.