Apache Cassandra nedir?
Basit bir şekilde anlatmak gerekirse Apache Cassandra, bir NoSQL veritabanıdır. Esnek bir yapıya sahiptir ve big data işleri için uygundur. Tek bir hata noktası bile olmadan (no single point of failure) yüksek kullanılabilirlik sağlar (high availability). Yazımda size 3 nodelu bir cassandra cluster basitçe nasıl kurulur bunu anlatacağım.
Gerekli Kaynaklar:
- 3 tane Ubuntu 22.04 server.
- Cassandra versiyonuna göre java sürümü, benim örneğimde cassandra 4.1 versiyonu olduğu için OpenJDK 8 / OpenJDK 11 latest versiyonları uygun olacaktır. Java kurmak ve versiyonu check etmek için aşağıdaki commandleri kullanabilirsiniz.
sudo apt-get install openjdk-11-jdk
java -version
- cqlsh, yani cassandra command line toolu için python versiyon 3.6+ veya 2.7 olması yeterli olacaktır. Pythonı kurmak ve versiyonu check etmek için aşağıdaki commandleri kullanabilirsiniz.
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6
python --version
- Cassandra nodeları birbirleriyle haberleşebilmeli, cassandranın default portu 9042 olduğundan, Serverların birbirlerine 9042 portu üzerinden network trafiğinin açık olması gerekli.
Cassandra Kurulumu
Cassandra her 3 server’a cluster haline getirilmeden önce single node olarak kurulmalı. Debian package installation ile aşağıdaki gibi cassandra kurabilirsiniz.
İlk önce repoyu aşağıdaki gibi cassandra.sources.list’e eklemelisiniz:
echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
deb https://debian.cassandra.apache.org 41x main
Daha sonra apache repository keylerini serverınızdaki trusted key listesine eklemelisiniz.
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
Daha sonra package indexi güncelleyip cassandra kurulumunu başlatabilirisiniz.
sudo apt-get update
sudo apt-get install cassandra
Tebrikler! Cassandra single node kurdunuz bile. Cassandra statüsünü kontrol etmek için aşağıdaki commandi kullanabilirsiniz. Bu command sizin cassandra instance durumunuzu gösterecektir.
nodetool status
Datacenter: 168
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.159.129
Not: Korkmayın, UN statüsü, Up/Normal anlamına gelmekte, unavailable değil yani 🙂 .
Ayrıca bununla beraber cqlsh tool yüklendiğinden, direk database’e localhost exception olduğundan bağlanabilirsiniz, sadece command line’a cqlsh yazmanız yeterli.
mertyavuz@ubuntuserver1:~$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
cqlsh>exit;
mertyavuz@ubuntuserver1:~$
Not: Örnek cassandra connection string (cassandra endpoint with basic authentication with default master cassandra user)
cqlsh 10.90.214.187 9042 -u cassandra -p cassandra
Cassandra node specific ve cluster specific config’e girmeden önce, diğer 2 serverda da aynı şekilde cassandraların kurulması gerekli.
Cassandra Standalone Nodeların Cluster Haline Getirilmesi
Daha sonra cassandra.yaml’da (/etc/cassandra/cassandra.yaml) cluster kurulumu için minimum olarak aşağıdaki configürasyonların değiştirilmesi gerek.
İlk olarak seed_provider kısmında seeds valuelarına, bütün cassandra server iplerini girmeniz gerek (her bir node’da)
seed_provider:
# Addresses of hosts that are deemed contact points.
# Cassandra nodes use this list of hosts to find each other and learn
# the topology of the ring. You must change this if you are running
# multiple nodes!
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
# seeds is actually a comma-delimited list of addresses.
# Ex: "<ip1>,<ip2>,<ip3>"
- seeds: "192.168.159.129,192.168.159.130,192.168.159.131"
Listen address valuesu spesifik olarak server IPsi olmalı.
listen_address: 192.168.159.129
Endpoint snitch aşağıdaki gibi olmalı.
endpoint_snitch: RackInferringSnitch
Bu parametleri cassandra.yaml’da değiştirdikten sonra, her bir node da cassandra servisleri restart edilmeli.
service cassandra restart
Daha sonra cassandra servisleri GossipProtocol üzerinden haberleşmeye başlayacaktır. Bunu yine nodetool status commandiyle kontrol edebilirsiniz:
Şimdi sizlerle Replication test etme senaryosu yapalım, aşağıdaki gibi herhangi bir node’a cqlsh ile bağlanıp keyspace oluşturun ve ardından tablo oluşturup buna insert yapın.
CREATE KEYSPACE foo WITH replication= {'class': 'SimpleStrategy', 'replication_factor': 3};
use foo;
create TABLE test (sno int PRIMARY KEY, pname text);
INSERT INTO test (sno , pname ) VALUES (1,'mert');
INSERT INTO test (sno , pname ) VALUES (2,'mert');
select * from test;
sno | pname
-----+-------
1 | mert
2 | mert
daha sonra db den çıkıp bu kayıtların hangi nodelara ulaştığını aşağıdaki command ile bulabirsiniz:
mertyavuz@ubuntuserver1:~$ nodetool -h localhost getendpoints foo test 1
192.168.159.131
192.168.159.129
192.168.159.130
3 nodelu Cassandra cluster kurulumu bu şekilde tamamlanıyor.
Ekstra Değinilmesi Gerekenler
Consistency level, Cassandra tutarlılık düzeyidir, işlemin başarılı (örneğin; CRUD işlemleri) sayılabilmesi için onaylaması gereken minimum Cassandra node sayısı olarak tanımlanır. Örneğin; consistency quorum level yapıldığında (n/2 +1) formülü uyganır. Default olarak bu 1’dir.
cqlsh> consistency quorum;
Consistency level set to QUORUM.
Consistency için ekstra bilgiye aşağıdaki linkten ulaşılabilir:
https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html
Eğer cassandra servis başlatmasında “cannot start node if snitch’s data center differs from previous data center” hatası alınıyorsa, cassandra-env.sh file da aşağıdaki commandler eklenmeli:
vim /etc/cassandra/cassandra-env.sh
VM_OPTS="$JVM_OPTS -Dcassandra.ignore_dc=true"
JVM_OPTS="$JVM_OPTS -Dcassandra.ignore_rack=true"
Yazım ile ilgili feedback vermek istiyorsanız ya da bir sorun yaşıyorsanız lütfen bana ulaşın.