Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

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

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

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

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

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

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

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

Создайте "главный осколок"

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

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

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

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

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

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

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

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

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

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

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

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

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

Убедитесь, что ваши правила базы данных реального времени разрешают соответствующий доступ к каждому экземпляру базы данных в вашем проекте. Каждая база данных имеет свой собственный набор правил, которые можно редактировать и развертывать с консоли 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 конфигурационный файл с целями Deploy:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Выполните команду Deploy:

      firebase deploy

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

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

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

Веб-версия 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);

Веб-версия 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);
Быстрый
// Get the default database instance for an app
var ref: DatabaseReference!

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

self.ref = [[FIRDatabase database] reference];
// Получить дополнительный экземпляр базы данных по URL @property (сильный, неатомический) FIRDatabaseReference * исй; self.ref = [[FIRDatabase databaseWithURL: @ "https://testapp-1234.firebaseio.com"] ссылка];

Джава

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

Котлин + 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 в режиме реального времени базы данных вы хотите применить команду Firebase CLI для. Например, можно использовать следующую команду , чтобы запустить профайлер для экземпляра базы данных с именем my-example-shard.firebaseio.com :

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

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

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

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

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