Check out what’s new from Firebase at Google I/O 2022. Learn more

Skalowanie z wieloma bazami danych

Najlepszym sposobem, aby zoptymalizować i skalowania wydajności swoich danych w Firebase Realtime Database jest podział danych na wielu instancjach baz danych Realtime, znany również jako sharding bazy danych. Sharding daje elastyczność skali wykraczającej poza granice , które odnoszą się do poszczególnych instancji bazy danych, oprócz równoważenia obciążenia i optymalizacji wydajności.

Kiedy shard danych

Może chcesz shard danych w wielu bazach danych, jeśli używasz bazy danych w czasie rzeczywistym i pasują do każdego z następujących scenariuszy:

  • Chcesz przeskalować poza limitem 200.000 jednoczesnych połączeń, 1000 operacje zapisu / sekundę, lub którykolwiek z pozostałych limitów dla pojedynczej instancji bazy danych.
  • Masz wiele, oddzielnych zestawów danych i chcą zoptymalizować wydajność (na przykład aplikacja czat, który służy oddzielne, niezależne grupy użytkowników).
  • Aby zrównoważyć obciążenie w wielu bazach danych, aby poprawić czas pracy i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak shard danych

Aby shard danych, wykonaj następujące kroki (opisane szczegółowo poniżej):

  1. Mapowania danych do wielu baz danych według określonych potrzeb danej aplikacji.
  2. Tworzyć wiele instancji bazy danych.
  3. Skonfigurować aplikację tak, aby łączył się z instancją bazy danych w czasie rzeczywistym niezbędnych dla każdego zestawu danych.

Map swoje dane

Podczas mapowania danych do wielu baz danych, starają się spełniać następujące warunki:

  • Każde zapytanie działa tylko przeciwko jednej instancji bazy danych. Realtime Database nie obsługuje zapytań całej instancji bazy danych.
  • Nie udostępnianie lub powielanie danych w instancji bazy danych (lub minimalnej udostępniania lub powielania).
  • Każda instancja aplikacja łączy się tylko do jednej bazy danych w dowolnym momencie.

Jak jesteś mapowanie danych, należy rozważyć zastosowanie następujące strategie:

Tworzenie „master” odłamek

Zapisać mapę w jaki sposób dane są przechowywane w całej instancji bazy danych. W ten sposób można programowo sprawdzić które instancji bazy danych odpowiada klienta łączącego. Należy pamiętać, że może to mieć więcej niż napowietrznych bezpośrednio podłączenia do konkretnej instancji bazy danych potrzebne, kiedy jest to potrzebne.

Dane kubełkowe według kategorii lub przez klienta

Przechowywanie danych w przypadkach autonomicznych baz danych, zgrupowanych przez użytkownika lub typ danych. Na przykład, jeśli zbudować aplikację czat, który służy wiele organizacji, można utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane chat z unikalnych instancji bazy danych.

W tym przypadku organizacja A i B, nie organizacja danych akcji, nie ma żadnych zduplikowane dane w bazach danych, a jedynie wykonywać kwerendy przeciwko pojedynczej instancji bazy danych. Dodatkowo, użytkownicy w każdej organizacji podłączyć tylko do ich organizacji bazy danych przy korzystaniu z aplikacji czatu.

Następnie można utworzyć wiele instancji bazy danych z góry i wykorzystywać identyfikator organizacji mapować zespół do jego instancji bazy danych. Na przykład organizacja mapuje Realtime Database A.

Sposób mapowania danych dla aplikacji zależy od konkretnego przypadku użycia, ale warunki i strategie opisane powyżej mogą pomóc określić, co działa dla Twoich danych.

Tworzyć wiele instancji bazy danych Realtime

Jeśli jesteś na planie cenowej Blaze , można utworzyć wiele instancji bazy danych w tym samym projekcie Firebase.

