使用多個數據庫進行擴展

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

何時分片數據

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

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

如何分片數據

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

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

映射您的數據

將數據映射到多個數據庫時,請盡量滿足以下條件:

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

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

創建一個“主分片”

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

按類別或按客戶分類的數據桶

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

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

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

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

創建多個實時數據庫實例

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

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

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

重複該過程以根據需要創建任意數量的數據庫實例。每個數據庫實例都有自己的一組 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 modular API

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 namespaced API

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()
目標-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"] 參考];

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

使用 Firebase CLI 時指定一個實例

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

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

優化每個數據庫上的連接

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

獲取更多建議

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