Tutarlılık Seviyeleri ve Quorum — CAP'ı Doğru Okumak
Önce şunu oku: Replikasyon ve Okuma Replikaları — Yazdım Ama Göremiyorum
30 saniyede özet
Verinin birkaç kopyası varsa her yazma ve okumada 'kaç kopya cevap versin?' diye seçersin. Yazdığın ve okuduğun kopyalar kesişiyorsa son yazılanı görürsün. Daha sıkı seçim daha tutarlıdır, ama arızada daha kolay reddeder.
Sepete eklenen ürün, sayfa yenilenince kayboluyor, bir daha yenilenince geri geliyordu. Cassandra kümesi sağlıklıydı; bütün düğümler ayaktaydı. Uygulama her şeyi ONE seviyesinde yazıp okuyordu.
-
Bayt: Sepete eklediğim ürün yenileyince kayboluyor, bir daha yenileyince geri geliyor!
-
Sen: Küme bozuk mu?
-
Bayt: Hayır, bütün düğümler ayakta ve sağlıklı.
-
Bayt: Üç arkadaşa bir randevu söylüyorsun. Kaçına söylersen, kaçına sorunca kesin öğrenirsin?
CAP ne diyor, ne demiyor?
CAPAğ bölündüğünde dağıtık bir sistemin ya tutarlılıktan ya erişilebilirlikten vazgeçmek zorunda olduğunu söyleyen teorem.PACELC bunu tamamlar: bölünme yokken de her istekte gecikme ile tutarlılık arasında bir seçim vardır.Sözlükte gör → çoğu zaman “tutarlılık, erişilebilirlik ve bölünme toleransından ikisini seç” diye özetlenir. Daha doğru okuma şudur: ağ bölünmesi olur; olduğunda ya eski olabilecek bir cevap verirsin ya da hiç cevap vermezsin.
PACELC bir adım daha ekler: bölünme yokken bile her istekte gecikme ile tutarlılık arasında seçim yaparsın. Kopyaları beklemek tutarlılık getirir, bedeli beklemektir.
Kafam karıştı, daha basit anlat
Ağ bir gün mutlaka kopar. O an iki seçeneğin var: elindeki belki eski bilgiyle cevap vermek ya da emin olana kadar hiç cevap vermemek.
CAP teoreminin en doğru okuması hangisi?
Kaç kopyaya sormalı?
Üç kopya var (N = 3). Yazma bir kopyanın onayıyla (W = 1), okuma bir kopyanın cevabıyla (R = 1) yetiniyor. Az önce yazılan değer okunur mu? Cevabı göster
Garanti değil. Okunan kopya, yazmayı onaylayan kopya olmayabilir. R + W = 2, N’yi geçmediği için ikisinin kesişmesi şansa kalır.
Adım adım oku
- W bir: randevu yalnızca bir arkadaşın takvimine yazılır.
- R bir: başka bir arkadaşa sorulur ve onun haberi yoktur. Değer kaybolmuş gibi görünür.
- W iki, R iki: randevu iki kişiye söylenir, sonra iki kişiye sorulur.
- W artı R, kopya sayısı N'den büyük olunca sorulanlardan en az biri randevuyu mutlaka bilir.
Okunan kopyalar ile yazmayı onaylayan kopyalar en az bir yerde kesişirse, okuma son yazmayı görür. Bunun koşulu R + W > N’dir. N = 3 için çoğunluk, yani quorumKopyaların çoğunluğu. N kopyada okuma R, yazma W kopyadan cevap bekliyorsa ve R + W > N ise okuma son yazmayı mutlaka görür.Sözlükte gör →, 2’dir: QUORUM + QUORUM = 4 > 3.
Kafam karıştı, daha basit anlat
Üç arkadaşın ikisine söyleyip ikisine sorarsan, en az biri mutlaka bilir. Yazdığın ve sorduğun kişi sayısı toplam kişiden fazla olunca, cevap garantidir.
N = 5 kopya. Okumanın her zaman son yazmayı görmesi için hangi R, W çifti yeterlidir?
Cassandra'da sepet `ONE` seviyesinde yazılıp okunuyor ve eklenen ürünler arada kayboluyor. Bütün düğümler ayakta. Neden?
Kendin gör
N = 3: kaç kopya yazsın, kaç kopya okusun?
Tohum 355728Düğüm A
v1
Düğüm B
v1
Düğüm C
v1
Oynat ya da adımla.
Şu an ne oldu?
R + W = 1 + 1 = 2 ≤ N (3)
Bir değer v1'den v2'ye yazılacak, hemen ardından okunacak.
Görevler0/3
İkisi de başarılı olsun ama okuma eski değeri getirsinaçık
İpucu
R + W, N'yi geçmesin.
Bir düğüm düşünce isteklerin reddedilmesine yol açaçık
İpucu
Bütün kopyaları bekleyen bir seviye.
Bir düğüm çalışmıyorken yazma ve okuma başarılı, okuma taze olsunaçık
İpucu
Çoğunluk, bir düğümün eksikliğini tolere eder.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. ONE / ONE: yazma “tamam”, okuma v1.
- İkisini QUORUM yap. Okuma v2; aritmetik bunu garanti ediyor.
- Bir düğümü düşür. QUORUM hâlâ çalışıyor.
- Yazmayı ALL yap. Aynı arızada yazma reddedildi.
- İki düğümü düşür. QUORUM da ayakta kalamıyor.
Simülatörde bir düğüm düşünce QUORUM/QUORUM çalışmaya devam etti, yazma ALL olunca reddedildi. Bu neyi gösteriyor?
Ayar nerede yapılır?
- Cassandra: tutarlılık seviyesi sorgu başına seçilir; çok veri merkezinde
LOCAL_QUORUMyaygındır. - MongoDB: yazmada
writeConcern: "majority", okumadareadConcern: "majority". Replica set’in çoğunluğu onaylamadan yazma kalıcı sayılmaz. - İlişkisel veritabanları: aynı takas senkron ve asenkron replikasyon olarak karşına çıkar.
“Sonunda tutarlı” demek, eventual consistencySistemin bir süre tutarsız kalıp sonunda tutarlı hâle gelmesi. Saga'nın verdiği garanti budur; arada geçilen ara durumu tasarımın kabul etmesi gerekir.Sözlükte gör → demektir: yeni yazma olmazsa bütün kopyalar bir gün aynı değere ulaşır. Ne zaman ulaşacakları söz konusu değildir.
Şimdi bunu bir bankada deneyelim. Müşteri kartını kaybetti ve uygulamadan dondurdu; birkaç saniye sonra biri o kartla ödeme deniyor.
Derinleş · Kart dondurma: kaç kopya bilsin, kaç kopyaya sorulsun? 4 dosya · ~67 satır · ilk okumada atlayabilirsin
Kafam karıştı, daha basit anlat
Bu ayar her veritabanında farklı bir adla yapılır, ama fikir aynıdır: kaç kopyanın onayını bekleyeceğine sen karar verirsin.
MongoDB'de `writeConcern: { w: 1 }` ile yazılan bir sipariş, primary çöktükten sonra kayboldu. Hangi ayar bunu önlerdi?
Cassandra kümesi iki veri merkezine yayılmış (her birinde 3 kopya). Her istek QUORUM ile çalışıyor ve gecikme çok yüksek. Tipik düzeltme?
Tuzaklar
Veri merkezleri arası QUORUM. Her istek okyanus aşırı gidip gelir. Yerel çoğunluk (LOCAL_QUORUM) çoğu zaman doğru takastır.
last-write-winsÇakışan iki yazmadan zaman damgası büyük olanın kalması. Basittir, ama düğümlerin saatleri kaymışsa gerçekte daha yeni olan yazma kaybolabilir.Sözlükte gör →. Çakışan iki yazmada zaman damgası büyük olan kazanır; saatleri kaymış düğümlerde yeni bir yazma eskisine kaybedebilir.
ALL güvenli sanılır. Tek bir düğüm düşünce bütün istekler reddedilir.
Varsayılanlara güvenmek. Sürücünün ve kümenin varsayılan seviyesini kontrol et; çoğu zaman en zayıf olanıdır.
Last-write-wins kullanan bir sistemde bir düğümün saati birkaç saniye geride. Ne olabilir?
Kendini sına
W artı R, N'den büyükse okuma en az bir güncel kopyaya denk gelir.
N = 3 için her R/W çiftini, okumanın son yazmayı görmesini garanti edip etmemesine göre ayır.
Aklında kalacak üç şey
- 1 CAP 'üçünden ikisini seç' demek değildir: ağ bölündüğünde eski bir cevap vermek ile hiç cevap vermemek arasında seçim yaparsın.
- 2 N kopyada okuma R, yazma W kopyadan cevap bekliyorsa, R + W > N olduğunda okuma son yazılanı görür. N = 3 için QUORUM + QUORUM bunu sağlar.
- 3 Cassandra'da seviye her sorguda, MongoDB'de writeConcern ve readConcern ile seçilir. Varsayılanlar çoğu zaman beklenenden gevşektir.
5 kart sonraki derste seni bekliyor