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

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

अपने डेटा को कब शार्ड करना चाहिए

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

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

अपने डेटा को शार्ड करने का तरीका

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

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

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

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

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

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

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

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

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

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

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

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

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

Realtime Database के कई इंस्टेंस बनाना

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

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

  1. Firebase कंसोल में, डेटाबेस और स्टोरेज > रीयलटाइम डेटाबेस > डेटा टैब पर जाएं.

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

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

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

Firebase कंसोल में या रीयलटाइम डेटाबेस मैनेजमेंट REST API का इस्तेमाल करके, डेटाबेस इंस्टेंस बनाए और मैनेज किए जा सकते हैं.

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

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

डिफ़ॉल्ट रूप से, सीएलआई कमांड आपके डिफ़ॉल्ट डेटाबेस इंस्टेंस के साथ इंटरैक्ट करते हैं. हालांकि, --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 कंसोल से या Firebase सीएलआई का इस्तेमाल करके, टारगेट डिप्लॉय करने के लिए बदला और डिप्लॉय किया जा सकता है.

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

    1. Firebase कंसोल में, डेटाबेस और स्टोरेज > रीयलटाइम डेटाबेस > नियम टैब पर जाएं.

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

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

    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 सीएलआई से नियमों को डिप्लॉय करने पर, Firebase कंसोल में किए गए सभी बदलाव बदल जाते हैं. साथ ही, Firebase कंसोल में सीधे तौर पर नियमों में बदलाव करने पर, Firebase सीएलआई से डिप्लॉय किए गए हाल ही के सभी बदलाव बदल जाते हैं.

अपने ऐप्लिकेशन को कई डेटाबेस इंस्टेंस से कनेक्ट करना

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

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
Note: यह 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
Note: यह 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 विशेषज्ञों से संपर्क करें.