5.1 Veri dağıtımı
Küme düğümleri arasında anahtara bağlı olarak verilerin nasıl dağıtıldığını düşünelim. Cassandra, bir veri dağıtım stratejisi belirlemenizi sağlar. Bu tür ilk strateji, verileri md5 anahtar değerine bağlı olarak dağıtır - rastgele bir bölümleyici. İkincisi, anahtarın kendisinin bit temsilini - sıralı işaretlemeyi (bayt sıralı bölümleyici) hesaba katar.
İlk strateji, çoğunlukla daha fazla avantaj sağlar, çünkü verilerin sunucular arasında eşit dağılımı ve bu tür sorunlar hakkında endişelenmenize gerek yoktur. İkinci strateji, örneğin aralık sorgularının (aralık taraması) gerekli olduğu nadir durumlarda kullanılır. Bu stratejinin seçiminin kümenin oluşturulmasından önce yapıldığını ve aslında verilerin tamamen yeniden yüklenmesi olmadan değiştirilemeyeceğini not etmek önemlidir.
Cassandra, verileri dağıtmak için tutarlı karma oluşturma olarak bilinen bir teknik kullanır. Bu yaklaşım, verileri düğümler arasında dağıtmanıza ve yeni bir düğüm eklenip çıkarıldığında aktarılan veri miktarının az olduğundan emin olmanıza olanak tanır. Bunu yapmak için, her düğüme, tüm md5 anahtar değerleri kümesini parçalara bölen bir etiket (belirteç) atanır. RandomPartitioner çoğu durumda kullanıldığından, bunu ele alalım.
Söylediğim gibi, RandomPartitioner her anahtar için 128 bitlik bir md5 hesaplar. Verilerin hangi düğümlerde saklanacağını belirlemek için, düğümlerin tüm etiketlerini en küçüğünden en büyüğüne doğru geçer ve etiketin değeri md5 anahtarının değerinden büyük olduğunda, bu düğüm ile birlikte bir sonraki düğüm sayısı (etiket sırasına göre) depolama için seçilir. Seçilen düğümlerin toplam sayısı çoğaltma faktörüne eşit olmalıdır. Çoğaltma düzeyi, her anahtar alanı için ayarlanır ve verilerin fazlalığını (veri fazlalığı) ayarlamanıza olanak tanır.
Kümeye bir düğüm eklenmeden önce ona bir etiket verilmelidir. Bu etiket ile bir sonraki etiket arasındaki boşluğu kapatan anahtarların yüzdesi, düğümde ne kadar veri depolanacağını belirler. Bir küme için tüm etiket kümesine halka denir.
Burada, eşit aralıklı etiketlere sahip 6 düğümden oluşan bir küme halkasını görüntülemek için yerleşik nodetool yardımcı programını kullanan bir örnek verilmiştir.
5.2 Yazarken veri tutarlılığı
Cassandra küme düğümleri eşdeğerdir ve istemciler bunlardan herhangi birine hem yazma hem de okuma için bağlanabilir. İstekler, koordinasyon aşamasından geçer; bu sırada, anahtar ve işaretleme yardımıyla verilerin hangi düğümlerde bulunması gerektiğini öğrendikten sonra, sunucu bu düğümlere istekler gönderir. Koordinasyonu gerçekleştiren düğüme koordinatör , kaydı verilen anahtarla kaydetmek için seçilen düğümlere ise replika düğümler diyeceğiz . Fiziksel olarak, çoğaltma düğümlerinden biri koordinatör olabilir - yalnızca anahtara, işaretlemeye ve etiketlere bağlıdır.
Hem okuma hem de yazma için her istek için veri tutarlılığı seviyesini ayarlamak mümkündür.
Bir yazma işlemi için bu seviye, kontrolü kullanıcıya geri vermeden önce işlemin (verilerin yazılması) başarıyla tamamlandığının onaylanmasını bekleyecek olan çoğaltma düğümlerinin sayısını etkileyecektir. Bir kayıt için şu tutarlılık seviyeleri vardır:
- BİR - koordinatör istekleri tüm kopya düğümlere gönderir, ancak ilk düğümden onay bekledikten sonra kontrolü kullanıcıya geri verir;
- İKİ - aynı, ancak koordinatör kontrolü geri vermeden önce ilk iki düğümden onay bekler;
- ÜÇ - benzer, ancak koordinatör kontrolü geri vermeden önce ilk üç düğümden onay bekler;
- QUORUM - bir nisap toplanır: koordinatör, çoğaltma düğümlerinin yarısından fazlasından, yani N'nin çoğaltma düzeyi olduğu yuvarlak (N / 2) + 1'den kaydın onaylanmasını bekler;
- LOCAL_QUORUM - Koordinatör, koordinatörün bulunduğu aynı veri merkezindeki çoğaltma düğümlerinin yarısından fazlasından onay bekliyor (potansiyel olarak her istek için farklı). Diğer veri merkezlerine veri gönderme ile ilgili gecikmelerden kurtulmanızı sağlar. Birçok veri merkezi ile çalışmanın konuları bu yazıda geçerken ele alınıyor;
- EACH_QUORUM - Koordinatör, bağımsız olarak her veri merkezindeki çoğaltma düğümlerinin yarısından fazlasından onay bekliyor;
- ALL - koordinatör, tüm kopya düğümlerinden onay bekler;
- HERHANGİ BİR - tüm çoğaltma düğümleri yanıt vermese bile veri yazmayı mümkün kılar. Koordinatör, ya replika düğümlerin birinden gelen ilk yanıtı ya da koordinatörde imalı bir el değiştirme kullanılarak verilerin saklanmasını bekler.
5.3 Okurken veri tutarlılığı
Okumalar için tutarlılık düzeyi, okunacak çoğaltma düğümlerinin sayısını etkileyecektir. Okumak için şu tutarlılık seviyeleri vardır:
- BİR - koordinatör istekleri en yakın çoğaltma düğümüne gönderir. Kopyaların geri kalanı da cassandra yapılandırmasında belirtilen olasılıkla okuma onarımı için okunur;
- İKİ aynıdır, ancak koordinatör istekleri en yakın iki düğüme gönderir. En büyük zaman damgasına sahip değer seçilir;
- ÜÇ - önceki seçeneğe benzer, ancak üç düğümlü;
- QUORUM - bir çekirdek toplanır, yani koordinatör, çoğaltma düğümlerinin yarısından fazlasına, yani N'nin çoğaltma düzeyi olduğu yuvarlak (N / 2) + 1'e istekler gönderir;
- LOCAL_QUORUM - koordinasyonun gerçekleştiği veri merkezinde bir çekirdek toplanır ve en son zaman damgasına sahip veriler döndürülür;
- EACH_QUORUM - Koordinatör, veri merkezlerinin her birinde yeter sayının toplanmasından sonra verileri döndürür;
- ALL - Koordinatör, tüm çoğaltma düğümlerinden okuduktan sonra verileri döndürür.
Böylece, okuma ve yazma işlemlerinin zaman gecikmelerini ayarlamak ve tutarlılığı (ayar tutarlılığı) ve ayrıca her işlem türünün kullanılabilirliğini (kullanılabilirliğini) ayarlamak mümkündür. Aslında kullanılabilirlik, okuma ve yazma işlemlerinin tutarlılık düzeyiyle doğrudan ilişkilidir, çünkü kaç kopya düğümün çöküp yine de onaylanabileceğini belirler.
Yazma onayının geldiği düğüm sayısı artı okumanın yapıldığı düğüm sayısı çoğaltma seviyesinden büyükse, o zaman yeni değerin her zaman yazmadan sonra okunacağını garanti ederiz ve bu güçlü tutarlılık (güçlü tutarlılık) olarak adlandırılır. Güçlü bir tutarlılığın yokluğunda, bir okuma işleminin eski verileri döndürme olasılığı vardır.
Her durumda, değer eninde sonunda eşlemeler arasında yayılacaktır, ancak yalnızca koordinasyon beklemesi sona erdikten sonra. Bu yayılım nihai tutarlılık olarak adlandırılır. Yazma sırasında tüm çoğaltma düğümleri mevcut değilse, er ya da geç düzeltici okumalar ve anti-entropi düğüm onarımı gibi kurtarma araçları devreye girecektir. Daha sonra bunun hakkında daha fazla bilgi.
Böylece, bir QUORUM okuma ve yazma tutarlılık düzeyi ile güçlü tutarlılık her zaman korunacak ve bu, okuma ve yazma gecikmesi arasında bir denge olacaktır. TÜM yazma ve BİR okuma ile güçlü bir tutarlılık olacak ve okumalar daha hızlı ve daha erişilebilir olacaktır, yani bir okumanın hala tamamlanacağı başarısız düğümlerin sayısı QUORUM'dan daha fazla olabilir.
Yazma işlemleri için tüm çoğaltma çalışan düğümleri gerekli olacaktır. BİRİNİ yazarken, TÜMÜNÜ okurken, aynı zamanda katı bir tutarlılık olacak ve yazma işlemleri daha hızlı olacak ve yazma kullanılabilirliği büyük olacaktır, çünkü yalnızca yazma işleminin sunuculardan en az birinde gerçekleştiğini doğrulamak yeterli olacaktır. okuma daha yavaştır ve tüm kopya düğümleri gerektirir. Bir uygulamanın katı tutarlılık gereksinimi yoksa, hem okuma hem de yazma işlemlerini hızlandırmanın yanı sıra daha düşük tutarlılık seviyeleri ayarlayarak kullanılabilirliği artırmak mümkündür.