Масштабирование с помощью нескольких баз данных

Лучший способ оптимизировать производительность и масштабировать данные в Firebase Realtime Database — это разделить данные между несколькими экземплярами Realtime Database , что также известно как шардинг базы данных. Шардинг дает вам гибкость для масштабирования за пределами ограничений , которые применяются к отдельным экземплярам базы данных, в дополнение к балансировке нагрузки и оптимизации производительности.

Когда следует сегментировать данные

Если вы используете Realtime Database и подходите под любой из следующих сценариев, вам может потребоваться распределить данные по нескольким базам данных:

  • Вы хотите выйти за пределы ограничения в 200 000 одновременных подключений, 1000 операций записи в секунду или любого другого ограничения для одного экземпляра базы данных.
  • У вас есть несколько отдельных наборов данных, и вы хотите оптимизировать производительность (например, приложение чата, обслуживающее отдельные независимые группы пользователей).
  • Вы хотите сбалансировать нагрузку между несколькими базами данных, чтобы улучшить время безотказной работы и снизить риск перегрузки одного экземпляра базы данных.

Как разделить ваши данные

Чтобы разделить данные, выполните следующие действия (более подробно описанные ниже):

  1. Сопоставляйте свои данные с несколькими базами данных в соответствии с конкретными потребностями вашего приложения.
  2. Создайте несколько экземпляров базы данных.
  3. Настройте свое приложение так, чтобы оно подключалось к экземпляру Realtime Database , необходимому для каждого набора данных.

Сопоставьте свои данные

При сопоставлении данных с несколькими базами данных постарайтесь выполнить следующие условия:

  • Каждый запрос выполняется только для одного экземпляра базы данных. Realtime Database не поддерживает запросы между экземплярами базы данных.
  • Отсутствие совместного использования или дублирования данных между экземплярами базы данных (или минимальное совместное использование или дублирование).
  • Каждый экземпляр приложения в любой момент времени подключается только к одной базе данных.

При картировании данных рассмотрите возможность применения следующих стратегий:

Создать «главный осколок»

Сохраните карту того, как ваши данные хранятся в экземплярах базы данных. Таким образом, вы можете программно искать, какой экземпляр базы данных соответствует подключающемуся клиенту. Имейте в виду, что это может иметь больше накладных расходов, чем прямое подключение к нужному вам экземпляру базы данных, когда вам это нужно.

Сортировка данных по категориям или по клиентам

Храните данные в изолированных экземплярах базы данных, сгруппированных по пользователю или типу данных. Например, если вы создаете приложение чата, которое обслуживает несколько организаций, вы можете создать экземпляр базы данных для каждой организации и хранить все данные чата в уникальных экземплярах базы данных.

В этом случае организация A и организация B не обмениваются данными, в ваших базах данных нет дублирующихся данных, и вы выполняете запросы только к одному экземпляру базы данных. Кроме того, пользователи в каждой организации подключаются к базе данных своей организации только тогда, когда используют приложение чата.

Затем вы можете заранее создать несколько экземпляров базы данных и использовать идентификатор организации для сопоставления команды с ее экземпляром базы данных. Например, организация A сопоставляется с Realtime Database A.

Способ сопоставления данных для вашего приложения зависит от конкретного варианта использования, но условия и стратегии, описанные выше, могут помочь вам определить, что подходит для ваших данных.

Создать несколько экземпляров Realtime Database

Если вы используете тарифный план Blaze , вы можете создать до 1000 экземпляров базы данных в одном проекте Firebase.

создайте базу данных в <span class= Консоль Firebase с контекстным меню в разделе "Базы данных" />

  1. В консоли Firebase перейдите на вкладку Данные в разделе Разработка > База данных .
  2. Выберите пункт Создать новую базу данных в меню в разделе Realtime Database .
  3. Настройте ссылку на базу данных и правила безопасности , затем нажмите «Понятно» .

Повторите процесс, чтобы создать столько экземпляров базы данных, сколько вам нужно. Каждый экземпляр базы данных имеет свой собственный набор Firebase Realtime Database Security Rules , поэтому вы можете точно настроить доступ к своим данным.

Вы можете создавать и управлять экземплярами базы данных в консоли Firebase или с помощью REST API управления базами данных в реальном времени .

Редактировать и развертывать Realtime Database Security Rules для каждого экземпляра

Убедитесь, что ваши Realtime Database Security Rules разрешают соответствующий доступ к каждому экземпляру базы данных в вашем проекте. Каждая база данных имеет свой собственный набор правил, который вы можете редактировать и развертывать из консоли Firebase или с помощью Firebase CLI для развертывания целей .

  • Чтобы редактировать и развертывать правила из консоли Firebase , выполните следующие действия:

    1. Перейдите на вкладку «Правила» в разделе «Разработка» > «База данных» .
    2. Выберите базу данных, которую вы хотите редактировать, затем измените правила.
  • Чтобы редактировать и развертывать правила из Firebase CLI, выполните следующие действия:

    1. Измените правила в файлах правил для экземпляров вашей базы данных (например, foo.rules.json ).
    2. Создайте и примените цели развертывания для ассоциированных баз данных, которые используют тот же файл правил. Например:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Обновите файл конфигурации firebase.json , указав цели развертывания:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Запустите команду развертывания:

      firebase deploy

Убедитесь, что вы последовательно редактируете и развертываете правила из одного и того же места. Развертывание правил из Firebase CLI переопределяет любые изменения, которые вы сделали в консоли Firebase , а редактирование правил непосредственно в консоли Firebase переопределяет любые недавние изменения, которые вы развертывали через Firebase CLI.

Подключите свое приложение к нескольким экземплярам базы данных

Используйте ссылку на базу данных для доступа к данным, хранящимся во вторичных экземплярах базы данных. Вы можете получить ссылку на конкретный экземпляр базы данных по URL или приложению. Если вы не укажете URL, вы получите ссылку на экземпляр базы данных по умолчанию приложения.

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);
Быстрый
Примечание: этот продукт Firebase недоступен для целевой платформы App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Получить экземпляр вторичной базы данных по URL var ref: DatabaseReference!ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
Примечание: этот продукт Firebase недоступен для целевой платформы App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Получить экземпляр вторичной базы данных по URL @property (сильный, неатомарный) 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();

Укажите экземпляр при использовании Firebase CLI

Используйте опцию --instance , чтобы указать, к какой Firebase Realtime Database вы хотите применить команду Firebase CLI. Например, используйте следующую команду, чтобы запустить профилировщик для экземпляра базы данных с именем my-example-shard.firebaseio.com :

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

Оптимизируйте соединения в каждой базе данных

Если каждому клиенту необходимо подключиться к нескольким базам данных во время сеанса, вы можете сократить количество одновременных подключений к каждому экземпляру базы данных, подключаясь к каждому экземпляру базы данных только на то время, которое необходимо.

Получить больше советов

Если вам нужна дополнительная помощь в распределении данных по нескольким экземплярам базы данных, обратитесь к экспертам Firebase на нашем канале Slack или на Stack Overflow .