Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

使用多個數據庫進行擴展

在 Firebase 實時數據庫中優化性能和擴展數據的最佳方法是將數據拆分到多個實時數據庫實例,也稱為數據庫分片。拆分為您提供了靈活性,規模超出限制將應用於單個數據庫實例,除了負載均衡和性能優化。

何時分片您的數據

如果您使用的是實時數據庫並且適合以下任一場景,則您可能希望將數據分片到多個數據庫中:

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

如何分片你的數據

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

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

映射您的數據

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

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

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

創建一個“主分片”

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

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

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

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

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

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

創建多個實時數據庫實例

如果你在大火定價計劃,你可以創建在同一個項目火力地堡的多個數據庫實例。

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

  1. 在火力地堡控制台,轉到數據選項卡中的開發>數據庫部分。
  2. 選擇從實時數據庫部分的菜單中選擇創建新的數據庫
  3. 自定義您的數據庫參考安全規則,然後點擊了它

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

您可以創建並在火力地堡控制台或使用管理數據庫實例的實時數據庫管理REST API

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

確保您的實時數據庫規則允許對項目中的每個數據庫實例進行適當的訪問。每個數據庫都有它自己的一套規則,你可以從火力地堡控制台,或使用編輯和部署火力地堡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,您將獲得應用默認數據庫實例的引用。

網頁版 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);

網頁版 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);
迅速
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
//獲取由URL VAR裁判輔助數據庫實例:DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
目標-C
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
//獲取由URL @property輔助數據庫實例(強,非原子)FIRDatabaseReference * REF; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 參考];

爪哇

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

科特林+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選項來指定要在火力地堡CLI命令適用的火力地堡實時數據庫。例如,使用下面的命令來運行一個名為數據庫實例剖析my-example-shard.firebaseio.com

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

優化每個數據庫上的連接

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

獲取更多建議

如果您需要更多的幫助,分片在多個數據庫實例數據,接觸到我們的火力地堡專家鬆弛通道堆棧溢出