Mit mehreren Datenbanken skalieren

Die beste Möglichkeit, die Leistung zu optimieren und Ihre Daten in Firebase Realtime Database zu skalieren, besteht darin, Ihre Daten auf mehrere Realtime Database-Instanzen aufzuteilen. Dies wird auch als Datenbank-Fragmentierung bezeichnet. Mit Sharding können Sie über die Limits hinaus skalieren, die für einzelne Datenbankinstanzen gelten. Außerdem können Sie Load Balancing und Leistungsoptimierung nutzen.

Wann Sie Ihre Daten fragmentieren sollten

Wenn Sie Realtime Database verwenden und eines der folgenden Szenarien auf Sie zutrifft, sollten Sie Ihre Daten auf mehrere Datenbanken aufteilen:

  • Sie möchten über das Limit von 200.000 gleichzeitigen Verbindungen, 1.000 Schreibvorgängen pro Sekunde oder einem der anderen Limits für eine einzelne Datenbankinstanz hinaus skalieren.
  • Sie haben mehrere, separate Datasets und möchten die Leistung optimieren (z. B. eine Chat-App, die separate, unabhängige Nutzergruppen bedient).
  • Sie möchten die Last auf mehrere Datenbanken verteilen, um die Verfügbarkeit zu verbessern und das Risiko einer Überlastung einer einzelnen Datenbankinstanz zu verringern.

Daten fragmentieren

So teilen Sie Ihre Daten auf (unten ausführlicher beschrieben):

  1. Ordnen Sie Ihre Daten entsprechend den spezifischen Anforderungen Ihrer App mehreren Datenbanken zu.
  2. Mehrere Datenbankinstanzen erstellen
  3. Konfigurieren Sie Ihre Anwendung so, dass sie eine Verbindung zur Realtime Database-Instanz herstellt, die für jedes Dataset erforderlich ist.

Daten zuordnen

Wenn Sie Ihre Daten mehreren Datenbanken zuordnen, sollten Sie die folgenden Bedingungen erfüllen:

  • Jede Abfrage wird nur für eine einzelne Datenbankinstanz ausgeführt. Realtime Database unterstützt keine Abfragen über Datenbankinstanzen hinweg.
  • Keine Freigabe oder Duplizierung von Daten über Datenbankinstanzen hinweg (oder minimale Freigabe oder Duplizierung).
  • Jede App-Instanz stellt zu einem bestimmten Zeitpunkt nur eine Verbindung zu einer Datenbank her.

Beachten Sie beim Zuordnen Ihrer Daten die folgenden Strategien:

„Master-Shard“ erstellen

Speichern Sie eine Übersicht darüber, wie Ihre Daten in Datenbankinstanzen gespeichert sind. So können Sie programmatisch nachsehen, welche Datenbankinstanz dem verbindenden Client entspricht. Beachten Sie, dass dies möglicherweise mehr Aufwand bedeutet, als wenn Sie sich direkt mit der gewünschten Datenbankinstanz verbinden, wenn Sie sie benötigen.

Daten nach Kategorien oder Kunden gruppieren

Daten in isolierten Datenbankinstanzen speichern, gruppiert nach Nutzer oder Datentyp. Wenn Sie beispielsweise eine Chatanwendung erstellen, die von mehreren Organisationen verwendet wird, können Sie für jede Organisation eine Datenbankinstanz erstellen und alle Chatdaten in eindeutigen Datenbankinstanzen speichern.

In diesem Fall geben Organisation A und Organisation B keine Daten weiter, es gibt keine doppelten Daten in Ihren Datenbanken und Sie führen nur Abfragen für eine einzelne Datenbankinstanz aus. Außerdem stellen Nutzer in jeder Organisation nur dann eine Verbindung zur Datenbank ihrer Organisation her, wenn sie die Chat-App verwenden.

Sie können dann im Voraus mehrere Datenbankinstanzen erstellen und die ID der Organisation verwenden, um ein Team der entsprechenden Datenbankinstanz zuzuordnen. Beispiel: Organisation A wird Realtime Database A zugeordnet.

Wie Sie Daten für Ihre App zuordnen, hängt von Ihrem jeweiligen Anwendungsfall ab. Die oben beschriebenen Bedingungen und Strategien können Ihnen jedoch dabei helfen, zu definieren, was für Ihre Daten am besten geeignet ist.

Mehrere Realtime Database-Instanzen erstellen

Wenn Sie das Blaze-Preismodell verwenden, können Sie bis zu 1.000 Datenbankinstanzen im selben Firebase-Projekt erstellen.

