Skalieren Sie mit mehreren Datenbanken

Die beste Möglichkeit, die Leistung zu optimieren und Ihre Daten in der Firebase Realtime Database zu skalieren, besteht darin, Ihre Daten auf mehrere Realtime Database-Instanzen aufzuteilen, was auch als Datenbank-Sharding bezeichnet wird. Sharding bietet Ihnen zusätzlich zur Lastverteilung und Leistungsoptimierung die Flexibilität, über die für einzelne Datenbankinstanzen geltenden Grenzen hinaus zu skalieren.

Wann sollten Sie Ihre Daten teilen?

Möglicherweise möchten Sie Ihre Daten auf mehrere Datenbanken aufteilen, wenn Sie Realtime Database verwenden und in eines der folgenden Szenarios passen:

  • Sie möchten über die Grenze von 200.000 gleichzeitigen Verbindungen, 1.000 Schreibvorgängen/Sekunde oder eine andere Grenze für eine einzelne Datenbankinstanz hinaus skalieren.
  • Sie verfügen über mehrere, diskrete Datensätze und möchten die Leistung optimieren (z. B. eine Chat-App, die separate, unabhängige Benutzergruppen bedient).
  • Sie möchten die Last auf mehrere Datenbanken verteilen, um die Betriebszeit zu verbessern und das Risiko der Überlastung einer einzelnen Datenbankinstanz zu verringern.

So teilen Sie Ihre Daten auf

Um Ihre Daten zu teilen, führen Sie die folgenden Schritte aus (weiter unten ausführlicher beschrieben):

  1. Ordnen Sie Ihre Daten entsprechend den spezifischen Anforderungen Ihrer App mehreren Datenbanken zu.
  2. Erstellen Sie mehrere Datenbankinstanzen.
  3. Konfigurieren Sie Ihre App so, dass sie eine Verbindung mit der für jeden Datensatz erforderlichen Echtzeitdatenbankinstanz herstellt.

Ordnen Sie Ihre Daten zu

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

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

Erwägen Sie beim Zuordnen Ihrer Daten die Anwendung der folgenden Strategien:

Erstellen Sie einen „Master-Shard“

Speichern Sie eine Karte darüber, wie Ihre Daten in Datenbankinstanzen gespeichert werden. Auf diese Weise können Sie programmgesteuert nachschlagen, welche Datenbankinstanz dem verbindenden Client entspricht. Bedenken Sie, dass dies möglicherweise mehr Aufwand verursacht, als direkt eine Verbindung zu der jeweiligen Datenbankinstanz herzustellen, die Sie benötigen, und zwar dann, wenn Sie sie benötigen.

Bucket-Daten nach Kategorien oder nach Kunden

Speichern Sie Daten in isolierten Datenbankinstanzen, gruppiert nach Benutzer oder Datentyp. Wenn Sie beispielsweise eine Chat-Anwendung erstellen, die mehrere Organisationen bedient, können Sie für jede Organisation eine Datenbankinstanz erstellen und alle Chat-Daten in eindeutigen Datenbankinstanzen speichern.

In diesem Fall tauschen Organisation A und Organisation B keine Daten aus, es gibt keine doppelten Daten in Ihren Datenbanken und Sie führen Abfragen nur für eine einzelne Datenbankinstanz durch. Darüber hinaus stellen Benutzer in jeder Organisation nur dann eine Verbindung zur Datenbank ihrer Organisation her, wenn sie die Chat-App verwenden.

Anschließend können Sie vorab mehrere Datenbankinstanzen erstellen und mithilfe der Organisations-ID ein Team seiner Datenbankinstanz zuordnen. Beispielsweise ist Organisation A der Echtzeitdatenbank A zugeordnet.

Die Art und Weise, wie Sie Daten für Ihre App zuordnen, hängt von Ihrem speziellen Anwendungsfall ab. Die oben beschriebenen Bedingungen und Strategien können Ihnen jedoch dabei helfen, zu definieren, was für Ihre Daten funktioniert.

Erstellen Sie mehrere Echtzeitdatenbankinstanzen

Wenn Sie den Blaze-Preisplan nutzen, können Sie bis zu 1.000 Datenbankinstanzen im selben Firebase-Projekt erstellen.

Erstellen Sie eine Datenbank in der Firebase-Konsole mit dem Kontextmenü im Abschnitt „Datenbanken“.

  1. Gehen Sie in der Firebase-Konsole im Abschnitt „Entwickeln“ > „Datenbank“ zur Registerkarte „ Daten “.
  2. Wählen Sie im Menü im Abschnitt „Echtzeitdatenbank“ die Option „Neue Datenbank erstellen“ aus.
  3. Passen Sie Ihre Datenbankreferenz und Sicherheitsregeln an und klicken Sie dann auf Verstanden .

Wiederholen Sie den Vorgang, um so viele Datenbankinstanzen zu erstellen, wie Sie benötigen. Jede Datenbankinstanz verfügt über einen eigenen Satz von Firebase-Echtzeitdatenbank-Sicherheitsregeln, 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.

Bearbeiten und implementieren Sie Echtzeit-Datenbanksicherheitsregeln für jede Instanz

Stellen Sie sicher, dass Ihre Echtzeit-Datenbanksicherheitsregeln den entsprechenden Zugriff auf jede Datenbankinstanz in Ihrem Projekt zulassen. Jede Datenbank verfügt über einen eigenen Regelsatz, den Sie über die Firebase-Konsole oder über die Firebase-CLI zum Bereitstellen von Zielen bearbeiten und bereitstellen können.

  • Führen Sie die folgenden Schritte aus, um Regeln über die Firebase-Konsole zu bearbeiten und bereitzustellen:

    1. Gehen Sie im Abschnitt „Entwickeln > Datenbank“ zur Registerkarte „Regeln“ .
    2. Wählen Sie die Datenbank aus, die Sie bearbeiten möchten, und ändern Sie dann die Regeln.
  • Führen Sie die folgenden Schritte aus, um Regeln über die Firebase-CLI zu bearbeiten und bereitzustellen:

    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 zuzuordnen, die dieselbe Regeldatei verwenden. Zum Beispiel:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Aktualisieren Sie Ihre firebase.json Konfigurationsdatei 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

Stellen Sie sicher, dass Sie Regeln stets am selben Ort bearbeiten und bereitstellen. Das Bereitstellen von Regeln über die Firebase-CLI überschreibt alle Änderungen, die Sie in der Firebase-Konsole vorgenommen haben, und das Bearbeiten von Regeln direkt in der Firebase-Konsole überschreibt alle kürzlich vorgenommenen Änderungen, die Sie über die Firebase-CLI bereitgestellt haben.

Verbinden Sie Ihre App mit mehreren Datenbankinstanzen

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 per URL oder App abrufen. Wenn Sie keine URL angeben, erhalten Sie die Referenz für die Standarddatenbankinstanz der App.

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);
Schnell
Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Eine sekundäre Datenbankinstanz über die URL abrufen var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Ziel c
Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Sekundäre Datenbankinstanz über URL abrufen @property (stark, nichtatomar) FIRDatabaseReference *ref; self.ref = [[FIRDatabase-DatenbankWithURL:@"https://testapp-1234.firebaseio.com"] Referenz];

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

Geben Sie eine Instanz an, wenn Sie die Firebase-CLI verwenden

Verwenden Sie die Option --instance , um anzugeben, auf welche Firebase-Echtzeitdatenbank Sie einen Firebase-CLI-Befehl anwenden möchten. 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"

Optimieren Sie die Verbindungen in jeder Datenbank

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

Holen Sie sich weitere Ratschläge

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