Check out what’s new from Firebase at Google I/O 2022. Learn more

使用多個數據庫進行擴展

在 Firebase 實時數據庫中優化性能和擴展數據的最佳方法是將數據拆分到多個實時數據庫實例中,也稱為數據庫分片。除了負載平衡和性能優化之外,分片使您能夠靈活地擴展超出適用於單個數據庫實例的限制

何時對數據進行分片

如果您使用實時數據庫並適合以下任何場景,您可能希望跨多個數據庫分片數據:

  • 您希望擴展到超過 200,000 個同時連接、1,000 次寫入操作/秒的限製或單個數據庫實例的任何其他限制
  • 您有多個離散的數據集,並希望優化性能(例如,為單獨的、獨立的用戶組提供服務的聊天應用程序)。
  • 您希望在多個數據庫之間平衡負載,以提高正常運行時間並降低單個數據庫實例過載的風險。

如何分片您的數據

要對您的數據進行分片,請按照以下步驟操作(下文有更詳細的描述):

  1. 根據您的應用程序的特定需求,將您的數據映射到多個數據庫。
  2. 創建多個數據庫實例。
  3. 配置您的應用程序,使其連接到每個數據集所需的實時數據庫實例。

映射您的數據

當您將數據映射到多個數據庫時,請嘗試滿足以下條件:

  • 每個查詢僅針對單個數據庫實例運行。實時數據庫不支持跨數據庫實例的查詢。
  • 沒有跨數據庫實例共享或複制數據(或最小共享或複制)。
  • 每個應用程序實例在任何給定時刻僅連接到一個數據庫。

在映射數據時,請考慮應用以下策略:

創建一個“主分片”

存儲您的數據如何跨數據庫實例存儲的地圖。這樣,您可以以編程方式查找與連接客戶端對應的數據庫實例。請記住,這可能比在需要時直接連接到所需的特定數據庫實例具有更多開銷。

按類別或按客戶存儲桶數據

將數據存儲在孤立的數據庫實例中,按用戶或數據類型分組。例如,如果您構建一個為多個組織服務的聊天應用程序,您可以為每個組織創建一個數據庫實例,並將所有聊天數據存儲在唯一的數據庫實例中。

在這種情況下,組織 A 和組織 B 不共享數據,您的數據庫中沒有任何重複數據,並且您只對單個數據庫實例執行查詢。此外,每個組織中的用戶僅在使用聊天應用程序時才連接到其組織的數據庫。

然後,您可以提前創建多個數據庫實例,並使用組織的 ID 將團隊映射到其數據庫實例。例如,組織 A 映射到實時數據庫 A。

您為應用程序映射數據的方式取決於您的特定用例,但上面概述的條件和策略可以幫助您定義對您的數據有效的方法。

創建多個實時數據庫實例

如果您使用Blaze 定價計劃,則可以在同一個 Firebase 項目中創建多個數據庫實例。

使用數據庫部分中的上下文菜單在 Firebase 控制台中創建數據庫

  1. 在 Firebase 控制台中,轉到“開發”>“數據庫”部分中的“數據”選項卡。
  2. 實時數據庫部分的菜單中選擇創建新數據庫
  3. 自定義您的數據庫引用安全規則,然後單擊得到它

重複該過程以創建所需數量的數據庫實例。每個數據庫實例都有自己的一組 Firebase 實時數據庫規則,因此您可以微調對數據的訪問。

您可以在 Firebase 控制台中或使用實時數據庫管理 REST API創建和管理數據庫實例。

為每個實例編輯和部署實時數據庫規則

確保您的實時數據庫規則允許對項目中的每個數據庫實例進行適當的訪問。每個數據庫都有自己的一組規則,您可以從 Firebase 控制台編輯和部署這些規則,或者使用Firebase CLI 部署目標

  • 要從 Firebase 控制台編輯和部署規則,請按以下步驟操作:

    1. 轉到“開發”>“數據庫”部分中的“規則”選項卡
    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 控制台中所做的任何編輯,而直接在 Firebase 控制台中編輯規則會覆蓋您最近通過 Firebase CLI 部署的任何更改。

將您的應用程序連接到多個數據庫實例

使用數據庫引用訪問存儲在輔助數據庫實例中的數據。您可以通過 URL 或應用程序獲取特定數據庫實例的引用。如果您不指定 URL,您將獲得應用程序默認數據庫實例的引用。

Web version 9

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 version 8

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);
迅速
注意:此 Firebase 產品不適用於 App Clip 目標。
// 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 產品不適用於 App Clip 目標。
// 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"] 參考];

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

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

使用 Firebase CLI 時指定實例

使用--instance選項指定要將 Firebase CLI 命令應用到哪個 Firebase 實時數據庫。例如,使用以下命令為名為my-example-shard.firebaseio.com的數據庫實例運行分析器:

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

優化每個數據庫上的連接

如果每個客戶端在會話期間需要連接到多個數據庫,您可以通過僅在必要時連接到每個數據庫實例來減少與每個數據庫實例的同時連接數。

獲取更多建議

如果您在跨多個數據庫實例分片數據方面需要更多幫助,請通過我們的Slack 頻道Stack Overflow聯繫 Firebase 專家。