Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

여러 데이터베이스로 확장

Firebase 실시간 데이터베이스에서 성능을 최적화하고 데이터를 확장하는 가장 좋은 방법은 데이터베이스 샤딩이라고도 하는 여러 실시간 데이터베이스 인스턴스에 데이터를 분할하는 것입니다. 샤딩은 로드 밸런싱 및 성능 최적화 외에도 개별 데이터베이스 인스턴스에 적용되는 제한 이상으로 확장할 수 있는 유연성을 제공합니다.

데이터를 샤딩해야 하는 경우

실시간 데이터베이스를 사용 중이고 다음 시나리오 중 하나에 해당하는 경우 여러 데이터베이스에 걸쳐 데이터를 분할할 수 있습니다.

  • 200,000 동시 연결, 1,000 쓰기 작업/초 또는 단일 데이터베이스 인스턴스에 대한 기타 제한 을 초과하여 확장하려고 합니다.
  • 여러 개의 개별 데이터 세트가 있고 성능을 최적화하려고 합니다(예: 별도의 독립적인 사용자 그룹에 서비스를 제공하는 채팅 앱).
  • 여러 데이터베이스에 걸쳐 로드 균형을 조정하여 가동 시간을 개선하고 단일 데이터베이스 인스턴스에 과부하가 걸리는 위험을 줄이려고 합니다.

데이터를 샤딩하는 방법

데이터를 샤딩하려면 다음 단계를 따르십시오(아래에서 자세히 설명).

  1. 앱의 특정 요구 사항에 따라 데이터를 여러 데이터베이스에 매핑합니다.
  2. 여러 데이터베이스 인스턴스를 만듭니다.
  3. 각 데이터 세트에 필요한 실시간 데이터베이스 인스턴스에 연결하도록 앱을 구성합니다.

데이터 매핑

데이터를 여러 데이터베이스에 매핑하는 경우 다음 조건을 충족하도록 하십시오.

  • 각 쿼리는 단일 데이터베이스 인스턴스에 대해서만 실행됩니다. 실시간 데이터베이스는 데이터베이스 인스턴스 간의 쿼리를 지원하지 않습니다.
  • 데이터베이스 인스턴스 간에 데이터를 공유하거나 복제하지 않습니다(또는 최소한의 공유 또는 복제).
  • 각 앱 인스턴스는 주어진 순간에 하나의 데이터베이스에만 연결됩니다.

데이터를 매핑할 때 다음 전략을 적용하는 것이 좋습니다.

"마스터 샤드" 생성

데이터베이스 인스턴스에서 데이터가 저장되는 방식에 대한 맵을 저장합니다. 이렇게 하면 연결 클라이언트에 해당하는 데이터베이스 인스턴스를 프로그래밍 방식으로 조회할 수 있습니다. 필요할 때 필요한 특정 데이터베이스 인스턴스에 직접 연결하는 것보다 오버헤드가 더 많을 수 있습니다.

카테고리별 또는 고객별 버킷 데이터

사용자 또는 데이터 유형별로 그룹화된 사일로 데이터베이스 인스턴스에 데이터를 저장합니다. 예를 들어 여러 조직에 서비스를 제공하는 채팅 응용 프로그램을 구축하는 경우 각 조직에 대한 데이터베이스 인스턴스를 만들고 모든 채팅 데이터를 고유한 데이터베이스 인스턴스에 저장할 수 있습니다.

이 경우 조직 A와 조직 B는 데이터를 공유하지 않고 데이터베이스에 중복 데이터가 없으며 단일 데이터베이스 인스턴스에 대해서만 쿼리를 수행합니다. 또한 각 조직의 사용자는 채팅 앱을 사용할 때만 조직의 데이터베이스에 연결합니다.

그런 다음 미리 여러 ​​데이터베이스 인스턴스를 만들고 조직의 ID를 사용하여 팀을 해당 데이터베이스 인스턴스에 매핑할 수 있습니다. 예를 들어 조직 A는 실시간 데이터베이스 A에 매핑됩니다.

앱에 대한 데이터를 매핑하는 방법은 특정 사용 사례에 따라 다르지만 위에 설명된 조건과 전략은 데이터에 적합한 항목을 정의하는 데 도움이 될 수 있습니다.

여러 실시간 데이터베이스 인스턴스 생성

Blaze 요금제 를 사용 중인 경우 동일한 Firebase 프로젝트에서 여러 데이터베이스 인스턴스를 만들 수 있습니다.

데이터베이스 섹션의 컨텍스트 메뉴를 사용하여 Firebase 콘솔에서 데이터베이스 생성

  1. Firebase 콘솔에서 개발 > 데이터베이스 섹션의 데이터 탭으로 이동합니다.
  2. 실시간 데이터베이스 섹션의 메뉴에서 새 데이터베이스 만들기 를 선택합니다.
  3. 데이터베이스 참조보안 규칙 을 사용자 정의한 다음 확인을 클릭합니다 .

이 프로세스를 반복하여 필요한 만큼 데이터베이스 인스턴스를 만듭니다. 각 데이터베이스 인스턴스에는 자체 Firebase 실시간 데이터베이스 규칙 세트가 있으므로 데이터에 대한 액세스를 미세 조정할 수 있습니다.

Firebase 콘솔에서 또는 Realtime Database Management REST API 를 사용하여 데이터베이스 인스턴스를 만들고 관리할 수 있습니다.

각 인스턴스에 대한 실시간 데이터베이스 규칙 편집 및 배포

실시간 데이터베이스 규칙이 프로젝트의 각 데이터베이스 인스턴스에 대한 적절한 액세스를 허용하는지 확인하십시오. 각 데이터베이스에는 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 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! 참조 = Database.database("https://testapp-1234.firebaseio.com").reference()
오브젝티브-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"] 참조];

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 CLI를 사용할 때 인스턴스 지정

--instance 옵션 을 사용하여 Firebase CLI 명령을 적용할 Firebase 실시간 데이터베이스를 지정합니다. 예를 들어 다음 명령을 사용하여 my-example-shard.firebaseio.com 이라는 데이터베이스 인스턴스에 대한 프로파일러를 실행합니다.

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

각 데이터베이스의 연결 최적화

각 클라이언트가 세션 중에 여러 데이터베이스에 연결해야 하는 경우 필요한 기간 동안만 각 데이터베이스 인스턴스에 연결하여 각 데이터베이스 인스턴스에 대한 동시 연결 수를 줄일 수 있습니다.

더 많은 조언 받기

여러 데이터베이스 인스턴스 간에 데이터를 분할하는 데 도움이 더 필요한 경우 Slack 채널 또는 Stack Overflow 에서 Firebase 전문가에게 문의하세요.