Dağıtık Sistemler: Tutarlılık, Replikasyon ve CAP
Birden fazla makinede çalışan sistemlerin ağ hatalarıyla nasıl başa çıktığını; replikasyon, consistency ve CAP üzerinden öğrenin.
Tek sunucu bozulduğunda hizmet tamamen duruyorsa ikinci kopya eklemek isteriz. Fakat kopyalar aynı anda farklı veri görürse bu kez “hangi sonuç doğru?” problemi doğar. Dağıtık sistemler kapasite ve dayanıklılık kazandırırken ağ kaynaklı belirsizlik getirir.
Temel terimler
Node, sistemdeki bağımsız çalışan örnektir. Replication, aynı verinin birden fazla node’da kopyalanmasıdır. Partition, node’lar çalışsa bile ağ yüzünden birbirleriyle haberleşememesidir. Consistency model, bir yazmanın okuyuculara ne zaman ve hangi sırayla görüneceğini tanımlar.
Strong consistency, başarılı yazmadan sonra okumanın güncel değeri görmesini hedefler. Eventual consistency, yeni yazma olmazsa kopyaların zaman içinde aynı değere yaklaşacağını söyler. Eventual “rastgele” demek değildir; gecikme, conflict ve okuma davranışı ayrıca tanımlanmalıdır.
CAP ne söyler?
Ağ partition’ı sırasında sistem aynı anda hem her isteğe yanıt verme (availability) hem de bütün node’larda tek güncel değer gösterme (consistency) garantisini tam olarak koruyamaz. Partition tolerance dağıtık ağda seçilebilir bir özellikten çok karşılaşılması gereken koşuldur.
Ödeme bakiyesinde eski değer göstermek kabul edilemezse bazı istekler reddedilebilir. Sosyal medya beğeni sayısında kısa süreli eski değer kabul edilip hizmet açık tutulabilir. CAP etiketi tüm sistemi değil, belirli operasyonu ve hata anını değerlendirir.
Replikasyon seçenekleri
Leader–follower modelinde yazmalar yetkili ana kopya olan leader’a gider; follower’lar değişiklikleri ondan kopyalar. Kopyalama gecikirse follower okuması eski olabilir. Quorum, işlemin geçerli sayılması için replica’ların belirli çoğunluğundan onay alma kuralıdır. Multi-leader, birden fazla node’un yazma kabul etmesini sağlar; farklı liderlerde aynı veri değişirse hangi değerin korunacağını belirleyen conflict resolution gerekir.
Alternatif: dağıtma
İş yükü tek veritabanıyla karşılanabiliyorsa dağıtık tasarım gereksiz karmaşıklıktır. Önce dikey ölçekleme, cache, indeks ve sorgu optimizasyonunu değerlendirin. Dağıtım; ölçülmüş kapasite, coğrafi gecikme veya hata toleransı gereksinimine cevap vermelidir.
Kontrol listesi
- Hangi verinin ne kadar eski olabileceğini yazılı tanımlayın.
- Timeout’u başarısızlıkla aynı şey sanmayın; işlem gerçekleşmiş olabilir.
- Retry öncesi idempotency anahtarı kullanın.
- Saatlerin tam senkron olduğunu varsaymayın.
- Partition ve gecikmeyi hata testlerine ekleyin.