Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Firebase Realtime Database jest podzielenie danych na kilka Realtime Database instancji, czyli tzw. fragmentowanie bazy danych. Dzielenie na partycje zapewnia elastyczność skalowania poza limity obowiązujące w przypadku poszczególnych instancji bazy danych, a także równoważenie obciążenia i optymalizację wydajności.

Kiedy dzielić dane na partycje

Możesz podzielić dane na kilka baz danych, jeśli używasz Realtime Database i spełniasz jeden z tych warunków:

  • Chcesz zwiększyć skalę poza limit 200 000 równoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolny inny limit dla pojedynczej instancji bazy danych.
  • Masz kilka odrębnych zbiorów danych i chcesz zoptymalizować skuteczność (np. aplikacja do czatowania, która obsługuje oddzielne, niezależne grupy użytkowników).
  • Chcesz równoważyć obciążenie między wieloma bazami danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak dzielić dane na partycje

Aby podzielić dane na fragmenty, wykonaj te czynności (szczegółowo opisane poniżej):

  1. Mapuj dane na wiele baz danych zgodnie z potrzebami aplikacji.
  2. utworzyć wiele instancji bazy danych,
  3. Skonfiguruj aplikację tak, aby łączyła się z instancją Realtime Database niezbędną dla każdego zbioru danych.

Mapowanie danych

Podczas mapowania danych na wiele baz danych staraj się spełnić te warunki:

  • Każde zapytanie jest wykonywane tylko w jednej instancji bazy danych. Realtime Database nie obsługuje zapytań dotyczących instancji baz danych.
  • Brak udostępniania ani duplikowania danych między instancjami bazy danych (lub minimalne udostępnianie lub duplikowanie).
  • Każda instancja aplikacji może być w danym momencie połączona tylko z 1 bazą danych.

Podczas mapowania danych możesz zastosować te strategie:

Utwórz „główny fragment”

Przechowywanie mapy sposobu przechowywania danych w instancjach bazy danych. Dzięki temu możesz programowo sprawdzić, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wiązać się z większymi kosztami niż bezpośrednie łączenie się z konkretną instancją bazy danych, gdy jest to potrzebne.

Grupowanie danych według kategorii lub klientów

Przechowywanie danych w odseparowanych instancjach baz danych pogrupowanych według użytkownika lub typu danych. Jeśli na przykład tworzysz aplikację do czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej z nich i przechowywać wszystkie dane czatu w unikalnych instancjach bazy danych.

W tym przypadku organizacje A i B nie udostępniają sobie danych, w bazach danych nie ma zduplikowanych danych, a zapytania są wykonywane tylko w jednej instancji bazy danych. Dodatkowo użytkownicy w każdej organizacji łączą się z bazą danych organizacji tylko wtedy, gdy korzystają z aplikacji do czatowania.

Możesz z wyprzedzeniem utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji, aby przypisać zespół do jego instancji bazy danych. Na przykład organizacja A jest mapowana na bazę danych w czasie rzeczywistym A.

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

Tworzenie wielu instancji Realtime Database

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

utworzyć bazę danych w usłudze <span class=Konsola Firebase z menu kontekstowym w sekcji baz danych" />

  1. W konsoli Firebase otwórz kartę Dane w sekcji Programowanie > Baza danych.
  2. W menu w sekcji Realtime Database wybierz Utwórz nową bazę danych.
  3. Dostosuj odwołanie do bazy danych i reguły zabezpieczeń, a następnie kliknij OK.

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw Firebase Realtime Database Security Rules, dzięki czemu możesz precyzyjnie dostosować dostęp do danych.

Instancje bazy danych możesz tworzyć i nimi zarządzać w Firebase konsoli lub za pomocą interfejsu Realtime Database Management REST API.

Edytowanie i wdrażanie Realtime Database Security Rules w każdej instancji

Sprawdź, czy Twoje Realtime Database Security Rules zapewniają odpowiedni dostęp do każdej instancji bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać z poziomu Firebase konsoli lub za pomocą Firebase interfejsu CLI do wdrażania celów.

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

    1. Otwórz kartę Reguły w sekcji Programowanie > Baza danych.
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
  • Aby edytować i wdrażać reguły z interfejsu wiersza poleceń Firebase, wykonaj te czynności:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (np. foo.rules.json).
    2. Twórz i stosuj cele wdrażania, aby powiązać bazy danych, które korzystają z tego samego pliku reguł. 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 konfiguracji firebase.json o miejsca wdrożenia:

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

      firebase deploy

Pamiętaj, aby reguły były edytowane i wdrażane zawsze w tym samym miejscu. Wdrożenie reguł z Firebase interfejsu wiersza poleceń zastępuje wszelkie zmiany wprowadzone w Firebase konsoli, a edytowanie reguł bezpośrednio w Firebase konsoli zastępuje wszelkie ostatnie zmiany wdrożone za pomocą Firebase interfejsu wiersza poleceń.

Łączenie aplikacji z wieloma instancjami bazy danych

Użyj odwołania do bazy danych, aby uzyskać dostęp do danych przechowywanych w instancjach dodatkowych baz danych. Możesz uzyskać odniesienie do konkretnej instancji bazy danych według adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odniesienie do domyślnej instancji bazy danych aplikacji.

Web

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

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);
Swift
Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Uzyskiwanie drugiego wystąpienia bazy danych według adresu URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin

// 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ślanie instancji podczas korzystania z wiersza poleceń Firebase

Użyj opcji --instance, aby określić, do którego Firebase Realtime Database chcesz zastosować polecenie wiersza poleceń Firebase. Aby na przykład uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com, użyj tego polecenia:

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

Optymalizowanie połączeń w każdej bazie danych

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

Więcej porad

Jeśli potrzebujesz więcej pomocy w zakresie dzielenia danych na wiele instancji bazy danych, skontaktuj się z ekspertami Firebase na naszym kanale Slack lub na Stack Overflow.