Datenbank in der Firebase Console über das Kontextmenü im Bereich „Datenbanken“ erstellen

  1. Rufen Sie in der Firebase-Konsole den Tab Datenbanken und Speicher > Realtime Database > Daten auf.

  2. Wählen Sie im Drop-down-Menü die Option Neue Datenbank erstellen aus.

  3. Passen Sie die Datenbankreferenz und die Security Rules an und klicken Sie dann auf Ok.

Wiederholen Sie den Vorgang, um so viele Datenbankinstanzen zu erstellen, wie Sie benötigen. Jede Datenbankinstanz hat einen eigenen Satz von Firebase Realtime Database Security Rules, sodass Sie den Zugriff auf Ihre Daten genau abstimmen können.

Sie können Datenbankinstanzen in der Firebase-Konsole oder mit der Realtime Database Management REST API erstellen und verwalten.

Bestimmte Instanzen über die Befehlszeile verwalten und mit ihnen interagieren

Sie können bestimmte Realtime Database-Instanzen mit der Firebase-Befehlszeile verwalten und mit ihnen interagieren.

Standardmäßig interagieren CLI-Befehle mit Ihrer Standarddatenbankinstanz. Sie können jedoch mit einer Nicht-Standard-Datenbankinstanz interagieren, indem Sie das Flag --instance DATABASE_NAME verwenden.

Verwenden Sie beispielsweise den folgenden Befehl, um den Profiler für eine Datenbankinstanz mit dem Namen my-example-shard.firebaseio.com auszuführen:

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

Die folgenden Befehle unterstützen das Flag --instance:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

Realtime Database Security Rules für jede Instanz bearbeiten und bereitstellen

Achten Sie darauf, dass Ihre Realtime Database Security Rules den entsprechenden Zugriff auf jede Datenbankinstanz in Ihrem Projekt ermöglichen. Jede Datenbank hat eigene Regeln, die Sie in der Firebase-Konsole bearbeiten und bereitstellen oder mit der Firebase-Befehlszeile für die Bereitstellung von Zielen verwenden können.

  • So bearbeiten und stellen Sie Regeln über die Firebase-Konsole bereit:

    1. Rufen Sie in der Firebase-Konsole den Tab Datenbanken und Speicher > Realtime Database > Regeln auf.

    2. Wählen Sie die Datenbank aus, die Sie bearbeiten möchten, und ändern Sie die Regeln.

  • So bearbeiten und stellen Sie Regeln über die Firebase-Befehlszeile bereit:

    1. Ändern Sie die Regeln in den Regeldateien für Ihre Datenbankinstanzen (z. B. foo.rules.json).

    2. Erstellen Sie Bereitstellungsziele und wenden Sie sie an, um Datenbanken zu verknüpfen, die dieselbe Regeldatei verwenden. Beispiel:

      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3

    3. Aktualisieren Sie die Konfigurationsdatei firebase.json mit den Bereitstellungszielen:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Führen Sie den Bereitstellungsbefehl aus:

      firebase deploy

Achten Sie darauf, dass Sie Regeln immer am selben Ort bearbeiten und bereitstellen. Wenn Sie Regeln über die Firebase-Befehlszeile bereitstellen, werden alle Änderungen überschrieben, die Sie in der Firebase-Konsole vorgenommen haben. Wenn Sie Regeln direkt in der Firebase-Konsole bearbeiten, werden alle kürzlich vorgenommenen Änderungen überschrieben, die Sie über die Firebase-Befehlszeile bereitgestellt haben.

Anwendung mit mehreren Datenbankinstanzen verbinden

Verwenden Sie die Datenbankreferenz, um auf Daten zuzugreifen, die in sekundären Datenbankinstanzen gespeichert sind. Sie können die Referenz für eine bestimmte Datenbankinstanz über die URL oder die App abrufen. Wenn Sie keine URL angeben, erhalten Sie die Referenz für die Standarddatenbankinstanz der App.

Web

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

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);
Swift
Hinweis:Dieses Firebase-Produkt ist für das App Clip-Ziel nicht verfügbar.
// 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
Hinweis:Dieses Firebase-Produkt ist für das App Clip-Ziel nicht verfügbar.
// 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];

Kotlin

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

Verbindungen für jede Datenbank optimieren

Wenn jeder Client während einer Sitzung eine Verbindung zu mehreren Datenbanken herstellen muss, können Sie die Anzahl der gleichzeitigen Verbindungen zu jeder Datenbankinstanz reduzieren, indem Sie die Verbindung zu jeder Datenbankinstanz nur so lange wie nötig aufrechterhalten.

Weitere Tipps erhalten

Wenn Sie weitere Hilfe beim Sharding Ihrer Daten über mehrere Datenbankinstanzen hinweg benötigen, wenden Sie sich an die Firebase-Experten in unserem Slack-Kanal oder auf Stack Overflow.