İçeriğe geç
Muhammet Şafak
en
Soran: Taylan Cevaplandı:

Canlı tabloda dual-write ile sıfır kayıplı şema geçişini nasıl koordine ederim?


Soru

Canlıda, aktif ticaret dönen bir sistemde `users` tablosundaki finansal şemayı tamamen değiştirmemiz gerekiyor; tabloda 20M satır var. Doğrudan `ALTER TABLE` tabloyu kilitleyeceği için sistem durur. Dual Writing stratejisiyle kodun hem eski hem yeni şemaya aynı anda yazmasını, arka planda eski verinin taşınmasını ve sonra eski yapının kapatılmasını içeren aşamalı geçişi nasıl koordine ederim?

Cevap

Kısa cevap: 20M satırda bloklayan bir ALTER TABLE tabloyu kilitler ve sistem durur. Çözüm dual-write tabanlı bir expand/contract (genişlet/daralt) migrasyonu — geçişi aşamalara böl, hiçbir adım büyük tek transaction olmasın.

Mantık şu: tek hamlede şemayı değiştirmek yerine eski ve yeni şemayı bir süre yan yana yaşat, veriyi sızdırmadan taşı, sonra eskiyi kapat. Her adım deploy ile koordineli ve geri alınabilir olmalı.

  1. EXPAND — yeni yapıyı nullable ekle. Yeni kolonları/yapıyı NULL kabul edecek şekilde ekle; tablo yeniden yazılmaz (rewrite yok), kilit anlık. Bu adım tek başına güvenli ve geri alınabilir.
  2. DUAL-WRITE — koda her iki şemaya yazdır. Her değişiklikte hem eski hem yeni şemaya yazan kodu deploy et. Kod geriye dönük uyumlu kalsın: eski okuma yolları bozulmadan, yeni alanlar paralel doldurulsun.
  3. BACKFILL — geçmişi throttled batch’lerle taşı. Eski veriyi küçük, hız sınırlı (throttled) dilimlerle, tercihen off-peak’te kopyala; eski ve yeni alanlar tutana kadar devam et. Sonunda satır sayılarını ve örnek kayıtları doğrula (reconcile) — sessiz veri kaybını ancak böyle yakalarsın.
  4. SWITCH READS — okumayı yeniye al. Uygulamayı yeni şemadan okumaya geçir, ama bir süre hâlâ her ikisine de yazmaya devam et. Bu, sorun çıkarsa eskiye dönebilmen için bir güvenlik ağıdır.
  5. CONTRACT — eskiyi düşür. Yeni yapının sağlam çalıştığından emin olunca eskiye yazmayı durdur, ardından eski kolonları DROP et. Bu son adım da bağımsız deploy edilir; mümkünse pg_repack / online-schema-change aracı kullan, asla tek dev transaction yazma.

Sonuç: Expand/contract + dual-write + batch’li backfill + doğrulama; eski kodun asla işleyemeyeceği bir veri şekliyle karşılaşmaması için deploy’larla koordineli ilerle. Bu disiplinle PostgreSQL’de 20M satırlık finansal bir şemayı bile canlıyı durdurmadan dönüştürebilirsin.

İlgili Yazılar

Etiketler: #veritabanı#postgresql#ci-cd
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi