Veritabanı şema değişikliklerini (migration) kesintisiz (zero-downtime) nasıl deploy edersiniz? Expand-contract nedir?
Cevap
Kesintisiz deploy sırasında eski ve yeni uygulama sürümü bir süre aynı veritabanıyla birlikte çalışır. Bu yüzden her migration, hem eski hem yeni kodla uyumlu olmalıdır. Bunun standart yöntemi expand-contract (parallel change) desenidir: önce şemayı genişlet, sonra kodu geçir, en son eskiyi kaldır.
Örnek: name kolonunu full_name olarak yeniden adlandırma
Tek adımda RENAME COLUMN yaparsanız eski sürümdeki pod'lar anında hata verir. Doğru sıra:
- Expand: yeni kolonu ekle (nullable).
- Çift yazma: uygulamayı her iki kolona yazacak şekilde deploy et.
- Backfill: eski verileri parça parça kopyala.
- Okumayı geçir: uygulama artık
full_name'den okusun. - Contract: eski kolonu kullanan kod kalmayınca
namekolonunu sil (ayrı bir deploy).
-- 1. Expand
ALTER TABLE users ADD COLUMN full_name text;
-- 3. Backfill (küçük batch'lerle, uzun kilitlerden kaçın)
UPDATE users SET full_name = name
WHERE id IN (SELECT id FROM users WHERE full_name IS NULL LIMIT 5000);
-- 5. Contract (haftalar sonra olabilir)
ALTER TABLE users DROP COLUMN name;Dikkat edilecek kilitler (PostgreSQL)
- Büyük tabloda index'i
CREATE INDEX CONCURRENTLYile oluşturun. NOT NULLkısıtını doğrudan eklemek yerine önceCHECK ... NOT VALIDekleyip sonraVALIDATE CONSTRAINTçalıştırın.lock_timeoutayarlayın; migration kilit bekleyip tüm sorguları bloklamasın.- Volatile default ile kolon eklemek tabloyu yeniden yazabilir; PostgreSQL 11+ sabit default'u tablo yazmadan ekler.
Süreç
- Migration'lar CI/CD'de uygulama deploy'undan önce ayrı bir adım olarak çalışır.
- Geri alınabilir olmalı veya en azından ileri yönde düzeltilebilir (roll forward) olmalıdır.
- Prisma, Flyway, Liquibase, Alembic gibi araçlar sürüm takibini yapar; ancak kilit güvenliği sizin sorumluluğunuzdadır.
İlgili Bulut & Deploy soruları
- Bulut faturası beklenenden çok yüksek geldi. Maliyeti nasıl analiz eder ve düşürürsünüz?
- Edge function ve edge rendering nedir? Kodu ne zaman edge'de, ne zaman tek bir bölgede (region) çalıştırırsınız?
- Production'daki bir full stack uygulamayı nasıl izlersiniz? Log, metrik, trace ve alarm stratejiniz nedir?
- Blue-green deployment ile canary deployment arasındaki fark nedir? Rollback nasıl yapılır?
- Serverless (ör. AWS Lambda, Vercel Functions) ile container tabanlı deploy (Cloud Run, ECS, Kubernetes) arasında nasıl seçim yaparsınız?
- Uygulamanıza özel bir alan adı bağlayıp HTTPS'i nasıl kurarsınız? A, CNAME kayıtları ve TTL ne işe yarar?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.