全新推出 Cloud Firestore(测试版):试用 Firebase 和 Google Cloud Platform 全新推出的规模可扩展且灵活的数据库。详细了解 Cloud Firestore

利用多个数据库进行扩展

要在 Firebase 实时数据库中优化性能和扩展数据,最佳方法是将数据拆分到多个实时数据库实例中,也称为数据库分片。除了负载平衡和性能优化之外,分片还可以帮助您灵活地扩展以超出单个数据库实例的限额

何时将数据分片

如果您要在以下情况下使用实时数据库,建议您最好将数据分片到多个数据库中:

  • 您想要扩展以超出 10 万个并发连接、每秒 1000 次写入操作的限额或单个数据库实例的其他任何限额
  • 您有多个互不关联的数据集,并希望优化性能(例如,为各自独立、互不相关的用户组提供服务的聊天应用)。
  • 您希望在多个数据库之间平衡负载,以增加正常运行时间并降低单个数据库实例负载过重的风险。

如何将数据分片

要将数据分片,请按照以下步骤操作(后面有详细介绍):

  1. 根据您的应用的具体需求将数据映射到多个数据库。
  2. 创建多个数据库实例。
  3. 配置您的应用,使其连接到每个数据集所需的实时数据库实例。

映射您的数据

在将数据映射到多个数据库时,请尽量满足以下条件:

  • 每个查询仅针对单个数据库实例来执行。实时数据库不支持跨数据库实例的查询。
  • 数据库实例之间不存在共享或重复的数据(或只有极少的共享或重复)。
  • 无论何时每个应用实例都只连接到一个数据库。

在映射数据时,您不妨考虑应用以下策略:

创建一个“主分片”

存储您的数据在各个数据库实例中的存储情况的映射。这样,您就能以编程方式查找与连接的客户端对应的数据库实例。请注意,与在您需要时直接连接您所需的特定数据库实例相比,此策略的开销可能会更大。

按类别或客户分区存储数据

按用户或数据类型对数据进行分组并分别存储在独立的数据库实例中。例如,如果您要构建一个为多个组织提供服务的聊天应用,则可以为每个组织创建一个数据库实例,并将各个组织的所有聊天数据存储到各自对应的唯一数据库实例中。

在这种情况下,A 组织和 B 组织不共享数据,这些数据库中没有任何重复的数据,并且您只针对单个数据库实例执行查询。此外,每个组织中的用户只有在使用该聊天应用时才会连接到其组织的数据库。

然后,您可以预先创建多个数据库实例,并使用组织的 ID 将某个团队映射到其数据库实例。例如,A 组织映射到 A 实时数据库。

您为应用映射数据的方式取决于具体的使用情形,但上述条件和策略可以帮助您确定适合您的数据的方式。

创建多个实时数据库实例

如果您使用的是 Blaze 定价方案,则可以在同一个 Firebase 项目中创建多个数据库实例。

在 Firebase 控制台中使用“数据库”部分的上下文菜单创建数据库

  1. 在 Firebase 控制台中,转到 Develop(开发)> Database(数据库)部分中的数据标签。
  2. 数据库部分的菜单中选择创建新数据库
  3. 自定义您的数据库引用安全规则,然后点击知道了

您可以重复上述过程,根据自己的需要创建任意多个数据库实例。每个数据库实例都有自己的一组 Firebase 实时数据库规则,因此您可以精细调整对您的数据的访问权限。

为每个实例修改和部署 Firebase 数据库规则

确保您已设置 Firebase 数据库规则,以对您项目中的每个数据库实例授予适当权限。每个数据库都有自己的一套规则,您可以通过 Firebase 控制台对其进行修改和部署,也可以通过使用 Firebase CLI 部署目标来进行修改和部署。

要从 Firebase 控制台中修改和部署规则,请转到 Develop(开发)> Database(数据库)部分中的规则标签。选择要修改的数据库,然后对规则进行修改。

要通过 Firebase CLI 修改和部署规则,请按以下步骤操作:

  1. 为每个数据库设置部署目标。将使用相同规则文件的所有数据库与同一目标相关联。例如:
    firebase target:apply database main my-db-1 my-db-2
    firebase target:apply database other my-other-db-3
    
  2. 使用部署目标更新 firebase.json
    {
    "database": [
    {"target": "main", "rules", "foo.rules.json"},
    {"target": "other", "rules": "bar.rules.json"}
    ]
    }
    
  3. 运行 deploy 命令:
    firebase deploy
    

确保始终通过同一工具修改和部署规则。通过 Firebase CLI 部署规则会覆盖您在 Firebase 控制台中所做的修改,而直接在 Firebase 控制台中修改规则会覆盖您近期通过 Firebase CLI 部署的更改。

将您的应用连接到多个数据库实例

使用数据库引用来访问存储在辅助数据库实例中的数据。您可以根据网址或应用获取特定数据库实例的引用。如果您不指定网址,则会获得应用的默认数据库实例的引用。

网页
// Get the default database instance for an app
var database = firebase.database();

// Get a secondary database instance by URL
var database = firebase.database('https://testapp-1234.firebaseio.com');
Swift
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];
Android
// Get the default database instance for an app
private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance().getReference();

// Get a secondary database instance by URL
private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com").getReference();

优化每个数据库上的连接

如果每个客户端都需要在一个会话期间连接到多个数据库,则应仅在必要时连接到各个数据库实例,以减少各个数据库实例的并发连接数。

获取更多建议

在将数据分片到多个数据库实例中时,如果您需要更多帮助,请在我们的 Slack 频道Stack Overflow 上与 Firebase 专家联系。

发送以下问题的反馈:

此网页
Firebase 实时数据库
需要帮助?请访问我们的支持页面