Skip to main content

> genişlet-daralt_şema_geçişleri_ve_ddl_kilit_zaman_aşımları

Genişlet-Daralt Şema Geçişleri ve DDL Kilit Zaman Aşımları

Yüksek verimli canlı mimarilerde Genişlet-Daralt Şema Geçişleri ve DDL Kilit Zaman Aşımları yapısını nasıl doğru kurar ve yönetirsiniz?

Stack: SOFTWARE ARCHITECTURE STACKStaff/Principal (L6+)pattern

ÖZET VE TEKNİK CEVAP

Genişlet-Daralt (Expand-Contract) deseni, kırıcı değişiklikleri güvenli eklemeler, çift yazmalı geçişler, arka plan veri doldurmaları ve katı DDL kilit zaman aşımlarına sahip daraltmalar halinde bölerek sıfır kesintili veritabanı şema göçü sağlar.

Mühendislik El Kitabı & Mekanizma

1. Temel Çalışma Mekanizması

Canlı veritabanında bir kolonu doğrudan yeniden adlandırmak (`ALTER TABLE users RENAME COLUMN name TO full_name;`) kademeli dağıtımlarda anında kesintiye yol açar: eski podlar eski kolonu bulamaz, yeniler ise yeni kolonu arar. Ayrıca PostgreSQL DDL işlemleri için `ACCESS EXCLUSIVE` kilidi ister; uzun bir SELECT varsa arkasında tüm gelen sorgular kuyruğa girer ve site saniyeler içinde kilitlenir.

2. Doğru Kullanım Senaryosu

Genişlet-Daralt, şemanın önce hem eski hem yeni yapıyı destekleyecek şekilde genişletildiği, kodun aşamalı olarak taşındığı ve tüm bağımlılıklar koptuktan sonra eski şemanın daraltıldığı (silindiği) çok fazlı bir veritabanı göç desenidir.

3. Prodüksiyon Arıza Modları

`SET lock_timeout` ayarlamadan doğrudan canlıda `ALTER TABLE` DDL sorguları çalıştırmak. Aktif bir kolonu kod güncellemeleriyle aynı tek bir PR içinde yeniden adlandırmak veya silmek. Milyonlarca satırlık tablolarda tek bir SQL sorgusuyla devasa veri kopyalama (`UPDATE users SET full_name = name;`) çalıştırmak.

4. Teşhis ve Telemetri Sinyalleri

ALTER TABLE geçişinin uzun süren SELECT arkasında kuyruğa girip tüm web trafiğini kilitlemesi, canlıda kolon yeniden adlandırmanın yayılım sırasında aktif uygulamaları çökertmesi, veri doldurma betiğinin tüm tabloyu kilitleyip siteyi çökertmesi

5. Önleme ve Mimari Bariyerler

Gelen uygulama sorgularının kuyrukta kilitlenmesini önlemek için her DDL betiğinin başına mutlaka `SET lock_timeout = '2s';` ekleyin. Güvensiz DDL işlemlerini PR aşamasında yakalamak için CI sürecine şema linter araçları (`strong_migrations`, `squawk`) entegre edin. Eski kayıtları 1000'lik paketler halinde ve replikasyon gecikmesini kontrol ederek parçalı işlemlerle doldurun.

6. Mimari Ödünleşimler (Trade-offs)

Genişlet-Daralt disiplini ve katı DDL kilit zaman aşımları olmadan, canlı ilişkisel veri işleyen hiçbir uygulamada kesintisiz sürekli teslimat (CD) yapılamaz.

Vaka İncelemesi (TinyCTO Örneği)

