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

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 में, डेटाबेस और स्टोरेज > रीयलटाइम डेटाबेस > डेटा टैब पर जाएं.

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

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

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

आप Firebase कंसोल में या रीयलटाइम डेटाबेस मैनेजमेंट 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 में, डेटाबेस और स्टोरेज > रीयलटाइम डेटाबेस > नियम टैब पर जाएं.

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