Skalieren mit mehreren Datenbanken

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, auch als Datenbank-Sharding bezeichnet. Sharding gibt Ihnen die Flexibilität über die maßstabs Grenzen , die auf einzelne Datenbankinstanzen gelten, zusätzlich ausgleichend und Performance - Optimierung zu laden.

Wann Sie Ihre Daten teilen sollten

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

  • Sie wollen über die Grenze von 200.000 gleichzeitigen Verbindungen, 1000 Schreiboperationen / Sekunde, oder eine der anderen maßstab Grenzen für eine einzelne Datenbankinstanz.
  • Sie haben mehrere separate 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

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

  1. Ordnen Sie Ihre Daten gemäß den spezifischen Anforderungen Ihrer App mehreren Datenbanken zu.
  2. Erstellen Sie mehrere Datenbankinstanzen.
  3. Konfigurieren Sie Ihre App so, dass sie sich mit der für jeden Datensatz erforderlichen Echtzeitdatenbank-Instanz verbindet.

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 über Datenbankinstanzen hinweg (oder minimale gemeinsame Nutzung oder Duplizierung).
  • Jede App-Instanz verbindet sich zu einem bestimmten Zeitpunkt nur mit einer Datenbank.

Ziehen Sie beim Zuordnen Ihrer Daten in Betracht, die folgenden Strategien anzuwenden:

Erstellen Sie einen "Master-Shard"

Speichern Sie eine Übersicht darüber, wie Ihre Daten über Datenbankinstanzen hinweg gespeichert werden. Auf diese Weise können Sie programmatisch nachschlagen, welche Datenbankinstanz dem sich verbindenden Client entspricht. Beachten Sie, dass dies möglicherweise mehr Overhead verursacht als eine direkte Verbindung mit der bestimmten Datenbankinstanz, die Sie benötigen, 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 Chatanwendung erstellen, die mehreren Organisationen dient, können Sie für jede Organisation eine Datenbankinstanz erstellen und alle Chatdaten in eindeutigen Datenbankinstanzen speichern.

In diesem Fall teilen Organisation A und Organisation B keine Daten, es gibt keine doppelten Daten in Ihren Datenbanken und Sie führen nur Abfragen 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.

Sie können dann im Voraus mehrere Datenbankinstanzen erstellen und die ID der Organisation verwenden, um ein Team seiner Datenbankinstanz zuzuordnen. Beispiel: Organisation A ist der Echtzeitdatenbank A zugeordnet.

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

Erstellen Sie mehrere Echtzeitdatenbankinstanzen

Wenn Sie auf das sind Blaze Preisgestaltungsplan , können Sie mehrere Datenbankinstanzen im gleichen Firebase - Projekt.

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

  1. In der Konsole Firebase finden Sie auf die Registerkarte Daten in der Datenbank entwickeln> Abschnitt.
  2. Wählen Sie Neue Datenbank erstellen aus dem Menü im Abschnitt Datenbank in Echtzeit.
  3. Passen Sie Ihre Datenbankreferenz und Sicherheitsregeln , klicken Sie dann auf Got es.

Wiederholen Sie den Vorgang, um so viele Datenbankinstanzen wie nötig zu erstellen. Jede Datenbankinstanz verfügt über einen eigenen Satz von Firebase Realtime Database Rules, sodass Sie den Zugriff auf Ihre Daten optimieren können.

Sie können Datenbankinstanzen in der Firebase - Konsole oder mit der Erstellung und Verwaltung von Echtzeit - Datenbank - Management - REST - API .

Bearbeiten und Bereitstellen von Echtzeit-Datenbankregeln für jede Instanz

Stellen Sie sicher, dass Ihre Echtzeit-Datenbankregeln den entsprechenden Zugriff auf jede Datenbankinstanz in Ihrem Projekt zulassen. Jede Datenbank verfügt über einen eigenen Satz von Regeln, die Sie von der Konsole bearbeiten Firebase und bereitstellen können, oder die Verwendung von Firebase CLI Ziele einzusetzen .

  • Gehen Sie wie folgt vor, um Regeln über die Firebase-Konsole zu bearbeiten und bereitzustellen:

    1. Gehen Sie auf die Registerkarte Regeln in der Entwicklung> Datenbank - Seite.
    2. Wählen Sie die Datenbank aus, die Sie bearbeiten möchten, und ändern Sie dann die Regeln.
  • Gehen Sie folgendermaßen vor, um Regeln über die Firebase-CLI zu bearbeiten und bereitzustellen:

    1. Ändern Sie die Regeln in den Regeldateien für Ihre Datenbankinstanzen (zB 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 deploy Ziele:

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

      firebase deploy

Stellen Sie sicher, dass Sie Regeln konsistent von derselben Stelle aus 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 über die Firebase-CLI bereitgestellten Änderungen.

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.

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

Webversion 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);
Schnell
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// eine sekundäre Datenbankinstanz durch URL var ref Get: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Ziel c
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Holen Sie sich eine sekundäre Datenbankinstanz von URL @property (stark, nonatomic) FIRDatabaseReference * ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] Referenz];

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

Angeben einer Instanz bei Verwendung der Firebase-CLI

Verwenden Sie die --instance Option festlegen , welche Firebase Realtime - Datenbank Sie einen Firebase CLI - Befehl anwenden möchten. Verwenden Sie zum Beispiel den folgenden Befehl der Profiler für eine Datenbankinstanz auszuführen namens my-example-shard.firebaseio.com :

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 sich nur so lange wie nötig mit jeder Datenbankinstanz verbinden.

Holen Sie sich weitere Ratschläge

Wenn Sie weitere Hilfe Sharding Ihre Daten über mehrere Datenbankinstanzen benötigen, erreicht den Firebase Experten auf unserem aus Slack Kanal oder auf Stack - Überlauf .