Birden Çok Veritabanıyla Ölçeklendirme

Firebase Realtime Database içinde performansı optimize etmenin ve verilerinizi ölçeklendirmenin en iyi yolu, verilerinizi birden fazla Realtime Database örneğine bölmektir. Bu işlem, veritabanı parçalama olarak da bilinir. Parçalama, yük dengeleme ve performans optimizasyonunun yanı sıra tek tek veritabanı örnekleri için geçerli olan sınırların ötesine ölçeklendirme esnekliği sağlar.

Verilerinizi ne zaman parçalara ayırmalısınız?

Realtime Database kullanıyorsanız ve aşağıdaki senaryolardan herhangi birine uyuyorsanız verilerinizi birden fazla veritabanına bölmek isteyebilirsiniz:

  • Tek bir veritabanı örneği için 200.000 eşzamanlı bağlantı, saniyede 1.000 yazma işlemi veya diğer sınırlardan herhangi birini aşacak şekilde ölçeklendirme yapmak istiyorsanız.
  • Birden fazla ayrı veri kümeniz varsa ve performansı optimize etmek istiyorsanız (ör. ayrı, bağımsız kullanıcı gruplarına hizmet veren bir sohbet uygulaması).
  • Çalışma süresini artırmak ve tek bir veritabanı örneğinin aşırı yüklenme riskini azaltmak için yükü birden fazla veritabanı arasında dengelemek istiyorsunuz.

Verilerinizi parçalama

Verilerinizi parçalara ayırmak için aşağıdaki adımları uygulayın (aşağıda daha ayrıntılı olarak açıklanmıştır):

  1. Verilerinizi uygulamanızın özel ihtiyaçlarına göre birden fazla veritabanıyla eşleyin.
  2. Birden fazla veritabanı örneği oluşturma
  3. Uygulamanızı, her veri kümesi için gereken Realtime Database örneğine bağlanacak şekilde yapılandırın.

Verilerinizi eşleme

Verilerinizi birden fazla veritabanıyla eşlerken aşağıdaki koşulları karşılamaya çalışın:

  • Her sorgu yalnızca tek bir veritabanı örneğinde çalıştırılır. Realtime Database, veritabanı örnekleri genelinde sorguları desteklemez.
  • Veritabanı örnekleri arasında veri paylaşımı veya kopyalama yapılmaz (veya minimum düzeyde paylaşım ya da kopyalama yapılır).
  • Her uygulama örneği, belirli bir anda yalnızca bir veritabanına bağlanır.

Verilerinizi eşlerken aşağıdaki stratejileri uygulayabilirsiniz:

"Ana parça" oluşturma

Verilerinizin veritabanı örneklerinde nasıl depolandığını gösteren bir harita saklayın. Bu sayede, bağlanan istemciye hangi veritabanı örneğinin karşılık geldiğini programatik olarak arayabilirsiniz. Bu yöntemin, ihtiyaç duyduğunuzda belirli bir veritabanı örneğine doğrudan bağlanmaktan daha fazla ek yükü olabileceğini unutmayın.

Verileri kategorilere veya müşteriye göre gruplandırma

Verileri, kullanıcıya veya veri türüne göre gruplandırılmış ayrı veritabanı örneklerinde depolayın. Örneğin, birden fazla kuruluşa hizmet veren bir sohbet uygulaması geliştiriyorsanız her kuruluş için bir veritabanı örneği oluşturabilir ve tüm sohbet verilerini benzersiz veritabanı örneklerinde depolayabilirsiniz.

Bu durumda, A ve B kuruluşları veri paylaşmaz, veritabanlarınızda yinelenen veri yoktur ve yalnızca tek bir veritabanı örneğinde sorgu çalıştırırsınız. Ayrıca her kuruluştaki kullanıcılar, sohbet uygulamasını kullandıklarında yalnızca kendi kuruluşlarının veritabanına bağlanır.

Ardından önceden birkaç veritabanı örneği oluşturabilir ve kuruluşun kimliğini kullanarak bir ekibi veritabanı örneğiyle eşleyebilirsiniz. Örneğin, A kuruluşu, Realtime Database A ile eşlenir.

Uygulamanız için verileri eşleme şekliniz, özel kullanım alanınıza bağlıdır ancak yukarıda özetlenen koşullar ve stratejiler, verileriniz için neyin işe yaradığını tanımlamanıza yardımcı olabilir.

Birden fazla Realtime Database örneği oluşturma

Blaze fiyatlandırma planını kullanıyorsanız aynı Firebase projesinde en fazla 1.000 veritabanı örneği oluşturabilirsiniz.

Veritabanları bölümündeki bağlam menüsünü kullanarak Firebase konsolunda veritabanı oluşturma

  1. Firebase konsolunda Databases & Storage (Veritabanları ve Depolama) > Realtime Database (Realtime Database) > Data (Veri) sekmesine gidin.

  2. Açılır menüden Yeni veritabanı oluştur'u seçin.

  3. Veritabanı referansınızı ve Security Rules özelleştirin, ardından Anladım'ı tıklayın.

İhtiyacınız olan sayıda veritabanı örneği oluşturmak için bu işlemi tekrarlayın. Her veritabanı örneğinin kendi Firebase Realtime Database Security Rules grubu vardır. Böylece verilerinize erişimi hassas bir şekilde ayarlayabilirsiniz.

Veritabanı örneklerini Firebase konsolunda veya Realtime Database Management REST API'yi kullanarak oluşturup yönetebilirsiniz.

CLI'yı kullanarak belirli örnekleri yönetme ve bunlarla etkileşim kurma

Firebase KSA'yı kullanarak belirli Realtime Database örneklerini yönetebilir ve bunlarla etkileşim kurabilirsiniz.

CLI komutları varsayılan olarak varsayılan veritabanı örneğinizle etkileşim kurar. Ancak --instance DATABASE_NAME işaretini kullanarak varsayılan olmayan bir veritabanı örneğiyle etkileşim kurabilirsiniz.

Örneğin, my-example-shard.firebaseio.com adlı bir veritabanı örneği için profil oluşturucuyu çalıştırmak üzere aşağıdaki komutu kullanın:

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

Aşağıdaki komutlar --instance işaretini destekler:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

Her örnek için Realtime Database Security Rules öğesini düzenleyip dağıtın

Realtime Database Security Rules, projenizdeki her veritabanı örneğine uygun erişim izni verdiğinden emin olun. Her veritabanının kendi kuralları vardır. Bu kuralları Firebase konsolundan veya Firebase KSA'yı kullanarak hedefleri dağıtarak düzenleyip dağıtabilirsiniz.

  • Firebase konsolundan kuralları düzenlemek ve dağıtmak için aşağıdaki adımları uygulayın:

    1. Firebase konsolunda Databases & Storage (Veritabanları ve Depolama) > Realtime Database (Realtime Database) > Rules (Kurallar) sekmesine gidin.

    2. Düzenlemek istediğiniz veritabanını seçin, ardından kuralları değiştirin.

  • Kuralları Firebase KSA'dan düzenlemek ve dağıtmak için aşağıdaki adımları uygulayın:

    1. Veritabanı örnekleriniz için kural dosyalarındaki kuralları değiştirin (ör. foo.rules.json).

    2. Aynı kurallar dosyasını kullanan veritabanlarını ilişkilendirmek için dağıtım hedefleri oluşturup uygulayın. Örneğin:

      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3

    3. firebase.json yapılandırma dosyanızı dağıtım hedefleriyle güncelleyin:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Dağıtım komutunu çalıştırın:

      firebase deploy

Kuralları her zaman aynı yerden düzenleyip dağıttığınızdan emin olun. Firebase CLI'dan kural dağıtmak, Firebase konsolunda yaptığınız tüm düzenlemeleri geçersiz kılar. Kuralları doğrudan Firebase konsolunda düzenlemek ise Firebase CLI üzerinden dağıttığınız tüm son değişiklikleri geçersiz kılar.

Uygulamanızı birden fazla veritabanı örneğine bağlama

İkincil veritabanı örneklerinde depolanan verilere erişmek için veritabanı referansını kullanın. Belirli bir veritabanı örneğinin referansını URL veya uygulamaya göre alabilirsiniz. URL belirtmezseniz uygulamanın varsayılan veritabanı örneğinin referansını alırsınız.

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);
Swift
Not: Bu Firebase ürünü, Uygulama Klibi hedefinde kullanılamaz.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
Not: Bu Firebase ürünü, Uygulama Klibi hedefinde kullanılamaz.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by 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();

Her veritabanındaki bağlantıları optimize etme

Her istemcinin bir oturum sırasında birden fazla veritabanına bağlanması gerekiyorsa her veritabanı örneğine yalnızca gerektiği kadar bağlanarak her veritabanı örneğine yapılan eşzamanlı bağlantı sayısını azaltabilirsiniz.

Daha fazla tavsiye alın

Verilerinizi birden fazla veritabanı örneğine parçalama konusunda daha fazla yardıma ihtiyacınız varsa Slack kanalımızda veya Stack Overflow'da Firebase uzmanlarıyla iletişime geçin.