Database Engineering

Küresel HA için Şarjlanmış Küme Tasarımı

Bulut tabanlı uygulamaların modern çağında, kullanıcılar fiziksel konumlarından bağımsız olarak alt milisaniye gecikme beklemektedir. Bunu başarmak için tek bir bölgeyi ölçeklendirmekten fazlasına ihtiyaç vardır; bu, kıtalararası yayılan sağlam bir mimari gerektirir. Küresel, çok bölgeli yüksek kullanılabilirlik (HA) için şarjlanmış küme tasarımı, veritabanı mühendisliğindeki en karmaşık zorluklardan biridir. Bu, veri yerelliğini sağlayarak performans SLA'larını karşılamayı garanti ederken, tutarlılık, kullanılabilirlik ve bölüm toleransı arasındaki dengeyi kurmayı zorunlu kılar.

Küresel Şarjlamenin Mimarisi

Geleneksel şarjlama genellikle tek bir bölgeye veya birincil-ikincil çoğaltma modeline dayanır. Küresel HA için, veri yerelliğine saygı duyan bir şarj anahtarına göre verilerin bölgeler arasında bölündüğü Çoklu-Eşit (Multi-Master) şarjlama stratejisini benimsememiz gerekir. Amaç, belirli bir kiracı veya veri kümesi için okuma ve yazma işlemlerinin onlara en yakın bölgede gerçekleşmesini sağlamaktır.

Yaygın bir hata, şarj anahtarı olarak küresel benzersiz bir kimlik (UUID gibi) kullanmaktır; bu veriye eşit dağılım sağlar ancak yerelliği yok eder. Bunun yerine, bölge kimliği veya coğrafi olarak yakın olan bir kiracı kimliği içeren bir bileşik anahtar kullanmalıyız.

// Örnek: Yapılandırma dosyasında Şarjlama Anahtarı Stratejisi
sharding_strategy:
  algorithm: HASH_REGION_TENANT
  key: tenant_id
  regions:
    - us-east
    - eu-west
    - ap-south
  # Yönlendirme mantığı, yazımların önce doğru bölgeye gitmesini sağlar
  default_region: us-east

Veri Yerelliği Stratejileri

Veri yerelliği, gecikmeyi en aza indirmek için kritiktir. Çok bölgeli bir kurulumda, veri ideal olarak aynı bölgede veya yüksek hızlı bağlantıya sahip yakın bir bölgede çoğaltılmalıdır. Ancak, veriyi tek bir bölgede tutmak, tek bir başarısızlık noktası yaratır. Bunu çözmek için, her bölgenin kendi veri alt kümesinin birincisi olduğu "aktif-aktif" çoğaltmayı uygularız.

Tokyo'daki bir kullanıcı veriye eriştiğinde, istek Tokyo şarjına yönlendirilmelidir. Eğer o şarj başarısız olursa, sistem veri kaybı olmadan otomatik olarak Osaka yedeğine geçiş yapmalıdır. Bu, bölge sağlık durumunun farkında olan gelişmiş sağlık kontrolleri ve DNS tabanlı veya servis ağı tabanlı yönlendirme mantığı gerektirir.

Çakışma Çözümünü Yönetme

Küresel çok bölgeli mimarinin en kritik bileşeni çakışma çözümüdür. Her bölge birincil olduğu için, aynı veri varlığına eş zamanlı güncellemeler, yazma-yazma çakışmalarına yol açabilir. Standart Ana-Köle kurulumlarında olduğu gibi sıralı çoğaltmaya güvenemeyiz.

Bu alanda iki temel strateji hakimdir: Vektör Saatler ve Çakışmasız Eşlenmiş Veri Tipleri (CRDTs).

Sıralama İçin Vektör Saatler

Vektör saatler, farklı bölgelerdeki olaylar arasındaki nedensel ilişkiyi belirlememizi sağlar. İki güncelleme eş zamanlı gerçekleşirse, sistem çakışmayı tespit eder ve "son yazma kazanır" veya "manuel birleştirme" gibi bir çözüm politikası uygular.

// Örnek: Veritabanı kaydı içindeki Vektör Saat durumu
{
  "data": {
    "user_balance": 1000
  },
  "clock": {
    "tokyo": 42,
    "london": 38,
    "new_york": 10
  },
  "last_conflict_resolved": "manual"
}

Otomatik Çözüm İçin CRDTs

Sayaçlar veya kümeler gibi daha basit veri yapıları için CRDTs, bir koordinatöre ihtiyaç duymadan bağımsız güncellemelerin aynı duruma yakınsamasına matematiksel bir garanti sunar. Bu, nihai tutarlılığın kabul edilebilir olduğu metrikler, alışveriş sepetleri veya varlık göstergeleri için idealdir.

Uygulama En İyi Uygulamaları

Bu mimariyi başarıyla dağıtmak için geliştiriciler, tüm yazma işlemlerinde sıkı bir tekrarlanabilirlik (idempotency) uygulamalıdır. Tekrarlanabilirlik, bir ağ bölümünün yeniden denemeye neden olması durumunda veritabanı durumunun tutarlı kalmasını sağlar. Ayrıca, izleme araçları darboğazları belirlemek için "çakışma oranlarını" ve "bölge gecikmesini" ayrı ayrı izlemelidir.

Geçiş (failover) mantığını tasarlarken, kritik işlemler için sadece iki aşamalı işlemleri kullanın. Yüksek hacimli kullanıcı verileri için, bölgesel bir kesinti sırasında tüm sistemi kilitlememek amacıyla çakışma algılama ile asenkron çoğaltmaya güvenin.

Sonuç

Küresel yüksek kullanılabilirlik için şarjlanmış küme tasarımı sadece veriyi çoğaltmakla ilgili değildir; bu, internetin kaosunu yönetebilen bir sistem mimarisi kurmakla ilgilidir. Veri yerelliğini korumak için şarj anahtarlarını dikkatlice seçerek ve Vektör Saatler veya CRDTs gibi sağlam çakışma çözüm stratejilerini uygulayarak hem hızlı hem de dirençli bir veritabanı oluşturabilirsiniz. Dağıtık sistem tasarımınızda ilerledikçe, karmaşıklığın detaylarda olduğunu ancak ödülün, kullanıcıların dünyada nerede olursa olsun hissettikleri sorunsuz bir kullanıcı deneyimi olduğunu unutmayın.

Share: