CAP Teoremi Nedir?
CAP teoremi, dağıtık bir veri sisteminin aşağıdaki üç özellikten aynı anda en fazla ikisini garanti edebileceğini söyler:
- Consistency (Tutarlılık): Her okuma, en son yazılan değeri ya da bir hata döner. Araya eski veri sıkışmaz.
- Availability (Erişilebilirlik): Çalışan her düğüm, gelen her isteğe hata dışında bir yanıt verir.
- Partition tolerance (Bölünme toleransı): Ağdaki düğümler arasındaki iletişim koptuğunda sistem çalışmaya devam eder.
Buradaki kritik nokta şu: dağıtık sistemlerde ağ bölünmesi (partition) bir tercih değil, kaçınılmaz bir durumdur. Bu yüzden pratikte seçim C ile A arasında yapılır. Bir bölünme anında tutarlılığı korumak için bazı istekleri reddetmeniz (erişilebilirliği feda etmeniz), erişilebilir kalmak için de eski veri döndürmeyi kabul etmeniz gerekir.
Sık Yapılan Kavram Hataları
"Üçünden ikisini seç" yanılgısı. Bu ifade teoremi fazla basitleştirir. Bölünme yokken sistem hem tutarlı hem erişilebilir olabilir. Seçim yalnızca bölünme anında ve o anda etkilenen işlemler için geçerlidir.
CAP'i "CP ya da AP" etiketi sanmak. Gerçek sistemler tek bir kategoriye girmez. Bir veritabanı yazma yolunda CP, okuma yolunda AP davranabilir. Etiketler pazarlama kolaylığıdır, mimari gerçeği tam yansıtmaz.
CAP ile ACID'i karıştırmak. CAP'teki C, tek bir satırın doğrusal (linearizable) tutarlılığıdır. ACID'deki C ise uygulama seviyesindeki iş kurallarının (örneğin foreign key kısıtları) korunmasıdır. İkisi farklı şeylerdir.
PACELC: Bölünme Yokken Ne Olur?
CAP, bölünme olmadığı durumu sessizce geçer. PACELC bunu tamamlar: Partition varsa A ile C arasında, Else (bölünme yoksa) Latency ile Consistency arasında seçim yaparsın.
Bölünme olmadığında bile tutarlılığı güçlendirmek gecikme yaratır. Örneğin bir yazının çoğunluk düğümlere onaylatılması (quorum) daha tutarlıdır ama daha yavaştır. Bu, günlük tasarım kararlarında CAP'ten daha sık karşınıza çıkar.
Uygulamada Ne Seçilir?
Karar, verinin türüne bağlıdır:
- Ödeme, stok, bakiye: Tutarlılık önceliklidir. Yanlış sonuç, geçici bir hata mesajından daha pahalıdır. CP tarafına yatın.
- Beğeni sayısı, görüntüleme, öneri akışı: Erişilebilirlik önceliklidir. Birkaç saniye eski veri kimseyi rahatsız etmez. AP tarafına yatın.
Bu kararı sistem genelinde değil, veri akışı bazında verin. Aynı uygulama içinde farklı bileşenler farklı tercihler yapabilir.
Tutarlılık Modelleri
"Tutarlı" kelimesi tek bir şeyi ifade etmez. Zayıftan güçlüye yaygın modeller:
- Eventual consistency: Yazma durur ve bölünme çözülürse tüm kopyalar eninde sonunda aynı değere yakınsar. Zaman garantisi vermez.
- Read-your-writes: Bir kullanıcı kendi yazdığını okur. Oturum bazlı yönlendirme ile sağlanır.
- Monotonic reads: Bir kullanıcı daha yeni bir değeri gördüyse, sonrasında daha eski bir değeri görmez.
- Linearizability: Tüm işlemler tek bir noktada ve gerçek zaman sırasına uygun gerçekleşiyormuş gibi görünür. En güçlü ve en maliyetli model.
Modeli uygulamanın gerçek ihtiyacına göre seçin. Her yere linearizability istemek, gereksiz gecikme ve karmaşıklık getirir.
Okuma/Yazma Quorum'u
Kopyalı (replicated) bir sistemde erişilebilirlik ile tutarlılık dengesi genellikle quorum sayılarıyla ayarlanır. N kopya için:
- W = yazma için onay beklenen kopya sayısı
- R = okuma için sorgulanan kopya sayısı
W + R > N olduğunda okuma ve yazma kümeleri en az bir kopyada kesişir; bu da güçlü tutarlılığa yaklaşmanızı sağlar. Örneğin N=3 için W=2, R=2 seçmek yaygın bir dengedir. W=1, R=1 seçerseniz hızlı ama zayıf tutarlı bir sistem elde edersiniz.
Buradaki sayısal ilişki genel bir kuraldır; somut davranış, kullandığınız sistemin kendi belgelerine göre değişir.
Yaygın Hatalar ve Güvenlik Etkileri
Çakışan yazmaları yok saymak. İki düğüm aynı anahtarı farklı değerlerle güncellerse, bölünme çözüldüğünde hangisinin kazandığına karar vermeniz gerekir. Son-yazan-kazan, vektör saatler (vector clock) veya CRDT gibi yöntemler bu çakışmayı çözer. Karar vermezseniz veri sessizce kaybolabilir.
Tutarlılık varsayımıyla yetkilendirme yapmak. Eski veri döndüren bir okuma, iptal edilmiş bir oturumu veya düşürülmüş bir yetkiyi hâlâ geçerli gösterebilir. Yetki kontrolünü zayıf tutarlı bir okumaya dayandırmak, yetki yükseltme (privilege escalation) açığına yol açar. Güvenlik kararları için güçlü tutarlılık gerektiren bir yol kullanın.
Idempotent olmayan yeniden denemeler. Bölünme sırasında istemci isteği tekrar gönderirse, aynı işlem iki kez uygulanabilir. Çift kayıt, çift çekim gibi sonuçlar doğar. İstekleri idempotency anahtarı ile tekilleştirin.
Bölünmeyi test etmemek. Bölünme davranışını yalnızca üretimde görmek pahalıya patlar. Yerel ortamda düğümler arası iletişimi kasıtlı olarak kesip sistemin nasıl davrandığını gözlemleyin.
Pratik Kontrol Listesi
- Her veri akışı için C mi A mı öncelikli olduğunu yazılı olarak belirleyin.
- Kullandığınız veritabanının hangi tutarlılık modelini sunduğunu belgelerinden doğrulayın.
- Çakışma çözüm stratejinizi (son-yazan-kazan, vektör saat, CRDT) baştan seçin.
- Güvenlikle ilgili okumaları zayıf tutarlı yollara bağlamayın.
- Yazma işlemlerini idempotent hale getirin.
- Bölünme senaryolarını yerel test ortamında deneyin.
CAP teoremi bir mimari emir değil, bir sınır hatırlatmasıdır: bölünme anında neyi feda edeceğinizi önceden bilmenizi söyler. Doğru soru "hangi ikisini seçeyim" değil, "bu veri akışında bölünme anında hangi davranış kabul edilebilir" sorusudur.