Database Engineering

CI/CD Süreçleriyle Veritabanı Şema Kayması Tespiti ve Düzeltmenin Otomatikleştirilmesi

Modern yazılım geliştirme ortamında, uygulama kodu ile veritabanı şeması arasındaki boşluk sıklıkla kritik bir başarısızlık noktasına dönüşür. Uygulama kodu genellikle sürüm kontrolünde tutulur ve sıkı CI/CD süreçleri aracılığıyla yönetilirken, Veritabanı Şeması değişiklikleri sıklıkla gözden kaçar. "Şema kayması" olarak bilinen bu olgu, canlı veritabanı yapısının, kod deposunda tanımlanan tek doğru kaynağından saptığında gerçekleşir. Kontrol edilmediğinde, şema kayması kriptografik üretim hatalarına, veri bütünlüğü sorunlarına ve önemli miktarda kesinti süresine yol açar.

Bununla birlikte, veritabanı geçişlerini DevOps iş akışınızda birinci sınıf varlıklar olarak ele almak tamamen mümkündür. Bu yazı, veritabanı durumunuzun uygulama gereksinimleriyle her zaman uyumlu olmasını sağlayarak, CI/CD sürecinizde otomatik şema kayması tespiti ve düzeltmenin nasıl uygulanacağını inceler.

Kaymayı Anlamak

Şema kayması, üretim veritabanına doğrudan manuel değişiklikler yapıldığında (sıkça acil bir hatayı düzeltmek için bir DBA tarafından) veya geçişler dağıtım sırasında doğru şekilde çalıştırılmadığında gerçekleşir. Geleneksel kurulumlarda, geliştiriciler bir tabloyu doğrudan değiştirebilir ve geçiş betiklerini güncelleyemezler; bu da yerel geliştirme ortamının üretim ortamından sapmasına neden olur. Otomasyonun amacı, bu farklılıkları gece yarısı acil durum çağrısı sırasında keşfetmek yerine, bunları hemen yakalamaktır.

Şema Doğrulamayı CI/CD'ye Entegre Etme

Kayma tespitini otomatikleştirmenin ilk adımı, şema doğrulama araçlarını derleme sürecinize entegre etmektir. Liquibase, Flyway veya dbt (veri oluşturma aracı) gibi araçlar, veritabanı durumunuzu bildirimsel olarak tanımlamanıza olanak tanır. Değişiklikleri betikleme yerine, istenen durumu tanımlarsınız ve araç gerekli farkları hesaplar.

CI/CD yapılandırmanızda (örneğin, GitHub Actions, GitLab CI veya Jenkins), yeni uygulama kodunu dağıtmadan önce kayma için kontrol eden bir aşama eklemelisiniz. Bu, veritabanının mevcut durumunu, depoda tanımlanan beklenen durumla karşılaştırmayı içerir.

# .github/workflows/db-validation.yml
name: Veritabanı Şema Doğrulaması
on: [pull_request]

jobs:
  validate-schema:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432
    steps:
      - uses: actions/checkout@v3
      - name: Liquibase Fark Kontrolünü Çalıştır
        run: |
          liquibase \
            --url=jdbc:postgresql://localhost:5432/postgres \
            --username=postgres \
            --password=postgres \
            --changeLogFile=db/changelog/db.changelog-master.yaml \
            diffChangeLog

Bu örnekte, diffChangeLog komutu mevcut veritabanı durumunu değişiklik günlüğüyle karşılaştırır. Beklenmedik değişiklikler tespit edilirse (yani kayma varsa), işlem başarısız olur ve eski veya uyumsuz bir şemaya güvenen kodun birleştirilmesini engeller.

Otomatik Düzeltme Stratejileri

Tespit, savaşın sadece yarısıdır. Düzeltme stratejileri, risk toleransınıza ve ortamınıza göre değişir. Geliştirme ve önizleme (staging) ortamları için, bekleyen geçişleri otomatik olarak uygulayarak düzeltmeyi otomatikleştirebilirsiniz. Ancak üretimde, otomatik düzeltme dikkat gerektirir. Yaygın bir desen, "güvenli geçiş" yaklaşımıdır; bu yaklaşımda değişiklikler geriye uyumludur (örneğin, kısıtlamaları değiştirmeden önce sütunlar eklemek) ve engelleme yapmayan betikler aracılığıyla uygulanır.

Kritik şema değişiklikleri için "sıfır kesinti" geçiş stratejisi önerilir. Bu, yürütülmeden önce gözden geçirilip onaylanabilen bir geçiş betiği oluşturmayı içerir. Bazı gelişmiş CI/CD kurulumları, çift aşamalı dağıtım kullanır: önce uygulama (varsa) yeni şemayı destekleyecek şekilde güncellenir, ardından geçiş uygulanır. Geçiş başarısız olursa, geri alma betiği süreç tarafından otomatik olarak tetiklenir.

Uygulama İçin En İyi Uygulamalar

  • Bildirimci, Emir Vericiye Karşı: Adım adım talimatlar yerine son durumu tanımlamanıza olanak tanıyan araçları tercih edin. Bu, kayma tespitini daha sağlam hale getirir.
  • Şemanızı Sürüm Kontrolünde Tutun: Veritabanı şema dosyalarına, uygulama koduyla aynı titizlikle muamele edin. Tüm şema değişiklikleri için kod incelemelerini zorunlu kılın.
  • Yerel Geliştirme Eşitliği: Yerel geliştirme ortamınızda konteynerize edilmiş veritabanları (örneğin, Docker) kullanarak, geliştirme veritabanı yapısının CI/CD doğrulama ortamıyla tam olarak eşleştiğinden emin olun.
  • Kaymayı Sürekli İzleyin: CI/CD olsa bile, dağıtımlar arasındaki kaymayı tespit etmek için izleme kurun. Periyodik olarak fark kontrolleri çalıştıran zamanlanmış bir iş, veritabanına doğrudan yapılan ad-hoc değişiklikleri yakalayabilir.

Sonuç

Veritabanı şema kayması tespiti ve düzeltmesini otomatikleştirmek sadece bir teknik kolaylık değil; güvenilir yazılım mühendisliği için temel bir gereksinimdir. Şema doğrulamayı CI/CD süreçlerinize entegre ederek, veritabanınızı potansiyel bir darboğazdan kontrollü, sürümlü bir varlığa dönüştürürsünüz. Bu yaklaşım, geliştiricilerin bilişsel yükünü azaltır, üretim olaylarının riskini minimize eder ve uygulamanız ile veritabanının mükemmel senkronizasyonda kalmasını sağlar. Yerel ortamınızda basit fark kontrolleri uygulamakla başlayın ve daha dirençli bir altyapı oluşturmak için bunları kademeli olarak tam CI/CD iş akışınıza entegre edin.

Share: