קנה מידה עם מספר מסדי נתונים

הדרך הטובה ביותר לבצע אופטימיזציה של הביצועים ולהתאים את היקף הנתונים ב-Firebase Realtime Database היא לפצל את הנתונים בין כמה מכונות Realtime Database, שנקראת גם חלוקה של מסדי נתונים. חלוקה למקטעים מאפשרת לכם להתאים את הקיבולת לצרכים שלכם מעבר למגבלות שחלות על מכונות של מסדי נתונים נפרדים, בנוסף לאיזון עומסים ולביצוע אופטימיזציה של הביצועים.

מתי כדאי לפצל את הנתונים

כדאי לפצל את הנתונים בין כמה מסדי נתונים אם אתם משתמשים ב-Realtime Database ומתקיימים עליכם אחד מהתרחישים הבאים:

  • אתם רוצים להרחיב את היכולות מעבר למגבלה של 200,000 חיבורים בו-זמנית, 1,000 פעולות כתיבה בשנייה או כל אחת מהמגבלות האחרות במכונה אחת של מסד נתונים.
  • יש לכם כמה קבוצות נתונים נפרדות, ואתם רוצים לשפר את הביצועים (לדוגמה, אפליקציית צ'אט שמשרתת קבוצות נפרדות ועצמאיות של משתמשים).
  • אתם רוצים לאזן את העומס בין כמה מסדי נתונים כדי לשפר את זמן הפעולה ולהפחית את הסיכון להתקפי עומס על מכונה אחת של מסד נתונים.

איך לפצל את הנתונים

כדי לפצל את הנתונים, יש לבצע את השלבים הבאים (המתוארים בפירוט בהמשך):

  1. למפות את הנתונים למספר מסדי נתונים בהתאם לצרכים הספציפיים של האפליקציה.
  2. ליצור כמה מכונות של מסדי נתונים.
  3. מגדירים את האפליקציה כך שהיא תתחבר למכונה של Realtime Database שנדרשת לכל קבוצת נתונים.

מיפוי הנתונים

כשממפים את הנתונים למספר מסדי נתונים, חשוב לנסות לעמוד בתנאים הבאים:

  • כל שאילתה פועלת רק במופע אחד של מסד נתונים. Realtime Database לא תומך בשאילתות במכונות של מסד הנתונים.
  • אין שיתוף או כפילות של נתונים בין מכונות של מסדי נתונים (או שיתוף או כפילות מינימלי).
  • כל מופע של אפליקציה מתחבר למסד נתונים אחד בלבד בכל רגע נתון.

כשממפים את הנתונים, כדאי להשתמש בשיטות הבאות:

יצירת 'master shard'

שמירת מפה של אופן האחסון של הנתונים במכונות של מסדי נתונים. כך תוכלו לחפש באופן פרוגרמטי איזו מכונה של מסד נתונים תואמת ללקוח שמתחבר. חשוב לזכור ששיטה כזו עשויה לגרום לעלויות נוספות בהשוואה לחיבור ישיר למכונה הספציפית של מסד הנתונים שנחוץ לכם, כשאתם זקוקים לו.

נתוני קטגוריות לפי קטגוריות או לפי לקוח

אחסון נתונים במכונות של מסדי נתונים בקטגוריות נפרדות, שמקובצות לפי משתמש או סוג נתונים. לדוגמה, אם אתם מפתחים אפליקציית צ'אט שמשרתת מספר ארגונים, תוכלו ליצור מכונה של מסד נתונים לכל ארגון ולאחסן את כל נתוני הצ'אט במכונות ייחודיות של מסד הנתונים.

במקרה כזה, ארגון א' וארגון ב' לא משתפים נתונים, אין נתונים כפולים במסדי הנתונים שלכם ואתם מבצעים שאילתות רק במכונה אחת של מסד נתונים. בנוסף, המשתמשים בכל ארגון מתחברים למסד הנתונים של הארגון שלהם רק כשהם משתמשים באפליקציית הצ'אט.

לאחר מכן תוכלו ליצור כמה מכונות של מסדי נתונים מראש ולהשתמש במזהה הארגון כדי למפות צוות למכונה של מסד הנתונים שלו. לדוגמה, ארגון א' ממופה למסד נתונים בזמן אמת א'.

האופן שבו ממפים נתונים לאפליקציה תלוי בתרחיש לדוגמה הספציפי, אבל התנאים והאסטרטגיות שמפורטים למעלה יכולים לעזור לכם להגדיר מה מתאים לנתונים שלכם.

יצירת כמה מופעים של Realtime Database

אם אתם משתמשים בתוכנית התמחור Blaze, אתם יכולים ליצור עד 1,000 מכונות של מסדי נתונים באותו פרויקט ב-Firebase.

יצירת מסד נתונים ב-<span class=מסוף Firebase עם תפריט ההקשר בקטע של מסדי הנתונים" /

  1. במסוף Firebase, עוברים לכרטיסייה Data בקטע Develop > Database.
  2. בוחרים באפשרות יצירת מסד נתונים חדש בתפריט שבקטע Realtime Database.
  3. מתאימים אישית את הפנייה למסד נתונים ואת כללי האבטחה, ולוחצים על הבנתי.

חוזרים על התהליך כדי ליצור כמה מכונות של מסדי נתונים שרוצים. לכל מכונה של מסד נתונים יש קבוצה משלה של Firebase Realtime Database Security Rules, כך שתוכלו לשפר את הגישה לנתונים שלכם.

אפשר ליצור מכונות של מסדי נתונים ולנהל אותן במסוף Firebase או באמצעות ה-API ל-REST לניהול של Realtime Database.

עריכה ופריסה של Realtime Database Security Rules בכל מכונה

חשוב לוודא שה-Realtime Database Security Rules מאפשרים גישה מתאימה לכל מכונה של מסד נתונים בפרויקט. לכל מסד נתונים יש קבוצת כללים משלו, שאותם אפשר לערוך ולפרוס ממסוף Firebase, או להשתמש ב-CLI של Firebase כדי לפרוס יעדים.

  • כדי לערוך ולפרוס כללים במסוף Firebase:

    1. עוברים לכרטיסייה Rules בקטע Develop > Database.
    2. בוחרים את מסד הנתונים שרוצים לערוך ומשנים את הכללים.
  • כדי לערוך ולפרוס כללים מה-CLI של 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. מריצים את הפקודה deploy:

      firebase deploy

חשוב לערוך ולפרוס כללים באופן עקבי מאותו מקום. פריסת כללים מ-CLI של Firebase מבטלת את כל העריכות שביצעתם במסוף Firebase, ועריכת כללים ישירות במסוף Firebase מבטלת את כל השינויים האחרונים שביצעתם באמצעות CLI של Firebase.

חיבור האפליקציה למספר מכונות של מסדי נתונים

משתמשים בהפניה למסד הנתונים כדי לגשת לנתונים שמאוחסנים במכונות של מסדי נתונים משניים. אפשר לקבל את ההפניה למכונה ספציפית של מסד נתונים לפי כתובת URL או אפליקציה. אם לא מציינים כתובת URL, מקבלים את ההפניה למכונה שמוגדרת כברירת מחדל במסד הנתונים של האפליקציה.

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 הזה לא זמין ביעד של קטע מקדים לאפליקציה.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// קבלת מופע של מסד נתונים משני לפי כתובת URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
הערה: מוצר Firebase הזה לא זמין ביעד של קטע מקדים לאפליקציה.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// אחזור מכונה משנית של מסד נתונים לפי כתובת URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin+KTX

// 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();

מציינים מופע כשמשתמשים ב-CLI של Firebase

משתמשים באפשרות --instance כדי לציין לאיזה Firebase Realtime Database רוצים להחיל פקודת CLI של Firebase. לדוגמה, אפשר להשתמש בפקודה הבאה כדי להריץ את הכלי לניתוחי ביצועים למכונה של מסד נתונים בשם my-example-shard.firebaseio.com:

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

לבצע אופטימיזציה של החיבורים בכל מסד נתונים

אם כל לקוח צריך להתחבר למספר מסדי נתונים במהלך סשן, אפשר לצמצם את מספר החיבורים בו-זמנית לכל מכונה של מסד נתונים על ידי התחברות לכל מכונה של מסד נתונים למשך הזמן הנדרש בלבד.

לעצות נוספות

אם דרושה לכם עזרה נוספת בחלוקת הנתונים למספר מכונות של מסדי נתונים, תוכלו לפנות למומחים של Firebase בערוץ Slack או ב-Stack Overflow.