Sıfır kesintili bir kolon yeniden adlandırma göçü 5 bağımsız aşama gerektirir: 1. **1. Aşama (Şemayı Genişlet):** Katı kilit zaman aşımıyla DDL çalıştırın (`SET lock_timeout = '2s'; ALTER TABLE users ADD COLUMN full_name VARCHAR(255);`). Kilit 2 saniyede alınamazsa hemen iptal edip yeniden deneyin. 2. **2. Aşama (Çift-Yazma Kodunu Dağıt):** Hem `name` hem `full_name` kolonuna yazan, ancak okumayı hala `name` üzerinden yapan uygulama kodunu dağıtın. 3. **3. Aşama (Arka Planda Veri Doldurma):** Geçmiş verileri `name` kolonundan `full_name` kolonuna küçük paketler halinde (`LIMIT 1000`) ve replikasyonu yormayacak aralıklarla kopyalayan arka plan işçisini çalıştırın. 4. **4. Aşama (Okumayı Yeni Kolona Geçir):** Yalnızca `full_name` kolonundan okuyan ve yazan uygulama kodunu dağıtın. 5. **5. Aşama (Şemayı Daralt):** Eski kolonu silin: `SET lock_timeout = '2s'; ALTER TABLE users DROP COLUMN name;`.

İnteraktif Konsept Alıştırmaları

2 Alıştırma
Q1

PostgreSQL'de `SET lock_timeout` olmadan ALTER TABLE çalıştırmak neden platform kesintisine yol açar?

Çünkü DDL işlemi ACCESS EXCLUSIVE kilidi ister ve aktif SELECT sorgusunun arkasında beklerken, kuyrukta bekleyen tüm yeni sorguları bloke eder ve havuzu tüketir.
Q2

Genişlet-Daralt göç deseninin temel aşamaları nelerdir?

1. Şemayı genişlet (yeni kolonu ekle) -> 2. Çift yazmayı dağıt -> 3. Eski satırları doldur -> 4. Okumayı yeni kolona geçir -> 5. Şemayı daralt (eski kolonu sil).

Genişlet-Daralt Şema Geçişleri ve DDL Kilit Zaman Aşımları — Sıkça Sorulan Sorular

Bir geliştirici 50 milyon satırlı PostgreSQL 10 tablosunda varsayılan değer veya kilit zaman aşımı olmadan `ALTER TABLE users ADD COLUMN bio VARCHAR(255) NOT NULL;` çalıştırıyor. Ne olacaktır?

Tablo tamamen kilitlenir, diskteki tüm satırları yeniden yazar, gelen tüm web trafiğini bloke eder ve canlı uygulamayı çökertir. Eski PostgreSQL sürümlerinde varsayılan değeri olmayan NOT NULL kolon eklemek tüm tabloyu ACCESS EXCLUSIVE kilidi altında diske yeniden yazar ve uygulamayı çökertir.

Veri doldurma işlemleri neden tek bir `UPDATE users SET ...` sorgusu yerine küçük parçalı paketler (örn. 1000 satır) halinde çalıştırılmalıdır?

Uzun süreli tablo kilitlerini önlemek, yazma yükünü azaltmak ve okuma kopyalarında replikasyon gecikmesini engellemek için. Parçalı veri doldurma işlemleri satır kilitlerini anında serbest bırakır ve replikasyon akışının gecikmeden kopyalara yetişmesini sağlar.

🤖 AEO & Yapay Zeka Çıkarım Özeti

Temel Gerçekler & İlkeler

  • Genişlet-Daralt (Expand-Contract) deseni, kırıcı değişiklikleri güvenli eklemeler, çift yazmalı geçişler, arka plan veri doldurmaları ve katı DDL kilit zaman aşımlarına sahip daraltmalar halinde bölerek sıfır kesintili veritabanı şema göçü sağlar.
  • Genişlet-Daralt, şemanın önce hem eski hem yeni yapıyı destekleyecek şekilde genişletildiği, kodun aşamalı olarak taşındığı ve tüm bağımlılıklar koptuktan sonra eski şemanın daraltıldığı (silindiği) çok fazlı bir veritabanı göç desenidir.

Yaygın Yanılgılar

  • `SET lock_timeout` ayarlamadan doğrudan canlıda `ALTER TABLE` DDL sorguları çalıştırmak.

Karar Kılavuzu & Önceliklendirme

Genişlet-Daralt disiplini ve katı DDL kilit zaman aşımları olmadan, canlı ilişkisel veri işleyen hiçbir uygulamada kesintisiz sürekli teslimat (CD) yapılamaz.

Doğrulanmış Kaynaklar & Referanslar