获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

使用多个数据库进行扩展

在 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 专家。