Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Bazie danych czasu rzeczywistego Firebase jest podzielenie danych na wiele instancji Bazy danych czasu rzeczywistego, znane również jako sharding bazy danych. Sharding zapewnia elastyczność skalowania poza ograniczeniami , które mają zastosowanie do poszczególnych instancji bazy danych, oprócz równoważenia obciążenia i optymalizacji wydajności.

Kiedy shardować dane

Możesz podzielić swoje dane na fragmenty w wielu bazach danych, jeśli używasz bazy danych czasu rzeczywistego i pasujesz do dowolnego z następujących scenariuszy:

  • Chcesz skalować poza limit 200 000 jednoczesnych połączeń, 1 000 operacji zapisu na sekundę lub dowolny inny limit dla pojedynczego wystąpienia bazy danych.
  • Masz wiele oddzielnych zestawów danych i chcesz zoptymalizować wydajność (na przykład aplikacja do czatu obsługująca oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie wielu baz danych, aby skrócić czas pracy bez przestojów i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić swoje dane

Aby podzielić swoje dane na fragmenty, wykonaj następujące kroki (opisane bardziej szczegółowo poniżej):

  1. Mapuj swoje dane do wielu baz danych zgodnie z konkretnymi potrzebami Twojej aplikacji.
  2. Twórz wiele instancji bazy danych.
  3. Skonfiguruj swoją aplikację tak, aby łączyła się z instancją bazy danych czasu rzeczywistego niezbędną dla każdego zestawu danych.

Mapuj swoje dane

Podczas mapowania danych do wielu baz danych spróbuj spełnić następujące warunki:

  • Każde zapytanie jest uruchamiane tylko w odniesieniu do jednej instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań między instancjami bazy danych.
  • Brak udostępniania lub powielania danych między instancjami baz danych (lub minimalne udostępnianie lub duplikowanie).
  • Każda instancja aplikacji łączy się w danym momencie tylko z jedną bazą danych.

Podczas mapowania danych rozważ zastosowanie następujących strategii:

Utwórz „odłamek główny”

Przechowuj mapę sposobu przechowywania danych w różnych instancjach bazy danych. W ten sposób można programowo sprawdzić, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wiązać się z większym obciążeniem niż bezpośrednie łączenie się z konkretną instancją bazy danych, której potrzebujesz, kiedy jej potrzebujesz.

Dane wiadra według kategorii lub według klientów

Przechowuj dane w izolowanych instancjach baz danych, pogrupowanych według użytkownika lub typu danych. Na przykład, jeśli tworzysz aplikację czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikatowych instancjach bazy danych.

W takim przypadku organizacja A i organizacja B nie współdzielą danych, w Twoich bazach danych nie ma żadnych zduplikowanych danych, a zapytania są wykonywane tylko w odniesieniu do pojedynczej instancji bazy danych. Ponadto użytkownicy w każdej organizacji łączą się z bazą danych swojej organizacji tylko wtedy, gdy korzystają z aplikacji czatu.

Następnie można wcześniej utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji do mapowania zespołu na jego instancję bazy danych. Na przykład organizacja A jest odwzorowywana na bazę danych czasu rzeczywistego A.

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

Twórz wiele instancji bazy danych czasu rzeczywistego

Jeśli korzystasz z planu cenowego Blaze , możesz utworzyć do 1000 instancji bazy danych w tym samym projekcie Firebase.

utwórz bazę danych w konsoli Firebase z menu kontekstowym w sekcji baz danych

  1. W konsoli Firebase przejdź do zakładki Dane w sekcji Programowanie > Baza danych .
  2. Wybierz opcję Utwórz nową bazę danych z menu w sekcji Baza danych czasu rzeczywistego .
  3. Dostosuj odwołanie do bazy danych i reguły bezpieczeństwa , a następnie kliknij Gotowe .

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw reguł bezpieczeństwa bazy danych czasu rzeczywistego Firebase, dzięki czemu możesz dostosować dostęp do swoich danych.

Możesz tworzyć instancje baz danych i zarządzać nimi w konsoli Firebase lub przy użyciu interfejsu API REST zarządzania bazą danych w czasie rzeczywistym .

Edytuj i wdrażaj reguły bezpieczeństwa bazy danych czasu rzeczywistego dla każdej instancji

Upewnij się, że Reguły bezpieczeństwa bazy danych czasu rzeczywistego zezwalają na odpowiedni dostęp do każdej instancji bazy danych w Twoim projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać z poziomu konsoli Firebase lub za pomocą interfejsu wiersza polecenia Firebase do wdrażania celów .

  • Aby edytować i wdrażać reguły z konsoli Firebase, wykonaj te czynności:

    1. Przejdź do zakładki Reguły w sekcji Programowanie > Baza danych .
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
  • Aby edytować i wdrożyć reguły z Firebase CLI, wykonaj te czynności:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (na przykład foo.rules.json ).
    2. Twórz i stosuj cele wdrażania, aby powiązać bazy danych korzystające z tego samego pliku reguł. Na przykład:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Zaktualizuj plik konfiguracyjny firebase.json o cele wdrażania:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Uruchom polecenie wdrażania:

      firebase deploy

Upewnij się, że konsekwentnie edytujesz i wdrażasz reguły z tego samego miejsca. Wdrażanie reguł z Firebase CLI zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie ostatnie zmiany wdrożone przez Firebase CLI.

Połącz swoją aplikację z wieloma instancjami bazy danych

Użyj odniesienia do bazy danych, aby uzyskać dostęp do danych przechowywanych w instancjach dodatkowej bazy danych. Możesz uzyskać odwołanie do określonej instancji bazy danych za pomocą adresu URL lub aplikacji. Jeśli nie określisz adresu URL, otrzymasz odwołanie do domyślnego wystąpienia bazy danych aplikacji.

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

ref = Database.database().reference()
// Uzyskaj dodatkową instancję bazy danych za pomocą adresu URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Cel C
Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobierz instancję dodatkowej bazy danych za pomocą adresu URL @property (mocny, nieatomowy) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] odniesienie];

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

