4.1 Açıklama

Apache Cassandra, NoSQL sistemleri sınıfına ait olan ve karma biçiminde sunulan devasa veri dizilerinin yüksek düzeyde ölçeklenebilir ve güvenilir depolarını oluşturmak için tasarlanmış dağıtılmış bir veritabanı yönetim sistemidir.

Başlangıçta proje Facebook'un bağırsaklarında geliştirildi ve 2009 yılında Apache Software Foundation'ın kanatları altına devredildi, bu kuruluş projeyi geliştirmeye devam ediyor. Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter ve Spotify gibi şirketlere hizmet sağlamak için Cassandra tabanlı endüstriyel çözümler devreye alınıyor. 2011 yılına gelindiğinde, Cassandra altında tek bir veritabanına hizmet veren en büyük sunucu kümesinde 400'den fazla makine vardı ve 300 TB'tan fazla veri içeriyordu.

Java dilinde yazılmış , artan veri hacmiyle neredeyse doğrusal ölçeklenebilirlik sağlayan, DynamoDB'ye benzer bir dağıtılmış hash sistemi uygular. Verileri yalnızca bir anahtar-değer çiftinde depolayan MemcacheDB gibi sistemlerden farklı iç içe geçmiş karmaları depolama yeteneğiyle farklılık gösteren bir sütun ailesine dayalı bir veri depolama modeli kullanır.

Hataya dayanıklı DBMS kategorisine aittir: veritabanına yerleştirilen veriler, dağıtılmış bir ağın birkaç düğümüne otomatik olarak çoğaltılır veya hatta birkaç veri merkezine eşit olarak dağıtılır. Bir düğüm başarısız olduğunda, işlevleri anında diğer düğümler tarafından alınır, kümeye yeni düğümler eklenir ve Cassandra sürümünün güncellenmesi, ek manuel müdahale ve diğer düğümlerin yeniden yapılandırılması gerekmeden anında yapılır.

Ancak, yük dengeleme kalitesini korumak için mevcut olanlar da dahil olmak üzere her düğüm için anahtarların (etiketlerin) yeniden oluşturulması önemle tavsiye edilir. Düğüm sayısının birden fazla artması durumunda (2 kat, 3 kat vb.) Mevcut düğümler için anahtar üretimi önlenebilir.

4.2 Veri modeli

Cassandra terminolojisinde bir uygulama, ilişkisel modeldeki bir veritabanı şeması kavramına karşılık gelen bir anahtar alanıyla çalışır. Bu anahtar alanı, ilişkisel tablo kavramına karşılık gelen birkaç sütun ailesi içerebilir.

Buna karşılık, sütun aileleri, kayıttaki (satır) tuşu (satır tuşu) kullanılarak birleştirilen sütunları (sütun) içerir. Sütun üç bölümden oluşur: ad (sütun adı), zaman damgası (zaman damgası) ve değer (değer). Bir kayıt içindeki sütunlar sıralanır. İlişkisel bir veritabanından farklı olarak, kayıtların (ve veritabanı açısından bunlar satırlardır) diğer kayıtlarla aynı adlara sahip sütunlar içerip içermediğine dair herhangi bir kısıtlama yoktur - hayır.

Sütun aileleri birkaç türden olabilir, ancak bu yazıda bu ayrıntıyı atlayacağız. Ayrıca Cassandra'nın en son sürümlerinde, CQL dilini kullanarak verileri (DDL, DML) tanımlamak ve değiştirmek için sorguları yürütmek ve ikincil dizinler oluşturmak mümkün hale geldi.

Cassandra'da depolanan belirli değer şu şekilde tanımlanır:

  • keyspace , uygulamaya (etki alanı) bir bağlamadır. Farklı uygulamalardan gelen verileri aynı kümede barındırmanıza olanak tanır;
  • sütun ailesi, bir sorguya bağlanmadır;
  • key, bir küme düğümüne bağlanmadır. Anahtar, kaydedilen sütunların hangi düğümlerde sonlanacağını belirler;
  • sütun adı, kayıttaki bir öznitelik için bağlayıcıdır. Birden fazla değeri tek bir girişte saklamanıza izin verir.

Her değer, kayıt sırasında çakışmaları çözmek için kullanılan kullanıcı tanımlı bir sayı olan bir zaman damgasıyla ilişkilendirilir: sayı ne kadar büyükse, o kadar yeni sütun dikkate alınır ve karşılaştırıldığında eski sütunların üzerine yazılır.

4.3 Veri türleri

Veri türlerine göre: anahtar alanı ve sütun ailesi dizelerdir (adlar); zaman damgası 64 bitlik bir sayıdır; ve anahtar, sütun adı ve sütun değeri bir bayt dizisidir. Cassandra ayrıca veri türleri kavramına sahiptir. Bu türler, bir sütun ailesi oluşturulurken geliştirici tarafından (isteğe bağlı olarak) belirtilebilir.

Sütun adları için buna karşılaştırıcı, değerler ve anahtarlar için ise doğrulayıcı denir. İlki, sütun adları için hangi bayt değerlerine izin verildiğini ve bunların nasıl sıralanacağını tanımlar. İkincisi sütun ve anahtar değerleri için hangi byte değerlerinin geçerli olduğudur.

Bu veri türleri ayarlanmamışsa, cassandra değerleri saklar ve aslında dahili olarak depolandıklarından bayt dizileri (BytesType) olarak karşılaştırır.

Veri türleri şunlardır:

  • BytesType : herhangi bir bayt dizisi (doğrulama yok)
  • AsciiType : ASCII dizisi
  • UTF8Type : UTF-8 dizisi
  • TamsayıTürü : keyfi boyutta sayı
  • Int32Type : 4 baytlık sayı
  • LongType : 8 baytlık sayı
  • UUIDType : UUID tipi 1 veya 4
  • TimeUUIDType : Tip 1 UUID
  • DateType : 8 baytlık zaman damgası değeri
  • BooleanType : iki değer: true = 1 veya false = 0
  • FloatType : 4 baytlık kayan noktalı sayı
  • DoubleType : 8 baytlık kayan noktalı sayı
  • DecimalType : keyfi bir boyuta ve kayan noktalı bir sayı
  • CounterColumnType : 8 bayt sayaç

Cassandra'da, tüm veri yazma işlemleri her zaman yeniden yazma işlemleridir, yani sütun ailesine zaten var olan aynı anahtar ve ada sahip bir sütun gelirse ve zaman damgası kaydedilenden daha büyükse, o zaman değerin üzerine yazılır. . Kaydedilen değerler asla değişmez, sadece yeni değerlerle daha yeni sütunlar gelir.

Cassandra'ya yazmak, okumaktan daha hızlıdır. Bu, tasarımda benimsenen yaklaşımı değiştirir. Cassandra'yı bir veri modeli tasarlama açısından ele alırsak, bir sütun ailesini bir tablo olarak değil, gerçekleştirilmiş bir görünüm olarak hayal etmek daha kolaydır - bazı karmaşık sorguların verilerini temsil eden ancak onu üzerinde depolayan bir yapı. disk.

Sorguları kullanarak bir şekilde veri oluşturmaya çalışmak yerine, bu sorgu için gerekli olabilecek her şeyi hedef ailede depolamaya çalışmak daha iyidir. Yani varlıklar arasındaki ilişkiler veya nesneler arasındaki ilişkiler açısından değil, sorgulamalar açısından yaklaşmak gerekir: hangi alanların seçilmesi gerekiyor; kayıtların hangi sırayla gitmesi gerektiği; ana verilerle ilgili hangi veriler birlikte talep edilmelidir - tüm bunlar zaten sütun ailesinde saklanmalıdır.

Bir kayıttaki sütun sayısı teorik olarak 2 milyar ile sınırlıdır. Bu kısa bir incelemedir ve tasarım ve optimizasyon teknikleri hakkındaki makalede daha fazla ayrıntı bulunabilir. Şimdi verileri cassandra'ya kaydetme ve okuma sürecini inceleyelim.