Pratik Bilgiler ve Komutlar: Cassandra
Merhabalar. Bu yazımızda popüler NoSQL veri tabanlarından birisi olan Apache Cassandra ile yaygın olarak kullandığım pratik komut ve ipuçlarını paylaşıyor olacağım. Eğer Cassandra eğitimi almak istiyorsanız Apache Cassandra eğitimi tam size göre olabilir. Cassandra eğitim detaylarına buradan ulaşabilirsiniz.
- Cassandra nedir?
- Cassandra cluster üzerindeki bir node hangi portu kullanıyor?
- Cassandra keyspace oluşturmak
- Cassandra’da consistency level’i nasıl öğrenirim?
- Cassandra consistency level nasıl ayarlanır?
- 3 node Cassandra clusterda consistency level 2 yaptım ve 1 node down oldu. Sorgum çalışır mı?
- Cassandra hinted handoff nedir?
- Cassandra clusterda bir parça(partition) ve replikaları hangi node üzerinde?
- Cassandra nodetool flush ile drain farkı nedir?
- Cassandra cqlsh connection refused hatası
- Cassandra write path nedir?
- Cassandra read path nedir?
- Bloom filter Cassandra’da ne işe yarar?
- Cassandra compaction nedir?
- Cassandra stress testi nasıl yapılır?
- Cassandra dosyadan sorgu çalıştırmak
- Csv dosyasından Cassandra tablosuna veri kopyalamak
- Cassandra frozen kelimesi nedir?
- Cassandra counters nedir?
- Cassandra’da aggregation kullanmak mümkün müdür?
- Cassandra’da join var mı?
- Cassandra cluster nasıl sıfırlarnır? Cassandra cluster reset
Cassandra nedir?
Apache Cassandra, açık kaynak kodlu, dağıtık, merkezi olmayan, yatay ölçeklenebilir, yüksek erişilebilir (high avaiability), hataya dayanıklı, ayarlanabilir tutarlı(tunable-consistency), satır odaklı(row oriented) bir veritabanıdır. Cassandra, dağıtım tasarımını Amazon’un Dinamo’suna ve veri modelini SQL’e benzer bir sorgu diliyle Google’ın Bigtable’ına dayandırıyor. Menşei Facebook’tur. CAP teoreminde AP kenarındadır.
Cassandra cluster üzerindeki bir node hangi portu kullanıyor?
Varsayılan port 9042’dir ancak bundan emin olmanın bir yolu cassandra.yaml dosyasına bakmaktır. Bu dosyada port numarası native_transport_port özelliği ile tutulur.
cat node1/cassandra/conf/cassandra.yaml | grep native_transport_port native_transport_port: 9041 # standard native_transport_port. # Enabling client encryption and keeping native_transport_port_ssl disabled will use encryption # for native_transport_port. Setting native_transport_port_ssl to a different value # from native_transport_port will use encryption for native_transport_port_ssl while # keeping native_transport_port unencrypted. # native_transport_port_ssl: 9142
Cassandra keyspace oluşturmak
Keyspace ilişkisel veri tabanlarındaki database veya schema ile benzer anlam ve işlevdedir. Bir tablo oluşturmadan önce bir keyspace oluşturmak gerekir.
CREATE KEYSPACE bookstore WITH replication = {'class': 'NetworkTopologyStrategy',DC-1': 3,'DC-2': 2};
Yukarıda bookstore adında bir keyspace oluşturduk. Bu keyspace’in replikasyon stratejisi NetworkTopologyStrategy ve replikasyon sayıları da sırasıyla 3 ve 2. Cassandra’nın güzel bir yönü de farklı veri merkezlerinde (DC) farklı replikasyon sayısı belirleyebiliyor olmamız.
Cassandra’da consistency level’i nasıl öğrenirim?
cqlsh> CONSISTENCY; Çıktı: Current consistency level is ONE.
Cassandra consistency level nasıl ayarlanır?
cqlsh:mykeyspace>CONSISTENCY TWO;
3 node Cassandra clusterda consistency level 2 yaptım ve 1 node down oldu. Sorgum çalışır mı?
Hayır çalışmaz. CONSISTENCY ONE; yapmalısınız.
Cassandra hinted handoff nedir?
Coordinator node replicaları dağıtırken alacaklı node’lardan birisi erişilemiyorsa coordinator node onun adına o veriyi belli bir süre tutar ve node erişilebilir olduğunda teslim eder. Saklama süresi, aktif olup olmayacağı gibi özellikler cassandra.yaml dosyası içinden değiştirilebilir.
Cassandra clusterda bir parça(partition) ve replikaları hangi node üzerinde?
node1/bin/nodetool getendpoints mykeyspace mytable 'a_value_of_my_partition_key' Örnek çıktı 127.0.0.2 127.0.0.1 Örnek: nodetool getendpoints bigdata tools_by_technology 'spark' 172.18.0.5 172.18.0.3 172.18.0.4
Burada dikkat edilmesi gereken husus eğer parçayı oluşturan metin içinde boşluk varsa nodetool: 74: [: YAPI: unexpected operator‘a benzer bir hata alabilirsiniz. Bunu çözmek için cqlsh ile ilgili parçaya ait token’ı öğrenip kullanabilirsiniz.
select token(publisher) from bookstore.books_by_publisher where publisher = 'YAPI KREDİ YAYINLARI'; system.token(publisher) ------------------------- 3907502421503645813
nodetool getendpoints bookstore books_by_publisher 3907502421503645813 172.20.0.4 172.20.0.2 172.20.0.3 172.20.0.6 172.20.0.5
Aslında YAPI KREDİ YAYINLARI parçasının bulunduğu node’ları listelemek istiyorduk. Dolaylı yoldan da olsa bulabildik.
Cassandra nodetool flush ile drain farkı nedir?
drain ve flush ikisi de memtable verisini diske (SSTables) yazar. drain client ve diğer node’lardan istek almayı da kapatır. Ancak flush devam eder.
Cassandra cqlsh connection refused hatası
Cassandra üzerinde CQL sorguları çalıştırmak için kullandığımız araç cqlsh’dır. Buna bağlanmak için cqlsh komutunu çalıştırırız. Ancak multinode kullanımlarda farklı bir node üzerinden çalıştırmak istediğimizde cqlsh <node_ip> <port> komutuyla çalıştımalıyız. Eğer şöyle bir hata alıyor isek:
Connection error: ('Unable to connect to any servers', {'127.0.0.2': error(111, "Tried connecting to [('127.0.0.2', 9042)]. Last error: Connection refused")})
Aşağıdaki komutlarla rpc_address eklemek ve node’u yeniden başlatmak sorunu muhtemelen çözecektir.
Ekleme: echo "rpc_address: 127.0.0.2" >> node2/resources/cassandra/conf/cassandra.yaml Kontrol: cat node2/resources/cassandra/conf/cassandra.yaml | grep rpc_address rpc_address: 127.0.0.2 Drain: node2/bin/nodetool drain Stop: node2/bin/nodetool stopdaemon
Cassandra write path nedir?
Cassandra write path, bir node’a yazma isteği ulaştıktan sonra node içinde olup biten işler silsilesidir. Gelen veri hemen diskteki commit log‘a eklenir. Aynı zamanda memtable’a eklenir. Ancak memtable içine kayıt clustering column sıralaması gözetilerek yerleştirilir. Memtable bellekte olduğu için bunu yapmak maliyetli değildir. Ayrıca memtable’ın bu çalışma şekli tablo tasarımında tanımlanan sorgulara çok hızlı cevap dönülmesini sağlar.
Ancak bellekler disklere göre sınırlı depolama sağladığı için Cassandra memtable üzerinde sonsuza kadar veriyi tutamaz. Dolayısıyla memtable doldukça onu diske yazar. Yazdığı veri yapısına SSTable, bu işe ise flush denir. Flush başarıyla tamamlandıktan sonra commit log silinir. Hem commit log hem de SSTable değiştirilemez (immutable) yapıdadır. Commit log’ların farklı (dedicated) disklerde tutulması tavsiye edilir.
Cassandra read path nedir?
Cassandra read path, bir node’a okuma isteği ulaştıktan sonra node içinde olup biten işlerdir. İstek önce memtable’dan karşılanır, eğer orada yok ise SSTable’dan karşılanır. SSTable için isteğin sırasıyla izlediği yol Şekil-1’deki gibidir.
Bloom filter Cassandra’da ne işe yarar?
Bloom filter okumayı hızlandırmak için kullanılır. Bloom filter aranan token varsa olabilir bir bak der ancak yoksa doğrudan yok der boşuna aratmaz. Başka bir deyişle var dediğinin olmama olasılığı vardır ancak yok diyorsa yoktur.
Cassandra compaction nedir?
Cassandra compaction, birden fazla SSTable’ın tek bir SSTable haline getirilmesidir. Compaction SSTable sayısını azalttığı için okuma performansını iyileştirir.
Cassandra stress testi nasıl yapılır?
cassandra/tools/bin/cassandra-stress write no-warmup n=500000 -port native=9042 -rate threads=1
Yukarıdaki komut cassandra.yaml dosyasında belirtilen commitlog_directory dizinine 500 bin satırlık yazma yapacaktır. Yazım için kullanılan keyspace, keyspace1; tablo ise standard1’dir. nodetool cfstats keyspace1.standard1 komutu ile stres testi istatistiklerini inceleyebilirsiniz.
Cassandra dosyadan sorgu çalıştırmak
Sorgularınızı .cql uzantılı bir dosyada sakladınız. Bunu SOURCE komutuyla çalıştırabilirsiniz.
SOURCE '/path/to/myquery.cql';
Csv dosyasından Cassandra tablosuna veri kopyalamak
cqlsh> COPY mykeyspace.mytable(sutun_ismi1 , sutun_ismi2, ... ) FROM '/path/to/csv_dosyasi.csv' WITH HEADER = true ;
Eğer tabloyu csv dosyası içeriğine uygun oluşturamamışsanız aktarılan satır sayısı ile csv dosyasında bulunan satır sayısı farklı olacaktır. Bunun kontrolünü cqlsh üzerinden SELECT COUNT(*) FROM mytable; ve linux terminal wc /path/to/csv_dosyasi.csv ile yapabilirsiniz. Eğer csv dosyasında header varsa arada 1 fark çıkmalıdır. Dikket etmeniz gereken ikinci husus sütun sıralaması tablo ile değil csv dosyası başlık sıralaması ile uyumlu olmalıdır.
Cassandra frozen kelimesi nedir?
Cassandra’da collection veri yapısı içinde başka bir collection kullanılmaz. frozen kelimesi ise bunu yapmak için kullanılır. Frozen collection içindeki elemanları serileştirir. Bu nedenle frozen collectionlara BLOB muamelesi yapılır.
Cassandra counters nedir?
Cassandra counters bir veri türüdür. Sayaç ihtiyacını karşılar. 64 int türündedir. Arttırılabilir veya azaltılabilir. Bir tabloda birden fazla counter column olabilir. PRIMARY KEY içindeki sütunlardan birisi olamaz. COUNTER 0’dan başlamak zorundadır, varsayılan bir değerden başlatamazsınız. Mutlaka UPDATE komutu ile güncellenmelidir.
Counter sütunları indekslenemez ve silinemezler.
UPDATE sales_count_by_store SET store_count = store_count + 1 WHERE store_id = <store_id>;
Cassandra’da aggregation kullanmak mümkün müdür?
Hem hayır hem evet. Hayır. Çünkü SQL dünyasında alışageldiğimiz bir tarzda elimizi kolumuzu sallayarak istediğimiz gibi aggregation sorgusu yazıp çalıştıramayız. Evet çünkü kullanıcı tanımlı fonksiyon (UDF) ve aggregation (UDA) ile bunu yapabiliriz. Ancak burada SQL dünyasının rahatlığını beklemeyin.
Cassandra’da join var mı?
Hayır join yok. Join Cassandra’nın mantığına aykırıdır. Join yapmak istiyorsanız Presto veya Spark gibi araçlarla veriyi okuduktan sonra Cassandra dışında join yapabilirsiniz.
Cassandra cluster nasıl sıfırlarnır? Cassandra cluster reset
Casandra cluster’a dahil node’la veriyi node/data dizininde saklar. Tüm node’larda node’u durdurup bu dizini silmek cluster’ı sıfırlayacaktır. Ancak ayarlar saklanır. Çünkü cassandra.yaml dosyasını değiştirmiyoruz.