Veritabanı performansı, web uygulaması ölçeklendirme sorunlarının %78'inde darboğazdır. Uygulamalar minimum çabayla yatay olarak ölçeklenebilir, ancak veritabanları yatay ölçeklendirmeye direnç gösterir. Veritabanı ölçeklendirmesi için seçeceğiniz stratejiler, uygulamanızın kabul edilebilir performansla 100 kullanıcıya mı yoksa 100.000 kullanıcıya mı hizmet vereceğini belirler.
Bu kılavuz, ölçeklendirme ihtiyacını geciktiren basit optimizasyonlardan yatay parçalama gibi gelişmiş tekniklere kadar veritabanı ölçeklendirme stratejilerinin tüm yelpazesini kapsar.
Önemli Çıkarımlar
- Altyapıyı eklemeden önce sorguları optimize edin ve dizinler ekleyin -- bu, veritabanı performans sorunlarının %60'ını çözer
- Okuma replikaları en düşük riskli ölçeklendirme stratejisidir ve okuma ağırlıklı iş yüklerinin %80'ini yönetir
- Uygulamanız 10'dan fazla örnek çalıştırdığında bağlantı havuzu oluşturma zorunludur
- Yatay parçalama, önemli uygulama karmaşıklığı getiren son çaredir
Ölçeklendirme Merdiveni
Bu sırayla ölçeklendirin. Her adım bir sonrakine göre daha ucuz ve daha az risklidir:
Adım 1: Sorgu Optimizasyonu (Ücretsiz)
Altyapı eklemeden önce mevcut veritabanınızın en iyi şekilde performans gösterdiğinden emin olun.
-- Find slow queries in PostgreSQL
SELECT
calls,
mean_exec_time::numeric(10,2) AS avg_ms,
total_exec_time::numeric(10,2) AS total_ms,
query
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 20;
Ortak optimizasyonlar:
- Sık sık filtrelenen sütunlar için eksik dizinleri ekleyin
SELECT *'ı belirli sütun listeleriyle değiştirin- Büyük tablolardaki sıralı taramaları tanımlamak için
EXPLAIN ANALYZEkullanın - Çok sütunlu WHERE cümleleri için bileşik dizinler ekleyin
- Sayfalandırmayı
OFFSETyerine anahtar seti sayfalandırmasıyla uygulayın
-- Bad: OFFSET pagination (scans all skipped rows)
SELECT * FROM orders ORDER BY created_at DESC LIMIT 20 OFFSET 10000;
-- Good: Keyset pagination (index-only scan)
SELECT * FROM orders
WHERE created_at < '2026-03-15T10:00:00Z'
ORDER BY created_at DESC
LIMIT 20;
Adım 2: Dikey Ölçeklendirme ($)
Mevcut veritabanı sunucunuzdaki CPU, RAM ve depolama alanını artırın. Bu, zaman kazandırır ve sıfır uygulama değişikliği gerektirir.
| Örnek Boyutu | vCPU | RAM | Bağlantılar | Aylık Maliyet (RDS) |
|---|---|---|---|---|
| db.t3.medium | 2 | 4GB | 100 | 65 $ |
| db.r6g.large | 2 | 16GB | 200 | 175$ |
| db.r6g.xlarge | 4 | 32GB | 400 | 350$ |
| db.r6g.2xlarge | 8 | 64GB | 800 | 700$ |
Çoğu uygulama 64 GB RAM ve 8 vCPU sınırına ulaşır. Bunun ötesinde, dikey ölçeklendirme maliyet açısından fahiş hale gelir.
Adım 3: Bağlantı Havuzu Oluşturma ($)
Application (50 pods x 20 connections = 1,000 connections)
|
v
PgBouncer (25 database connections, transaction pooling)
|
v
PostgreSQL (25 active connections, manageable)
PgBouncer yapılandırması:
[databases]
app = host=db.example.com port=5432 dbname=production
[pgbouncer]
listen_port = 6432
listen_addr = 0.0.0.0
auth_type = md5
pool_mode = transaction
default_pool_size = 25
max_client_conn = 1000
min_pool_size = 5
reserve_pool_size = 5
reserve_pool_timeout = 3
Adım 4: Kopyaları Okuyun ($$)
Okuma replikaları, SELECT sorgularını yöneterek veritabanı yükünün %60-90'ını birincilden boşaltır.
Mimarlık:
Write queries --> Primary database
|
Replication (async)
|
+----+----+
| |
Read queries --> Replica 1 Replica 2
Uygulama düzeyinde yönlendirme (Drizzle ORM örneği):
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
const primaryPool = new Pool({ connectionString: process.env.DATABASE_URL });
const replicaPool = new Pool({ connectionString: process.env.DATABASE_REPLICA_URL });
export const primaryDb = drizzle(primaryPool);
export const replicaDb = drizzle(replicaPool);
// In service code:
// Write operations use primaryDb
async createOrder(data: OrderInput) {
return primaryDb.insert(orders).values(data).returning();
}
// Read operations use replicaDb
async getOrders(organizationId: string) {
return replicaDb.select().from(orders)
.where(eq(orders.organizationId, organizationId))
.orderBy(desc(orders.createdAt));
}
Çoğaltma gecikmesi ile ilgili hususlar: Zaman uyumsuz çoğaltma bir gecikmeye neden olur (genellikle 10-100 ms). Yazma işleminden hemen sonra kopyadan okumak eski verileri döndürebilir. Aynı kullanıcı akışındaki yazma işlemlerini takip eden okumalar için birincil değeri kullanın.
Adım 5: Önbelleğe Alma ($$)
Redis'in önbelleğe alınması, tekrarlanan veritabanı sorgularını tamamen ortadan kaldırır.
async getProduct(id: string): Promise<Product> {
const cacheKey = `product:${id}`;
// Check cache first
const cached = await this.redis.get(cacheKey);
if (cached) return JSON.parse(cached);
// Cache miss: query database
const product = await this.db.select().from(products)
.where(eq(products.id, id))
.limit(1);
// Cache for 5 minutes
await this.redis.setex(cacheKey, 300, JSON.stringify(product[0]));
return product[0];
}
Önbellek geçersiz kılma stratejisi: Yazma sırasında geçersiz kılın. Bir ürün güncellendiğinde önbellek anahtarını silin. Yazma (veritabanı önbelleği yönetir) yerine önbellek ayırma modelini (uygulama önbelleği yönetir) kullanın.
Adım 6: Yatay Parçalama ($$$)
Parçalama, verileri bir parça anahtarına dayalı olarak birden fazla veritabanı örneğine dağıtır.
| Parçalama Stratejisi | Açıklama | En İyisi |
|---|---|---|
| Hash tabanlı | Parça anahtarının hashini yapın, eşit şekilde dağıtın | Eşit veri dağıtımı |
| Aralığa dayalı | Aralıkları parçalara atayın (ör. A-M, N-Z) | Zaman serisi, coğrafi veriler |
| Kiracı tabanlı | Kiracı/kuruluş başına bir parça | Çok kiracılı SaaS |
Ne zaman parçalanmalı:
- Tek veritabanı 1 TB'yi aşıyor ve büyüyor
- Yazma verimi tek bir birincilin işleyebileceğini aşıyor
- Dikey ölçeklendirme maliyetleri hiçbir boşluk olmadan ayda 2.000 ABD dolarını aşıyor
Ne zaman parçalanmamalı:
- 1-5 arası adımları tamamlamadınız
- Verileriniz 500 GB'lık tek bir veritabanına sığar
- Uygulamanızda çapraz parça sorguları yaygındır
PostgreSQL'e Özel Optimizasyonlar
Bölümleme (Parçalamadan Önce)
PostgreSQL tablo bölümleme, tek bir mantıksal tabloyu korurken büyük tabloları daha küçük fiziksel tablolara böler:
-- Partition orders by month
CREATE TABLE orders (
id UUID PRIMARY KEY,
organization_id UUID NOT NULL,
created_at TIMESTAMP NOT NULL,
total DECIMAL(10,2)
) PARTITION BY RANGE (created_at);
CREATE TABLE orders_2026_01 PARTITION OF orders
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
CREATE TABLE orders_2026_02 PARTITION OF orders
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
CREATE TABLE orders_2026_03 PARTITION OF orders
FOR VALUES FROM ('2026-03-01') TO ('2026-04-01');
Bölümleme, büyük tablolarda zaman aralığı sorguları için sorgu performansını 10-100 kat artırır çünkü PostgreSQL yalnızca ilgili bölümleri tarar.
Vakumlama ve Bakım
-- Check table bloat
SELECT
schemaname,
relname,
n_live_tup,
n_dead_tup,
round(n_dead_tup::numeric / greatest(n_live_tup, 1) * 100, 2) AS dead_pct
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;
Yüksek yazma tabloları için autovacuum'u agresif bir şekilde yapılandırın:
ALTER TABLE orders SET (
autovacuum_vacuum_threshold = 100,
autovacuum_vacuum_scale_factor = 0.05,
autovacuum_analyze_threshold = 50,
autovacuum_analyze_scale_factor = 0.02
);
Veritabanı Performansını İzleme
Ne zaman ve nasıl ölçekleneceğini anlamak için bu metrikleri izleyin:
| Metrik | Araç | Uyarı Eşiği |
|---|---|---|
| Sorgu gecikmesi (P95) | pg_stat_statements | >500ms |
| Aktif bağlantılar | pg_stat_activity | >Maksimum değerin %80'i |
| Önbellek isabet oranı | pg_stat_database | <%95 |
| Çoğaltma gecikmesi | pg_stat_replication | >1 saniye |
| Masa şişkinliği | pg_stat_user_tables | >%20 ölü demetler |
| Disk G/Ç bekleme | iostat / CloudWatch | >20ms |
%95'in altındaki önbellek isabet oranı, daha fazla belleğe ihtiyacınız olduğunun en güçlü göstergesidir. shared_buffers ve effective_cache_size değerlerini artırmak genellikle okuma kopyaları eklemekten daha ucuz ve daha hızlıdır.
Sorgu Performansı Takibi
-- Enable pg_stat_statements (postgresql.conf)
-- shared_preload_libraries = 'pg_stat_statements'
-- Find the top 10 most time-consuming queries
SELECT
queryid,
calls,
mean_exec_time::numeric(10,2) AS avg_ms,
total_exec_time::numeric(10,2) AS total_ms,
rows,
query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
Haftalık olarak en sık yapılan 10 sorguyu inceleyin. Sıklıkla yürütülen tek bir sorguyu bile optimize etmek, genel veritabanı yükünü %10-30 oranında azaltabilir.
Sıkça Sorulan Sorular
How do we know when it is time to scale?
Üç ölçümü izleyin: sorgu gecikmesi P95 (500 ms'de uyarı), bağlantı kullanımı (%80'de uyarı) ve CPU kullanımı (%70'de sürekli uyarı). Bu eşiklere düzenli olarak ulaşıyorsanız ölçeklendirme merdiveninde bir sonraki adıma geçin. Veriler size söylediğinde ön optimizasyon yapmayın --- ölçeklendirin.
Kopyaları okuma veya önbelleğe alma --- hangisi önce?
Önbelleğe almayla başlayın. Redis önbelleğe almanın uygulanması daha basittir, daha fazla yükü ortadan kaldırır (önbellek isabetleri veritabanını tamamen atlar) ve maliyeti daha azdır. Önbellek isabet oranınız zaten %80'in üzerinde olduğunda ancak birincil veritabanı hala önbellek eksiklikleri ve yazma işlemleri nedeniyle baskı altında olduğunda okuma replikaları ekleyin.
Veritabanı ölçeklendirme Odoo ile nasıl çalışır?
Odoo yalnızca PostgreSQL'i kullanır. Sorgu optimizasyonuyla başlayın (Odoo, raporlama için karmaşık sorgular oluşturur). 50 eşzamanlı kullanıcıyı aştığınızda bağlantı havuzu oluşturmak için PgBouncer'ı ekleyin. Raporlama sorguları için okuma replikalarını kullanın (Odoo'nun --db-replica seçeneğini yapılandırın). ECOSIRE, veritabanı ayarlama dahil Odoo performans optimizasyonu sağlar.
Yönetilen veritabanı (RDS/Cloud SQL) premium almaya değer mi?
Evet, çoğu işletme için. Yönetilen veritabanları otomatik yedekleme, yama uygulama, yük devretme ve izleme işlemlerini gerçekleştirir. Kendi kendine yönetilen PostgreSQL'e göre %30-40'lık maliyet avantajı, tasarruf ettiğiniz mühendislik süresiyle dengelenir. Bunun istisnası, büyük bir bulut sunucusundaki maliyet priminin yarı zamanlı bir DBA maliyetini aştığı büyük ölçekli dağıtımlardır.
Sırada Ne Var?
Veritabanı ölçeklendirme, daha geniş bir altyapı ölçeklendirme stratejisinin bir bileşenidir. Statik varlıklar için CDN optimizasyonu, uygulama bölmeleri için Kubernetes otomatik ölçeklendirmesi ve ölçeklendirme kararlarınızı gerçekçi koşullar altında doğrulamak için yük testi ile birleştirin.
Veritabanı optimizasyonu danışmanlığı için ECOSIRE ile iletişime geçin veya altyapı yol haritasının tamamı için DevOps kılavuzumuza bakın.
ECOSIRE tarafından yayınlandı - işletmelerin veri altyapısını güvenle ölçeklendirmesine yardımcı oluyor.
Yazan
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
ECOSIRE ile İşinizi Büyütün
ERP, e-Ticaret, yapay zeka, analitik ve otomasyon genelinde kurumsal çözümler.
İlgili Makaleler
Bulut Barındırma Maliyeti 2026'da Ne Kadar? Gerçek Fiyat Dağılımı (AWS, Hetzner, DigitalOcean, Odoo.sh)
Faturaları ödeyen bir ekibin gerçek 2026 bulut barındırma maliyetleri: ayda 5-25 ABD doları hobi, ayda 50-400 ABD doları SMB, gizli çıkış ve yedekleme ücretleri, ayrılmış örnek matematiği.
2026'da Odoo Barındırma Gereksinimleri: Kullanıcı Sayısına Göre Sunucu Boyutlandırması (Gerçek Yapılandırmalarla)
Kullanıcı sayısına göre Odoo barındırma gereksinimleri: 5 ila 250+ kullanıcı için vCPU, RAM, depolama ve çalışan ayarları ile gerçek dağıtımlardan PostgreSQL ayarlama değerleri.
Odoo 19 Performans Karşılaştırmaları: PostgreSQL 17 Ayar Numaraları
Gerçek dünya Odoo 19 performans kıyaslamaları: web istemci hızı, ORM verimi, PG17 ayarlama ayarları, bağlantı havuzu oluşturma, çalışan sayıları, ölçeklendirme eşikleri.