DBAtlas · Veritabanı operasyon atlası

Referans Mimari: Yüksek ölçek / yüksek trafik

Trafik büyüdükçe veritabanını korumanın doğru sırası vardır: önce basit ve ucuz kaldıraçları, sonra karmaşık olanları. Bu ağaç; dikey büyütme → okuma replikası → sharding sırasını, önbellek desenlerini (cache-aside, write-back), kuyrukla tampon + backpressure, rate limiting ve bulkhead/circuit breaker ile veritabanını izole etmeyi, ayrıca hotspot önlemeyi adım adım ele alır. Temel ilke: sharding gibi geri dönüşü zor kararları en sona sakla, önce ucuz kazanımları tüket.

Darboğaz nerede: tek örnek doyuyor mu, okuma mı yazma mı ağır, yoksa trafik dalgalı mı?

Ölçek sorununu doğru yerden çözmek için önce darboğazı tanımla. Tek örnek CPU/bellek olarak mı doyuyor, okuma mı baskın, yazma mı sınırı zorluyor, yoksa ani trafik sıçramaları mı veritabanını eziyor? Her biri farklı bir bileşeni işaret eder.

  • Tek örnek doyuyor; henüz basit kaldıraçları denemedim
  • Okuma çok ağır ve büyüyor
  • Ani trafik sıçramaları / dalgalı yük DB'yi eziyor

Hangi ölçekleme adımındasın: dikey mi, okuma replikası mı, sharding mı?

Ölçeklemenin doğru sırası vardır. Önce dikey büyütme (daha güçlü donanım) en basitidir; sonra okumaları replikalara dağıtırsın; ancak tek primary yazmayı kaldıramaz hale gelince yatay bölmeye (sharding) geçilir. Hangi noktadasın?

  • Henüz donanımı büyütmedim / basit ayarları tüketmedim
  • Yazma tek örnekte, okuma yükünü dağıtmam lazım
  • Tek primary yazma yükünü artık kaldıramıyor

Veritabanını yükten nasıl koruyacaksın: tampon mu, sınırlama mı, izolasyon mu?

Ölçekleme her zaman DB'yi büyütmek değildir; çoğu zaman DB'yi aşırı yükten korumaktır. Ani yazma sıçramalarını bir kuyrukla mı yumuşatacaksın, gelen istek hızını mı sınırlayacaksın (rate limit), yoksa tek bir bağımlılığın tüm sistemi çökertmesini mi engelleyeceksin (bulkhead/circuit breaker)?

  • Ani yazma sıçramalarını yumuşatmak istiyorum
  • Gelen istek hızını sınırlamak/adil paylaştırmak istiyorum
  • Bir bağımlılığın çökmesi tüm sistemi devirmesin istiyorum

Öneri: Önce dikey büyütme ve temel ayar

En ucuz ve en az riskli adım dikey ölçeklemedir: daha fazla CPU/RAM/hızlı disk vermek ve temel ayarları (index, bağlantı havuzu, bellek parametreleri) düzeltmek. Sharding gibi karmaşık kararlardan önce bu kazanımları tüket.

Öneri: Okuma replikalarıyla okumayı dağıt

Yazma tek primary'de kalırken salt-okuma trafiğini bir veya daha fazla replikaya dağıtırsın. Sharding'e göre çok daha basittir ve okuma baskın yüklerin büyük kısmını çözer; primary yalnızca yazma ve tutarlılık kritik okumalar için kalır.

Öneri: Sharding (yatay bölme) — en son çare

Tek primary yazma yükünü kaldıramadığında veriyi bir anahtara göre birden çok bağımsız parçaya (shard) bölersin; her shard yazmanın bir kısmını üstlenir. Güçlü ama geri dönüşü zor bir karardır; çapraz-shard sorgu ve transaction'ları zorlaştırır, bu yüzden en sona bırakılır.

Öneri: Önbellek desenleri (cache-aside + write-back)

Okuma baskın yüksek trafikte DB'nin önüne bir bellek-içi önbellek (Redis) koyup okumaların çoğunu DB'ye hiç ulaştırmadan karşılarsın. Yüksek hacimli yazmalarda ise write-back ile yazmayı tamponlayıp DB'ye toplu aktararak primary'yi rahatlatırsın.

Öneri: Kuyrukla tampon (backpressure)

Ani yazma sıçramaları DB'yi doğrudan ezmesin diye araya dayanıklı bir kuyruk (ör. Kafka/mesaj kuyruğu) koyar, yazmaları DB'nin kaldırabileceği hızda tüketirsin. Kuyruk sıçramayı emer; sistem senkron çökme yerine kontrollü gecikmeyle çalışır (backpressure).

Öneri: Rate limiting (istek hızını sınırla)

Gelen istekleri kaynağa göre sınırlayarak (rate limit) hem kötüye kullanımı hem de tek bir istemcinin tüm kaynağı tüketmesini engellersin. DB'ye ulaşan yükü tavandan keserek sistemi öngörülebilir ve adil tutarsın.

Öneri: Bulkhead + circuit breaker (izolasyon)

Bir bağımlılığın (ör. yavaşlayan DB veya harici servis) tüm sistemi çökertmesini önlemek için kaynakları bölmelere ayırır (bulkhead) ve sürekli hata veren bağımlılığa çağrıyı geçici keserek (circuit breaker) sistemi korursun. Böylece kısmi arıza tüm sisteme yayılmaz.

DBAtlas'ta aç →