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, co jest nazywane fragmentowaniem 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 podzielić dane?

Możesz chcieć podzielić swoje dane między wiele baz danych, jeśli używasz Bazy danych czasu rzeczywistego i pasujesz do jednego 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 dyskretnych zestawów danych i chcesz zoptymalizować wydajność (na przykład aplikacja do czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie w wielu bazach danych, aby skrócić czas pracy i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić swoje dane

Aby podzielić swoje dane, 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. Utwó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 działa tylko w jednej instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań między instancjami bazy danych.
  • Brak udostępniania lub duplikowania danych między instancjami bazy danych (lub minimalne udostępnianie lub duplikowanie).
  • Każda instancja aplikacji łączy się tylko z jedną bazą danych w danym momencie.

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

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

Przechowuj mapę przechowywania danych w instancjach bazy danych. W ten sposób można programowo wyszukać, 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 zasobnika według kategorii lub według klienta

Przechowuj dane w silosowych instancjach bazy danych, pogrupowanych według użytkownika lub typu danych. Na przykład, jeśli tworzysz aplikację czatu obsługującą wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikalnych instancjach bazy danych.

W takim przypadku organizacja A i organizacja B nie współużytkują danych, w Twoich bazach danych nie ma zduplikowanych danych, a zapytania wykonujesz tylko w jednym wystąpieniu 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żesz wcześniej utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji, aby zmapować zespół na instancję bazy danych. Na przykład organizacja A mapuje do Bazy danych czasu rzeczywistego A.

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

Utwórz wiele instancji Bazy Danych Czasu Rzeczywistego

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

utwórz bazę danych w konsoli Firebase za pomocą 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ć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw reguł bazy danych czasu rzeczywistego Firebase, dzięki czemu możesz dostosować 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 .

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

Upewnij się, że reguły bazy danych czasu rzeczywistego umożliwiają 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żać reguły 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 zmodyfikuj reguły.
  • Aby edytować i wdrażać reguły z interfejsu wiersza polecenia Firebase, wykonaj następujące kroki:

    1. Zmodyfikować reguły w plikach zasady dla instancji bazy danych (na przykład foo.rules.json ).
    2. Utwórz i zastosuj cele wdrażania, aby skojarzyć bazy danych, które używają 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. 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ę, że konsekwentnie edytujesz i wdrażasz reguły z tego samego miejsca. Wdrożenie reguł z interfejsu Firebase CLI zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie zmiany wprowadzone ostatnio za pomocą interfejsu Firebase.

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

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

Wersja internetowa 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);

Wersja internetowa 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
// 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
// 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"] referencja];

Jawa

// 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śl instancję podczas korzystania z interfejsu wiersza polecenia Firebase

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"

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 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 .