Kesintisiz Veritabanı Migration Stratejisi
Uygulama ve veritabanını aynı anda değiştirmek tek sunuculu küçük sistemlerde çalışabilir; ancak rolling deployment veya yoğun trafik altında risklidir. Yeni kod eski şemayı, eski kod da yeni şemayı kısa bir süre kullanabilmelidir. Kesintisiz migration bu geçiş dönemini bilinçli olarak tasarlar ve geri dönüş seçeneğini korur.
Expand-contract yaklaşımı
Expand aşamasında yeni kolon veya tablo geriye uyumlu biçimde eklenir; mevcut kolon hemen silinmez ve zorunlu hâle getirilmez. Uygulama bir süre hem eski hem yeni alanı okuyup yazabilir. Backfill tamamlandıktan ve bütün instance'lar yeni sürüme geçtikten sonra contract aşamasında eski alan kaldırılır. Büyük tablo değişiklikleri küçük partilerle yapılır ve kilit süresi izlenir.
Name alanını bölme örneği
Customers.Name alanını FirstName ve LastName olarak ayırmak istediğimizi düşünelim. İlk migration yeni nullable kolonları ekler; ardından veri küçük partilerle taşınır.
ALTER TABLE dbo.Customers ADD
FirstName nvarchar(100) NULL,
LastName nvarchar(100) NULL;
WHILE 1 = 1
BEGIN
UPDATE TOP (1000) dbo.Customers
SET FirstName = LEFT(Name, CHARINDEX(' ', Name + ' ') - 1),
LastName = LTRIM(SUBSTRING(Name, CHARINDEX(' ', Name + ' '), 200))
WHERE FirstName IS NULL;
IF @@ROWCOUNT = 0 BREAK;
WAITFOR DELAY '00:00:00.100';
ENDBatch güncelleme transaction log büyümesini ve uzun süreli kilitleri sınırlar. Uygulama geçiş sırasında yeni alanlar doluysa onları, değilse Name alanını okuyabilir. Tüm kayıtlar taşınıp eski uygulama sürümü kalmadığında NOT NULL kısıtı ve eski kolonun kaldırılması ayrı deployment olarak yapılır.
Güvenli yayın adımları
- Şema değişikliğini geriye uyumlu ve yalnızca ekleme yapan bir migration olarak tasarlayın.
- Yeni uygulamayı iki şemayla da çalışabilecek şekilde yayınlayın.
- Backfill işlemini küçük partiler, ilerleme metriği ve yeniden başlatılabilir komutlarla yürütün.
- Eski sürüm kalmadığını ve yeni alanların eksiksiz dolduğunu sorgularla doğrulayın.
- Kısıt sıkılaştırma ve kolon silme işlemini sonraki bağımsız yayına bırakın.
Riskli uygulamalar
- Yoğun kullanılan büyük kolonu tek transaction içinde dönüştürmek.
- Yeni NOT NULL kolonu varsayılan değer olmadan doğrudan eklemek.
- Uygulama yayınlanmadan önce eski kolonun adını değiştirmek veya silmek.
Sonuç
Kesintisiz migration teknik bir SQL komutundan çok dağıtım protokolüdür. Şemayı genişletmek, kodu uyumlu hâle getirmek, veriyi gözlemlenebilir biçimde taşımak ve son olarak eski yapıyı daraltmak gerekir. Küçük ve geri alınabilir adımlar, birkaç saniye kazanmaktan daha değerlidir ve 5xx dalgalarının önüne geçer.
0 Yorumlar