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

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

Когда разбивать ваши данные

Вы можете захотеть разбить данные по нескольким базам данных, если вы используете базу данных реального времени и соответствуете любому из следующих сценариев:

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

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

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

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

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

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

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

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

Создайте «мастер-осколок»

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

Данные сегмента по категориям или по клиентам

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

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

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

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

Создание нескольких экземпляров базы данных реального времени

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

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

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

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

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

Отредактируйте и разверните правила базы данных в реальном времени для каждого экземпляра.

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

  • Чтобы изменить и развернуть правила из консоли 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 переопределяет любые изменения, внесенные вами в консоли Firebase, а редактирование правил непосредственно в консоли Firebase переопределяет все последние изменения, развернутые вами через интерфейс командной строки Firebase.

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

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

Web version 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);

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

ref = Database.database().reference()
// Получить экземпляр вторичной базы данных по URL-адресу var ref: DatabaseReference! ссылка = База данных.база данных("https://testapp-1234.firebaseio.com").ссылка()
Цель-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 = [[База данных FIRDatabaseWithURL: @"https://testapp-1234.firebaseio.com"] ссылка];

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

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

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

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

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

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

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

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

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