CAP teoremi: dağıtık sistemlerde tutarlılık ve erişilebilirlik ödünleşimi
CAP teoremi nedir, tutarlılık, erişilebilirlik ve bölünme toleransı ne anlama gelir? Tanım, ağ bölünmesi örneği, CP/AP sistemler ve PACELC.
CAP teoremi nedir?
CAP teoremi, dağıtık veri sistemleri için bir sınırı tarif eder: ağ bölünmesi (partition) yaşandığı anda sistem, tutarlılık (consistency) ve erişilebilirlik (availability) özelliklerinin ikisini birden tam olarak sağlayamaz. Fikir Eric Brewer'a aittir; formal ispatı Seth Gilbert ve Nancy Lynch yapmıştır.
Teoremin kısa özeti çoğu kez "üç özellikten en fazla ikisi" diye aktarılır. Bu özet kullanışlı bir hatırlatmadır, ancak yanıltıcı olabilir: ağ bölünmeleri dağıtık sistemlerde kaçınılmaz olduğundan gerçek tasarım kararı, bölünme sırasında tutarlılığı mı yoksa erişilebilirliği mi önceleyeceğinizdir.
Üç özellik ne anlama gelir?
CAP'taki terimler günlük dildeki anlamlarından dardır.
- Tutarlılık (Consistency): Her okuma, en son yazılan değeri döndürür ya da hata verir. Hangi düğüme gidilirse gidilsin istemciler aynı veriyi görür. Bu, ACID'deki tutarlılıktan farklıdır; orada kast edilen, işlemlerin veri bütünlüğü kurallarını bozmamasıdır.
- Erişilebilirlik (Availability): Çalışan her düğüme ulaşan her istek bir yanıt alır; ancak bu yanıt en güncel veri olmayabilir. Mimaride sözü edilen "yüksek erişilebilirlik" ile aynı şey değildir.
- Bölünme toleransı (Partition tolerance): Düğümler arası mesajlar kaybolsa ya da gecikse bile sistem çalışmaya devam eder.
Bölünme sırasında ne olur?
Örneğin birden çok veri merkezinde çalışan bir sipariş sistemi düşünelim. Merkezler arasındaki bağlantı kesildiğinde, her taraf kendi kullanıcılarına hizmet vermeyi sürdürebilir. Bu durumda bir merkezdeki yazma diğerine ulaşamaz.
Tutarlılığı seçerseniz sistem, güncel bilgiyi garanti edemeyen tarafın isteklerini reddeder ya da bekletir; veri doğru kalır ama kullanıcı bir hata görebilir. Erişilebilirliği seçerseniz her taraf yanıt vermeye devam eder; kullanıcı hizmet alır ama merkezlerdeki veri geçici olarak ayrışır ve bağlantı döndüğünde uzlaştırılması gerekir. Bölünme olmadığı sürece hiçbirinden feragat etmek gerekmez.
CP ve AP sistemler
Pratikte sistemler sıklıkla CP (tutarlılık ve bölünme toleransı) ya da AP (erişilebilirlik ve bölünme toleransı) davranışı eğilimli olarak tanımlanır. CP tarafındaki sistemler genellikle ödeme, bakiye, stok rezervasyonu gibi yanlış verinin pahalıya mal olduğu işlerde tercih edilir: yanlış bakiye göstermektense hata vermek daha güvenlidir.
AP tarafındaki sistemler ise sosyal medya akışı, ürün yorumu sayacı, öneri listesi gibi birkaç saniyelik bayat verinin kabul edilebildiği işlerde uygundur. Bu tür sistemlerde nihai tutarlılık (eventual consistency) modeli kullanılır: güncellemeler zamanla tüm kopyalara yayılır ve kopyalar aynı değere yakınsar. Bir ürünün belirli bir veritabanı olarak CP ya da AP sayılması çoğu zaman yapılandırmaya bağlıdır.
CAP'ın sınırları ve PACELC
CAP yalnızca bölünme anını anlatır. Oysa sistemler zamanlarının çoğunu bölünme olmadan geçirir ve o zaman da bir ödünleşim vardır: yanıtı hızlı vermek ile her kopyanın güncel olmasını beklemek arasında. PACELC genişletmesi bunu ifade eder: bölünme varsa erişilebilirlik ile tutarlılık, yoksa gecikme (latency) ile tutarlılık arasında seçim yapılır.
Ayrıca tutarlılık ikili bir özellik değildir; sıkı tutarlılıktan nihai tutarlılığa uzanan bir yelpaze vardır. Bu yüzden CAP, mimari karar için başlangıç sorusunu çerçeveler, ancak tek başına yeterli bir sınıflandırma sunmaz.
Tasarımda nasıl kullanılır?
Pratik sorular şunlardır: Bu veri yanlış ya da bayat gösterilirse maliyeti nedir? Kullanıcı hata mesajı görmeyi mi, eski veriyi görmeyi mi tercih eder? Bölünme sonrası farklılaşan veri nasıl uzlaştırılacak? Cevaplar sistem içinde bile değişebilir: aynı uygulamada bakiye işlemi tutarlılığı, ürün önerileri erişilebilirliği öne çıkarabilir.
Tasarım desenleri bu kararı destekler. Aynı isteğin tekrarlanması durumunda sonucu değiştirmeyen idempotent işlemler, tekrar denemeleri güvenli kılar. Outbox gibi desenler, veritabanı ve mesaj sistemi arasındaki tutarlılığı korur. Replikasyon ve konsensüs algoritmaları, düğümler arasında hangi değerin geçerli olduğunu belirler.
Mindset programlarında nerede çalışılır?
Dağıtık Sistem Tasarım Desenleri programı; dağıtık sistem temelleri ve yanılgılar, tutarlılık modelleri, bölümleme ve veri dağıtımı, replikasyon ve konsensüs, dayanıklılık desenleri modüllerini içerir. CAP'ın dayandığı kavramları sistematik biçimde ele alan modüller bunlardır.
Idempotency ve Dağıtık Tutarlılık Desenleri programında tekrar problemi, idempotency anahtarı tasarımı, veritabanı seviyesinde tutarlılık, mesajlaşmada tekilleştirme, outbox ve değişiklik verisi yakalama modülleri bulunur. Mikroservis Mimarisi programının veri yönetimi ve tutarlılık ile dayanıklılık desenleri modülleri de konuyla doğrudan ilişkilidir.
İlgili Mindset programı
Dağıtık Sistem Tasarım Desenleri
Sık sorulan sorular
CAP teoremini kim ortaya attı?
Fikir, Eric Brewer tarafından bir varsayım olarak öne sürülmüştür. Seth Gilbert ve Nancy Lynch bunu daha sonra formal olarak ispatlamıştır. Brewer ilerleyen yıllarda "üçten ikisi" ifadesinin yanıltıcı olabileceğini, tasarımcıların yalnızca bölünme sırasında tutarlılık ile erişilebilirlik arasında seçim yapmak zorunda olduğunu belirtmiştir.
CAP'taki tutarlılık, ACID'deki tutarlılık mıdır?
Hayır. CAP'ta tutarlılık, tüm istemcilerin hangi düğüme bağlanırsa bağlansın en son yazılmış değeri görmesi anlamına gelir. ACID'de ise bir işlemin veritabanını geçerli bir durumdan başka bir geçerli duruma götürmesi, yani kısıtlara ve kurallara uyması kastedilir. Aynı sözcük farklı kavramları anlatır; karıştırmak tasarım tartışmalarında yanlış anlamalara yol açar.
Bir sistem hem tutarlı hem erişilebilir olabilir mi?
Bölünme yokken olabilir; çoğu zaman olur da. Teorem, yalnızca bölünme anında ikisinin birden tam olarak garanti edilemeyeceğini söyler. Bu nedenle tasarımcı, bölünme olursa sistemin nasıl davranacağını önceden belirler: tutarlılığı koruyup bazı istekleri reddetmek ya da erişilebilirliği koruyup geçici tutarsızlığı kabul etmek.
Nihai tutarlılık nedir?
Nihai tutarlılık, yeni güncelleme gelmediği sürece tüm kopyaların zamanla aynı değere yakınsayacağını söyleyen modeldir. Okumalar kısa süre bayat veri döndürebilir ama sonunda kopyalar eşitlenir. AP tarafında konumlanan sistemler bu modeli sıkça kullanır. Bayat verinin kabul edilebildiği, hız ve erişilebilirliğin öncelikli olduğu işlerde uygundur.