Database Engineering

Geri Alma Stratejileriyle CI/CD Borularında Veritabanı Şeması Geçiş Otomasyonunun Uygulanması

Veritabanı şeması geçişleri modern yazılım geliştirme için kritik bir bileşendir ancak dağıtım süreçlerinin en zor yönlerinden biri olarak kalmaya devam eder. Takımlar daha hızlı dağıtım döngüleri ve daha büyük güvenilirlik elde etmeye çalışırken, CI/CD boruları içinde otomatik veritabanı geçiş iş akışlarını uygulamak zorunludur. Bu makale, ekibin üretim felaketlerinden kurtarabilecek kapsamlı geri alma stratejileriyle otomatik şema geçişlerinin uygulanmasını incelemektedir.

Zorlukları Anlamak

Veritabanı şeması değişiklikleri, uygulama kodu dağıtımlarına kıyasla benzersiz karmaşıklıklar yaratır. Uygulama kodunun aksine, veritabanı değişiklikleri önceki sürümü dağıtarak "geri alınabilir" değildir. Başarısız bir geçiş veritabanınızı tutarsız bir durumda bırakabilir, potansiyel olarak veri bozulmasına veya uygulama kesintisine neden olabilir. Geleneksel yaklaşımlar genellikle manuel müdahale gerektirir, bu da dağıtım riskini artırır ve geliştirme sürecini yavaşlatır.

Temel Geçiş Araçları ve Çerçeveler

Veritabanı geçişlerini yönetmek için birkaç sağlam araç mevcuttur, popüler seçenekler şunlardır:

  • liquibase - Veritabanı bağımsız geçiş aracı
  • flyway - Basit, fikirli geçiş aracı
  • PHP uygulamaları için Doctrine Migrations
  • Django ve Flask uygulamaları için Python Alembic

Bu örnek için Liquibase'i tipik bir uygulama ile kullanacağız:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

<changeSet id="1" author="developer">
<createTable tableName="users">
<column name="id" type="bigint" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="username" type="varchar(50)">
<constraints nullable="false" unique="true"/>
</column>
<column name="email" type="varchar(100)">
<constraints nullable="false" unique="true"/>
</column>
</createTable>
</changeSet>

<changeSet id="2" author="developer">
<addForeignKeyConstraint baseTableName="orders"
baseColumnNames="user_id"
referencedTableName="users"
referencedColumnNames="id"/>
</changeSet>
</databaseChangeLog>

CI/CD Boru Hattı Entegrasyonu

Başarılı otomatik geçişlerin anahtarı CI/CD boru hattınızla doğru şekilde entegre olmaktır. İşte modern bir boru hattı yapılandırması kullanarak tipik bir iş akışı:

name: Database Migration Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
migrate:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2

- name: Setup Java
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'

- name: Run Database Migrations
run: |
mvn liquibase:update -Dliquibase.url=jdbc:postgresql://localhost:5432/mydb \
-Dliquibase.username=postgres \
-Dliquibase.password=${{ secrets.DB_PASSWORD }}
env:
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

- name: Run Tests
run: mvn test

- name: Deploy to Staging
run: |
mvn deploy -DskipTests
env:
STAGING_URL: ${{ secrets.STAGING_URL }}

Güçlü Geri Alma Stratejileri

Etkili geri alma stratejilerinin uygulanması üretim dağıtımları için kritiktir. İşte birkaç yaklaşım:

1. Değişim Kümesi Geri Alma ile Otomatik Geri Alma

Liquibase otomatik geri alma oluşturma desteğine sahiptir:

# Geri alma SQL'sini oluştur
liquibase rollback --changeSetId=2 --changeSetAuthor=developer

# Veya belirli bir etikete geri dön
liquibase rollback --tag=v1.2.0

2. Manuel Geri Alma Betik Şablonu

-- Yabancı anahtar ekleme için geri alma betiği
-- Değişim Kümesi: 2 geri al
DROP INDEX IF EXISTS idx_orders_user_id;
ALTER TABLE orders DROP CONSTRAINT IF EXISTS fk_orders_users;

3. Sıfır Downtime Geçiş Deseni

Üretim ortamları için "ekle sonra kaldır" desenini düşünün:

-- Varsayılan değerli yeni sütun ekle
ALTER TABLE users ADD COLUMN IF NOT EXISTS profile_updated TIMESTAMP DEFAULT NOW();

-- İndeks ve kısıtlamalar ekle
CREATE INDEX IF NOT EXISTS idx_users_profile_update ON users(profile_updated);

-- Daha sonra, geri alma gerekirse:
ALTER TABLE users DROP COLUMN IF EXISTS profile_updated;

Üretim Dağıtım En İyi Uygulamaları

Üretim dağıtımında şu üretim özel stratejilerini göz önünde bulundurun:

  • Her zaman üretimle aynı olan bir hazırlık ortamında geçişleri doğrulayın
  • Geçiş doğrulamasını içeren otomatik testleri uygulayın
  • Uygun sağlık kontrolleriyle veritabanı bağlantı havuzları kullanın
  • Geçiş yürütme süreleri için izleme kurun
  • Büyük geçişlerden önce günlük otomatik yedeklemeler oluşturun

Bu uygulamaları takip ederek ekibiniz veritabanı şeması geçişlerini otomatikleştirebilir, dağıtım güvenilirliğini ve hızlı geri alma yeteneklerini koruyabilirsiniz. Anahtar, veritabanı şeması değişikliklerini uygulama koduyla aynı özenle ele almak, her geçişin test edilmesini, sürüm kontrol edilmesini ve gerektiğinde geri alınabilir olmasını sağlamaktır.

Sonuç

CI/CD borularında veritabanı şeması geçişlerinin otomatikleştirilmesi sadece kolaylık değil, aynı zamanda uygulama kararlılığını ve dağıtım hızını korumak için kritik bir uygulamadır. Uygun geçiş araçlarıyla, sağlam CI/CD entegrasyonu ve kapsamlı geri alma stratejilerinin birleşimi, ekiplerin riski minimize ederek hızlı hareket etmesine olanak tanıyan bir güvenlik ağı oluşturur. Veritabanı şemaları karmaşıklıkta artarken, bu otomatik iş akışlarına yatırım, hem geliştirici üretkenliği hem de sistem güvenilirliği açısından getiriler sağlayacaktır.

Share: