Selamlar,
Günümüzde hızla gelişen teknolojiyle birlikte, veri depolama ve erişim yöntemleri de büyük değişimler geçiriyor. İnternetin ve dijital ortamların yaygınlaşmasıyla birlikte, büyük ölçekli sistemlerde veri yönetimi daha karmaşık hale gelmektedir. Bu noktada, dağıtık sistemlerdeki Consistency (Tutarlılık), Availability (Erişebilirlik) ve Partition Tolerance (Bölünme Toleransını) sağlama çabaları, CAP teoremi adı verilen temel bir kavram etrafında şekillenmektedir. CAP teoremi, dağıtık sistemlerin üç önemli özelliği olan Consistency, Availability ve Partition Tolerance arasındaki zorunlu dengeyi vurgular. Bu teorem, herhangi bir dağıtık sistemde bu üç özelliğin aynı anda tam olarak sağlanamayacağını belirtir sistemin aynı anda yalnızca 2 sine sahip olabileceğini belirtir. Dolayısıyla, bir sistem tasarlanırken veya yönetilirken bu üç özellik arasında bir denge kurulması gerektiği ortaya çıkar.
CAP teoreminin anlamını daha iyi kavramak için, önce kavramları tanımlayalım:
- Consistency (Tutarlılık): Bu özellik, dağıtık sistemdeki tüm veri kopyalarının aynı olduğunu ve herhangi bir güncelleme işleminden sonra da aynı kalacağını garanti eder. Yani, bir kullanıcı bir veriyi değiştirdiğinde, diğer tüm kullanıcılar da aynı veriyi değişmiş olarak görürler. Bu özellik, veri bütünlüğünü sağlar.
- Availability (Erişilebilirlik): Bu özellik, dağıtık sistemdeki tüm veri kopyalarının her zaman erişilebilir olduğunu ve herhangi bir okuma veya yazma işlemine cevap verebileceğini garanti eder. Yani, bir kullanıcı bir veriyi okumak veya yazmak istediğinde, sistem her zaman bir sonuç döndürür. Bu özellik, veri erişimini sağlar.
- Partition Tolerance (Bölünebilme Toleransı): Bu özellik, dağıtık sistemdeki veri kopyalarının arasındaki ağ bağlantısının kesilmesi veya bozulması durumunda bile sistemin çalışmaya devam edebileceğini garanti eder. Yani, bir kullanıcı bir veriyi okumak veya yazmak istediğinde, sistem ağ hatasına rağmen bir sonuç döndürebilir. Bu özellik, veri dayanıklılığını sağlar.
CAP teoremi, bu üç özelliğin aynı anda sağlanamayacağını söyler. Yani, bir dağıtık sistem tasarlarken veya seçerken, bu özelliklerden hangi ikisine öncelik vereceğimize karar vermemiz gerekir. Bu karar, verinin niteliğine, iş gereksinimlerine ve beklenen performansa göre değişebilir.
CAP teoremini uygulamak için, dağıtık sistemlerin farklı senaryolarda nasıl davrandığını görmek gerekir. Bu senaryolar, aşağıdaki şekilde sınıflandırılabilir:
- CA (Consistency + Availability): Bu senaryoda, dağıtık sistem, veri kopyalarını her zaman aynı tutar ve her zaman erişilebilir olur. Ancak, bu senaryo, ağ bağlantısının kesilmediği veya bozulmadığı varsayımına dayanır. Eğer ağ bağlantısı kesilirse veya bozulursa, sistem ya veri kopyalarını senkronize edemez ya da veri kopyalarına erişemez. Bu durumda, sistem ya tutarlılığı ya da erişilebilirliği kaybeder. Bu senaryoya örnek olarak, geleneksel ilişkisel veritabanları verilebilir. Bu veritabanları, ACID (Atomicity, Consistency, Isolation, Durability) özelliklerini sağlarlar, ancak ağ hatası durumunda çalışamazlar.
- CP (Consistency + Partition Tolerance): Bu senaryoda, dağıtık sistem, veri kopyalarını her zaman aynı tutar ve ağ bağlantısı kesilse veya bozulsa bile çalışmaya devam eder. Ancak, bu senaryo, erişilebilirliği feda eder. Yani, sistem, veri kopyalarını senkronize etmek için yeterli zaman almadan veya ağ hatası giderilmeden veri kopyalarına erişimi engeller. Bu durumda, sistem, veri bütünlüğünü korur, ancak veri erişimini kaybeder.
- AP (Availability + Partition Tolerance): Bu senaryoda, dağıtık sistem, veri kopyalarını her zaman erişilebilir tutar ve ağ bağlantısı kesilse veya bozulsa bile çalışmaya devam eder. Ancak, bu senaryo, tutarlılığı feda eder. Yani, sistem, veri kopyalarını senkronize etmek için yeterli zaman almadan veya ağ hatası giderilmeden veri kopyalarına erişimi sağlar. Bu durumda, sistem, veri erişimini korur, ancak veri bütünlüğünü kaybeder.
Yukarıdaki anlatımı bir örneklerle ifade edelim.
Diyelim ki, bir banka hesabımız var ve bu hesap 5 sunucuda tutuluyor. Hesabımızda 100 TL var ve biz 50 TL çekmek istiyoruz. Eğer sistem CA (Consistency + Availability) ise, bu işlem tüm sunucularda güncellenir ve hesabımızda 50 TL kalır fakat, eğer 2 sunucu arızalanırsa, bu sunucular güncel olmayan veriyi döndürebilir veya hiç cevap veremeyebilir. Örneğin, arızalı sunuculardan birine bağlanırsak, hesabımızda hala 100 TL olduğunu görürüz. Bu durumda, sistem tutarlı değildir çünkü aslında 50 TL olması gerekiyordu. Ayrıca, arızalı sunuculara bağlanmaya çalıştığınızda, işleminiz gerçekleşmez veya çok uzun sürer. Bu durumda, sistem erişilebilir de değildir. Bu yüzden, tutarlı ve erişilebilir bir sistemde bölünebilme toleransı sağlanamaz. Yani, sistem arızalı sunuculara rağmen çalışmaya devam edemez. Burada sistemde 2 sunucu arızalı olmasına rağmen yinede 3 sunucuda hizmet verebiliyoruz yani partition tolerance’yi sağlıyoruz fakat bu durumda da arızalı 2 sunucu hizmet veremiyor o yüzden erişebilirliği kaybetmiş oluyoruz. Aynı zaman da 2 hatalı sunucuda da kalan bakiye bilgileri olması gerekenden farklı olmuş oluyor bu durumda consistency de sağlanamamış oluyor. İşin özünde tutarlı ve erişilebilir bir sistemde bölünme toleransı sağlanamamış olur. Yani CA olduğu zaman P olmaz.
Aynı örnek üzerinde ilerlemek gerekirse CP (Consistency + Partition Tolerance) durumunu düşenelim. 5 sunucudan 2 si yine arızalı ise P yi sağlamış oluruz çünkü hala 3 sunucumuz hizmet veriyor sistem tamamıyla çökmedi. Burada tutarlılığı yani C yi sağlamak istiyorsak bu durumda tüm sunucularda işleme izin vermemeliyiz ki son kalan bakiye sunucudan sunucuya farklılık göstermesin. İzin vermeyerek C yi de sağlarız fakat bu durumda da işleme izin vermediğimiz için A yı yani erişebilirliği kaybetmiş oluruz.
Son olarak AP (Availability + Partition Tolerance) durumunda da 5 sunucudan 2 si arızalı ise hala 3 sunucuda da hizmet verebildiğimiz için P yi sağlarız. Burada sorunlu sunucularda dahil olmak üzere tüm sunucularda işleme izin verirsek A yı yani erişebilirliğide sağlamış oluruz fakat hatalı sunucularda işleme izin verdiğimiz için bu durumda da veriler arasında tutarsızlık olmuş olur. Yani 100 lira bakiyesi olan hesaptan 50 TL çektiğimizde 50 TL kalır. Doğru çalışan sunucularda kalan bakiye 50 TL olarak gözükür ama arızalı sunucularda erişebilirliğe izin verdiğimiz için bu sunucularda arızalı olduğu için orada kalan bakiye hala 100 TL’dir. Bu durumda AP yi sağladığımız sistemlerde C yi sağlayamamış oluruz.
Bu örneklerden de görüldüğü gibi, CAP teoremi, dağıtık sistemlerde veri üzerinden sunulan hizmetlerin bu üç özelliğin aynı anda sağlanamayacağını söyler. Yani, bir dağıtık sistem tasarlarken veya seçerken, bu özelliklerden hangi ikisine öncelik vereceğimize karar vermemiz gerekir. Bu karar, verinin niteliğine, iş gereksinimlerine ve beklenen performansa göre değişebilir. Örneğin bankacılık sistemleri gibi kritik veri işleme sistemlerinde tutarlılık (Consistency) önceliklidir. Bu durumda, Consistency + Availability (CA) tercih edilebilir. Bankacılık uygulamalarında, her işlem anında tutarlı bir şekilde gerçekleşmeli ve her kullanıcı aynı doğru veriyi görmelidir. Diğer yandan, telekomünikasyon ağları gibi sistemlerde bölünebilirlik toleransı (Partition Tolerance) öncelikli olabilir. Veri bütünlüğünü korumak ve ağdaki kesintilere dayanıklılık göstermek adına Consistency + Partition Tolerance (CP) tercih edilebilir. Son olarak, içerik dağıtım ağları gibi büyük ölçekli sistemlerde erişilebilirlik (Availability) öncelikli olabilir. Kullanıcıların her zaman içeriğe erişebilmesi önemlidir, bu nedenle Availability & Partition Tolerance (AP) tercih edilebilir. Bu sistemlerde, anlık güncellemeler veya kısa süreli veri tutarsızlıkları kabul edilebilir, ancak erişilebilirlik kesintiye uğramamalıdır.
Sonuç olarak CAP teoremi, dağıtık sistemlerin temel sınırlamalarından biridir. CAP teoremi, sistemlerin sınırlılıklarını anlamamıza yardımcı olurken, aynı zamanda bu sınırlılıkların yönetilmesi ve optimize edilmesi için yol gösterici bir rol üstlenir.
İyi çalışmalar.