Określ instancję podczas korzystania z interfejsu wiersza polecenia Firebase

Użyj opcji --instance , aby określić, do której bazy danych czasu rzeczywistego Firebase chcesz zastosować polecenie Firebase CLI. Na przykład użyj następującego polecenia, aby uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com :

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

Zoptymalizuj połączenia w każdej bazie danych

Jeśli każdy klient musi łączyć się z wieloma bazami danych podczas sesji, można zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą instancją bazy danych tylko tak długo, jak to konieczne.

Uzyskaj więcej porad

Jeśli potrzebujesz dodatkowej pomocy przy dzieleniu danych na wiele instancji bazy danych, skontaktuj się z ekspertami Firebase za pośrednictwem naszego kanału Slack lub Stack Overflow .

,

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Bazie danych czasu rzeczywistego Firebase jest podzielenie danych na wiele instancji Bazy danych czasu rzeczywistego, znane również jako sharding bazy danych. Sharding zapewnia elastyczność skalowania poza ograniczeniami , które mają zastosowanie do poszczególnych instancji bazy danych, oprócz równoważenia obciążenia i optymalizacji wydajności.

Kiedy shardować dane

Możesz podzielić swoje dane na fragmenty w wielu bazach danych, jeśli używasz bazy danych czasu rzeczywistego i pasujesz do dowolnego z następujących scenariuszy:

  • Chcesz skalować poza limit 200 000 jednoczesnych połączeń, 1 000 operacji zapisu na sekundę lub dowolny inny limit dla pojedynczego wystąpienia bazy danych.
  • Masz wiele oddzielnych zestawów danych i chcesz zoptymalizować wydajność (na przykład aplikacja do czatu obsługująca oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie wielu baz danych, aby skrócić czas pracy bez przestojów i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić swoje dane

Aby podzielić swoje dane na fragmenty, wykonaj następujące kroki (opisane bardziej szczegółowo poniżej):

  1. Mapuj swoje dane do wielu baz danych zgodnie z konkretnymi potrzebami Twojej aplikacji.
  2. Twórz wiele instancji bazy danych.
  3. Skonfiguruj swoją aplikację tak, aby łączyła się z instancją bazy danych czasu rzeczywistego niezbędną dla każdego zestawu danych.

Mapuj swoje dane

Podczas mapowania danych do wielu baz danych spróbuj spełnić następujące warunki:

  • Każde zapytanie jest uruchamiane tylko w odniesieniu do jednej instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań między instancjami bazy danych.
  • Brak udostępniania lub powielania danych między instancjami baz danych (lub minimalne udostępnianie lub duplikowanie).
  • Każda instancja aplikacji łączy się w danym momencie tylko z jedną bazą danych.

Podczas mapowania danych rozważ zastosowanie następujących strategii:

Utwórz „odłamek główny”

Przechowuj mapę sposobu przechowywania danych w różnych instancjach bazy danych. W ten sposób można programowo sprawdzić, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wiązać się z większym obciążeniem niż bezpośrednie łączenie się z konkretną instancją bazy danych, której potrzebujesz, kiedy jej potrzebujesz.

Dane wiadra według kategorii lub według klientów

Przechowuj dane w izolowanych instancjach baz danych, pogrupowanych według użytkowników lub typów danych. Na przykład, jeśli tworzysz aplikację czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikatowych instancjach bazy danych.

W takim przypadku organizacja A i organizacja B nie współdzielą danych, w Twoich bazach danych nie ma żadnych zduplikowanych danych, a zapytania są wykonywane tylko w odniesieniu do pojedynczej instancji bazy danych. Ponadto użytkownicy w każdej organizacji łączą się z bazą danych swojej organizacji tylko wtedy, gdy korzystają z aplikacji czatu.

Następnie można wcześniej utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji do mapowania zespołu na jego instancję bazy danych. Na przykład organizacja A jest odwzorowywana na bazę danych czasu rzeczywistego A.

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

Twórz wiele instancji bazy danych czasu rzeczywistego

Jeśli korzystasz z planu cenowego Blaze , możesz utworzyć do 1000 instancji bazy danych w tym samym projekcie Firebase.

utwórz bazę danych w konsoli Firebase z menu kontekstowym w sekcji baz danych

  1. W konsoli Firebase przejdź do zakładki Dane w sekcji Programowanie > Baza danych .
  2. Wybierz opcję Utwórz nową bazę danych z menu w sekcji Baza danych czasu rzeczywistego .
  3. Dostosuj odwołanie do bazy danych i reguły bezpieczeństwa , a następnie kliknij Gotowe .

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw reguł bezpieczeństwa bazy danych czasu rzeczywistego Firebase, dzięki czemu możesz dostosować dostęp do swoich danych.

Możesz tworzyć instancje baz danych i zarządzać nimi w konsoli Firebase lub przy użyciu interfejsu API REST zarządzania bazą danych w czasie rzeczywistym .

Edytuj i wdrażaj reguły bezpieczeństwa bazy danych czasu rzeczywistego dla każdej instancji

Upewnij się, że Reguły bezpieczeństwa bazy danych czasu rzeczywistego zezwalają na odpowiedni dostęp do każdej instancji bazy danych w Twoim projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać z poziomu konsoli Firebase lub za pomocą interfejsu wiersza polecenia Firebase do wdrażania celów .

  • Aby edytować i wdrażać reguły z konsoli Firebase, wykonaj te czynności:

    1. Przejdź do zakładki Reguły w sekcji Programowanie > Baza danych .
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
  • Aby edytować i wdrożyć reguły z Firebase CLI, wykonaj te czynności:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (na przykład foo.rules.json ).
    2. Twórz i stosuj cele wdrażania, aby powiązać bazy danych korzystające z tego samego pliku reguł. Na przykład:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Zaktualizuj plik konfiguracyjny firebase.json o cele wdrażania:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Uruchom polecenie wdrażania:

      firebase deploy

Upewnij się, że konsekwentnie edytujesz i wdrażasz reguły z tego samego miejsca. Wdrażanie reguł z Firebase CLI zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie ostatnie zmiany wdrożone przez Firebase CLI.

Połącz swoją aplikację z wieloma instancjami bazy danych

Użyj odniesienia do bazy danych, aby uzyskać dostęp do danych przechowywanych w instancjach dodatkowej bazy danych. Możesz uzyskać odwołanie do określonej instancji bazy danych za pomocą adresu URL lub aplikacji. Jeśli nie określisz adresu URL, otrzymasz odwołanie do domyślnego wystąpienia bazy danych aplikacji.

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

ref = Database.database().reference()
// Uzyskaj dodatkową instancję bazy danych za pomocą adresu URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Cel C
Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobierz instancję dodatkowej bazy danych za pomocą adresu URL @property (mocny, nieatomowy) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] odniesienie];

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

Określ instancję podczas korzystania z interfejsu wiersza polecenia Firebase

Użyj opcji --instance , aby określić, do której bazy danych czasu rzeczywistego Firebase chcesz zastosować polecenie Firebase CLI. Na przykład użyj następującego polecenia, aby uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com :

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

Zoptymalizuj połączenia w każdej bazie danych

Jeśli każdy klient musi łączyć się z wieloma bazami danych podczas sesji, można zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą instancją bazy danych tylko tak długo, jak to konieczne.

Uzyskaj więcej porad

Jeśli potrzebujesz dodatkowej pomocy przy dzieleniu danych na wiele instancji bazy danych, skontaktuj się z ekspertami Firebase za pośrednictwem naszego kanału Slack lub Stack Overflow .