utworzenie bazy danych w konsoli Firebase z menu kontekstowego w sekcji bazy danych

  1. W konsoli Firebase, przejdź do zakładki dane w Develop> Database sekcji.
  2. Wybierz opcję Utwórz nową bazę danych z menu w sekcji Realtime Database .
  3. Dostosuj swoją nazwę bazy danych i zasad bezpieczeństwa , a następnie kliknij dostał .

Powtórz ten proces, aby utworzyć wiele instancji bazy danych, jak trzeba. Każda instancja bazy danych ma swój własny zestaw Firebase Realtime regulaminu bazy danych, dzięki czemu można dostroić dostęp do swoich danych.

Można tworzyć i zarządzać instancje bazy danych w konsoli Firebase lub używając Realtime baza danych zarządzania REST API .

Edycja i wdrożyć Realtime Zasady bazy danych dla każdej instancji

Upewnij się, że Zasady Realtime Database umożliwić odpowiedni dostęp do każdej instancji bazy danych w projekcie. Każda baza danych ma swój własny zestaw reguł, które można edytować, a następnie wdrożyć z konsoli Firebase lub używając Firebase CLI wdrażać cele .

  • Aby edytować i wdrażanie zasad z konsoli Firebase, wykonaj następujące kroki:

    1. Przejdź do zakładki Rules w sekcji Develop> Database .
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikować zasady.
  • Aby edytować i wdrażanie przepisów od Firebase CLI, wykonaj następujące kroki:

    1. Zmodyfikować reguły w plikach zasady dla instancji bazy danych (na przykład foo.rules.json ).
    2. Tworzenie i stosowanie celów wdrożyć skojarzyć baz danych, które używają tego samego pliku zasadami. Na przykład:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Zaktualizować firebase.json plik konfiguracyjny z celami zapłonnika:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Uruchom komendę wdrożyć:

      firebase deploy

Upewnij się konsekwentnie edytowanie i wdrożyć przepisy z tego samego miejsca. Wdrażanie przepisów z Firebase CLI zastępuje wszelkie wprowadzone modyfikacje w konsoli Firebase i edytowanie reguły bezpośrednio w konsoli Firebase zastępuje wszelkie ostatnie zmiany już wdrożonych przez Firebase CLI.

Połącz aplikację do wielu instancji bazy danych

Użyj odwołanie do bazy danych dostępu do danych przechowywanych w instancji bazy danych wtórnych. Można uzyskać odwołanie do instancji konkretnej bazy danych za pomocą adresu URL lub aplikacji. Jeśli nie zostanie określony adres URL, dostaniesz odniesienia dla domyślnej instancji bazy danych aplikacji.

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);
Szybki
Uwaga: Ten produkt nie jest Firebase dostępny na klipie docelowej aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Pobierz drugorzędną instancji bazy danych według adresów URL var ref: DatabaseReference! Ref = Database.database ( "https://testapp-1234.firebaseio.com") .Reference ()
Cel C
Uwaga: Ten produkt nie jest Firebase dostępny na klipie docelowej aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobierz drugorzędną instancji bazy danych według adresów URL @property (silny, nonatomic) FIRDatabaseReference * ref; self.ref = [[FIRDatabase databaseWithURL: @ "https://testapp-1234.firebaseio.com"] odniesienia];

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

Określić wystąpienie podczas korzystania z Firebase CLI

Użyj --instance opcję , aby określić, które Firebase Realtime Database chcesz zastosować polecenie Firebase CLI do. Na przykład, należy użyć następującego polecenia, aby uruchomić profilera dla instancji bazy danych o nazwie my-example-shard.firebaseio.com :

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

Optymalizacji połączenia na każdej bazy danych

Jeśli każdy klient musi połączyć się z wielu baz danych w trakcie sesji, można zmniejszyć liczbę jednoczesnych połączeń do każdej instancji bazy danych po podłączeniu do każdej instancji bazy danych jedynie tak długo, jak jest to konieczne.

Uzyskaj więcej porad

Jeśli potrzebujesz więcej pomocy sharding swoje dane w wielu przypadkach bazy danych, dotrzeć do ekspertów Firebase na naszym kanale Slack lub na przepełnienie stosu .