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

Лучший способ оптимизировать производительность и масштабировать данные в 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 , выполните следующие действия:

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

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

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

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

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

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

Получите дополнительную консультацию

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