Cassandra Kurulumu ve Ubuntu 22.04 Üzerinde Çok Düğümlü Bir Küme Çalıştırma
Dağıtık sistemlerin ve büyük veri çözümlerinin yükselişiyle birlikte, yüksek performanslı, ölçeklenebilir ve hataya dayanıklı veritabanı sistemlerine olan ihtiyaç artmıştır. Apache Cassandra, bu ihtiyaçları karşılamak üzere tasarlanmış, açık kaynaklı, dağıtık bir NoSQL veritabanıdır. Petabaytlarca veriyi işleyebilir ve binlerce düğümden oluşan kümelerde bile sürekli yüksek kullanılabilirlik sunar. Bu teknik makalede, Ubuntu 22.04 işletim sistemi üzerinde Apache Cassandra’nın nasıl kurulacağını ve çok düğümlü bir kümenin nasıl yapılandırılıp çalıştırılacağını adım adım inceleyeceğiz.
Giriş: Apache Cassandra’ya Genel Bakış
Apache Cassandra, Facebook tarafından geliştirilen ve daha sonra Apache Yazılım Vakfı’na bağışlanan, sütun tabanlı bir NoSQL veritabanıdır. Temel özellikleri şunlardır:
* Dağıtık Mimari: Veriler, kümedeki tüm düğümlere otomatik olarak dağıtılır. Bu, tek bir hata noktasını ortadan kaldırır ve sistemin hataya dayanıklılığını artırır.
* Yüksek Ölçeklenebilirlik: İhtiyaç duyulduğunda kümeye yeni düğümler ekleyerek kapasite ve performansı doğrusal olarak artırabilir.
* Yüksek Kullanılabilirlik ve Hataya Dayanıklılık: Veri kopyaları (replikalar) birden fazla düğümde tutulur. Bir düğüm çevrimdışı olsa bile, veriye diğer kopyalardan erişilebilir.
* Esnek Veri Modeli: Şemasız veya esnek şemalı bir veri modeline sahiptir, bu da geliştiricilere daha fazla özgürlük tanır.
* AP (Availability & Partition Tolerance) Odaklı: CAP teoremi bağlamında, Cassandra genellikle yüksek kullanılabilirlik ve bölüm toleransını önceliklendirirken, tutarlılığı yapılandırılabilir bir seviyede sunar.
Cassandra’nın çok düğümlü bir küme olarak çalıştırılması, gerçek dünya uygulamaları için kritik öneme sahiptir. Tek bir düğüm, geliştirme ve test ortamları için yeterli olabilirken, üretim ortamlarında veri kaybını önlemek, performansı artırmak ve kesintisiz hizmet sunmak için birden fazla düğümden oluşan bir küme şarttır. Bu makalede, en az üç düğümlü bir küme yapılandırmasına odaklanacağız.
Ön Gereksinimler
Cassandra kümesini kurmaya başlamadan önce, aşağıdaki ön gereksinimlerin karşılandığından emin olmalısınız:
1. Birden Fazla Ubuntu 22.04 Sunucusu: En az üç adet ayrı Ubuntu 22.04 sunucusuna (sanal makine veya fiziksel sunucu) ihtiyacınız olacak. Her bir sunucu için benzersiz bir IP adresi ve ana bilgisayar adı (hostname) belirlemek önemlidir. Örneğin:
* cassandra-node1: 192.168.1.101
* cassandra-node2: 192.168.1.102
* cassandra-node3: 192.168.1.103
2. Sistem Kaynakları: Her bir düğüm için minimum 8 GB RAM, 2-4 CPU çekirdeği ve yeterli disk alanı (tercihen SSD) önerilir. Üretim ortamları için bu değerler daha yüksek olmalıdır.
3. SSH Erişimi: Tüm düğümlere SSH aracılığıyla erişebilmeniz ve sudo ayrıcalıklarına sahip olmanız gerekmektedir.
4. Ağ Yapılandırması:
* Tüm düğümlerin birbirleriyle ağ üzerinden iletişim kurabildiğinden emin olun.
* Güvenlik duvarı (firewall) kuralları, Cassandra’nın kullandığı portlara izin vermelidir (bkz. Güvenlik Duvarı Yapılandırması bölümü).
* Ana bilgisayar adlarının (hostname) doğru bir şekilde çözümlenmesi için /etc/hosts dosyasını yapılandırabilir veya bir DNS sunucusu kullanabilirsiniz.
# Her düğümde /etc/hosts dosyasını düzenleyin
sudo nano /etc/hosts
Aşağıdaki satırları her düğüme ekleyin (IP adreslerini kendi yapınıza göre güncelleyin):
192.168.1.101 cassandra-node1
192.168.1.102 cassandra-node2
192.168.1.103 cassandra-node3
5. Java Geliştirme Kiti (JDK): Cassandra, Java sanal makinesi (JVM) üzerinde çalışır. Cassandra 4.x serisi için OpenJDK 11 önerilir.
Java Kurulumu
Her Cassandra düğümünde Java 11’i kurmanız gerekmektedir. Aşağıdaki adımları tüm sunucularda tekrarlayın:
1. Sistem Paketlerini Güncelleyin:
sudo apt update
sudo apt upgrade -y
2. OpenJDK 11’i Kurun:
sudo apt install openjdk-11-jdk -y
3. Java Kurulumunu Doğrulayın:
java -version
Çıktı, OpenJDK 11’in kurulu olduğunu göstermelidir:
openjdk version "11.0.x" 202x-xx-xx
OpenJDK Runtime Environment (build 11.0.x+x-Ubuntu-xxxx.x)
OpenJDK 64-Bit Server VM (build 11.0.x+x-Ubuntu-xxxx.x, mixed mode, sharing)
4. JAVA_HOME Ortam Değişkenini Ayarlayın (Önerilir):
Bu adım zorunlu olmasa da, bazı uygulamalar ve betikler için JAVA_HOME değişkeninin ayarlanması iyi bir uygulamadır.
echo "JAVA_HOME=$(update-java-alternatives --query-installed | grep "java-1.11.0" | awk '{print $NF}')" | sudo tee -a /etc/environment
source /etc/environment
echo $JAVA_HOME
Bu komut, sistem genelinde JAVA_HOME değişkenini ayarlar.
Cassandra Kurulumu
Java kurulduktan sonra, her düğüme Cassandra’yı kurabiliriz. Cassandra’yı APT deposundan kurmak, güncellemeleri yönetmeyi kolaylaştırır. Bu adımları da tüm düğümlerde tekrarlayın.
Cassandra Paket Deposu Ekleme
1. Apache Cassandra GPG Anahtarını İçe Aktarın:
wget -q -O - https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
Eğer apt-key komutu kullanımdan kaldırıldığına dair bir uyarı verirse, modern yöntemi kullanabilirsiniz:
sudo wget -O /usr/share/keyrings/cassandra.asc https://www.apache.org/dist/cassandra/KEYS
2. Cassandra APT Deposunu Kaynak Listesine Ekleyin:
Cassandra 4.x serisini kurmak için aşağıdaki depoyu ekleyin. (Mevcut en son stabil sürümü kontrol etmek için Apache Cassandra web sitesini ziyaret edebilirsiniz.)
echo "deb [signed-by=/usr/share/keyrings/cassandra.asc] http://www.apache.org/dist/cassandra/debian 40x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.list
Not: 40x yerine, kurmak istediğiniz Cassandra sürümünün ana numarasını yazın. Örneğin, Cassandra 4.0.x için 40x, Cassandra 4.1.x için 41x kullanın. Bu makalenin yazıldığı tarih itibarıyla 4.1.x serisi en güncel stabil sürümlerden biridir, bu nedenle 41x kullanmak iyi bir seçim olacaktır.
echo "deb [signed-by=/usr/share/keyrings/cassandra.asc] http://www.apache.org/dist/cassandra/debian 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.list
3. Paket Listesini Güncelleyin:
Yeni depoyu tanıması için sistemin paket listesini güncelleyin:
sudo apt update
Cassandra Yükleme
1. Cassandra Paketini Kurun:
sudo apt install cassandra -y
Bu komut, Cassandra’yı ve tüm bağımlılıklarını kuracaktır. Kurulumdan sonra Cassandra servisi otomatik olarak başlayabilir.
2. Cassandra Servis Durumunu Kontrol Edin:
sudo systemctl status cassandra
Servis active (running) durumda olmalıdır. Eğer değilse, sudo systemctl start cassandra komutuyla başlatabilirsiniz.
3. Başlangıçta Otomatik Başlamayı Etkinleştirin:
sudo systemctl enable cassandra
Çok Düğümlü Küme Yapılandırması
Cassandra’yı tüm düğümlere kurduktan sonra, onları bir küme olarak çalışacak şekilde yapılandırmamız gerekir. Bu, her düğümün cassandra.yaml yapılandırma dosyasını düzenlemeyi içerir. Bu dosya /etc/cassandra/cassandra.yaml konumunda bulunur.
Önemli: Yapılandırma değişikliklerini uygulamadan önce her düğümde Cassandra servisini durdurun:
sudo systemctl stop cassandra
Genel Yapılandırma Adımları (Tüm Düğümler)
Her düğümde sudo nano /etc/cassandra/cassandra.yaml komutuyla yapılandırma dosyasını açın ve aşağıdaki parametreleri düzenleyin:
1. cluster_name: Kümenizin adını belirler. Tüm düğümler için aynı olmalıdır.
cluster_name: 'MyCassandraCluster'
2. num_tokens: Cassandra’nın veriyi küme genelinde nasıl dağıttığını belirleyen sanal düğüm sayısını tanımlar. Varsayılan değer (256) çoğu durum için iyidir. Değiştirmeniz gerekmedikçe varsayılanı bırakın.
3. data_file_directories, commitlog_directory, saved_caches_directory: Bu parametreler, Cassandra’nın veriyi, işlem günlüklerini ve önbellek dosyalarını nerede saklayacağını belirler. Varsayılan yollar genellikle /var/lib/cassandra/data, /var/lib/cassandra/commitlog ve /var/lib/cassandra/saved_caches şeklindedir. Performans veya disk yönetimi nedenleriyle bunları değiştirebilirsiniz (örneğin, ayrı disklerde tutmak). Şimdilik varsayılanları kullanacağız.
4. listen_address: Bu düğümün diğer Cassandra düğümleriyle iletişim kurmak için kullanacağı IP adresidir. Her düğüm için kendi IP adresi olmalıdır.
* Düğüm 1 (192.168.1.101):
listen_address: 192.168.1.101
* Düğüm 2 (192.168.1.102):
listen_address: 192.168.1.102
* Düğüm 3 (192.168.1.103):
listen_address: 192.168.1.103
* Eğer bir broadcast_address belirtilmezse, listen_address aynı zamanda diğer düğümlere tanıtılacak adrestir.
5. rpc_address: Bu düğümün istemci uygulamalarıyla (örneğin cqlsh) iletişim kurmak için kullanacağı IP adresidir. Genellikle listen_address ile aynıdır. 0.0.0.0 olarak ayarlamak, tüm ağ arayüzlerinden gelen bağlantıları dinlemesini sağlar, ancak güvenlik açısından belirli bir IP’ye ayarlamak daha iyidir.
* Düğüm 1 (192.168.1.101):
rpc_address: 192.168.1.101
* Düğüm 2 (192.168.1.102):
rpc_address: 192.168.1.102
* Düğüm 3 (192.168.1.103):
rpc_address: 192.168.1.103
6. broadcast_address ve broadcast_rpc_address:
* Eğer düğümleriniz bir NAT arkasındaysa veya listen_address‘ten farklı bir IP adresi üzerinden diğer düğümlere tanıtılması gerekiyorsa broadcast_address‘i ayarlayın. Çoğu senaryoda listen_address ile aynıdır ve açıkça ayarlamanıza gerek kalmaz.
* Benzer şekilde, istemcilerin farklı bir IP üzerinden bağlanması gerekiyorsa broadcast_rpc_address‘i ayarlayın. Aksi takdirde, rpc_address kullanılır.
* Basit bir küme kurulumunda, bunları genellikle ayarlamanıza gerek yoktur, Cassandra varsayılan olarak listen_address ve rpc_address değerlerini kullanır.
7. seeds: Bu, kümedeki “tohum” düğümlerin bir listesidir. Tohum düğümler, yeni katılan düğümlerin küme hakkında bilgi edinmek için ilk başvurduğu düğümlerdir. Tüm düğümlerin seeds listesi aynı olmalıdır. Genellikle kümedeki 2-3 düğümü tohum olarak seçmek iyi bir uygulamadır. Tüm düğümlerin tohum olması gerekmez, hatta önerilmez.
Örnek olarak, cassandra-node1 ve cassandra-node2‘yi tohum düğümleri olarak seçelim:
seeds: "192.168.1.101,192.168.1.102"
Bu satırı tüm düğümlerde aynı şekilde ayarlayın.
8. endpoint_snitch: Cassandra’nın düğümlerin ağ topolojisini nasıl algıladığını belirler.
* SimpleSnitch: En basitidir, tüm düğümlerin aynı veri merkezinde ve rafta olduğunu varsayar. Test ortamları için uygundur.
* GossipingPropertyFileSnitch: Üretim ortamları için önerilen snitch’lerden biridir. cassandra-rackdc.properties dosyasını kullanarak veri merkezi ve raf bilgilerini belirlemenizi sağlar. Bu, Cassandra’nın verileri coğrafi olarak akıllıca dağıtmasına yardımcı olur.
* RackInferringSnitch: Düğümlerin IP adreslerine bakarak raf ve veri merkezi bilgilerini tahmin etmeye çalışır.
Varsayılan SimpleSnitch yerine GossipingPropertyFileSnitch kullanmak daha iyi bir uygulamadır:
endpoint_snitch: GossipingPropertyFileSnitch
Eğer GossipingPropertyFileSnitch kullanıyorsanız, her düğümde /etc/cassandra/cassandra-rackdc.properties dosyasını da yapılandırmanız gerekir.
sudo nano /etc/cassandra/cassandra-rackdc.properties
Bu dosyaya aşağıdaki satırları ekleyin (örneğin, tüm düğümlerin “datacenter1” içinde ve “rack1” içinde olduğunu varsayalım):
dc=datacenter1
rack=rack1
Gerçek bir üretim ortamında, farklı veri merkezleri veya raflarınız varsa, bu değerleri buna göre ayarlamanız gerekir.
Düğüm 1 Yapılandırması (Örnek)
/etc/cassandra/cassandra.yaml dosyasında (IP: 192.168.1.101):
cluster_name: 'MyCassandraCluster'
listen_address: 192.168.1.101
rpc_address: 192.168.1.101
seed düğümleri listesi (tüm düğümlerde aynı olmalı)
seeds: "192.168.1.101,192.168.1.102"
endpoint_snitch: GossipingPropertyFileSnitch
/etc/cassandra/cassandra-rackdc.properties dosyasında (IP: 192.168.1.101):
dc=datacenter1
rack=rack1
Düğüm 2 Yapılandırması (Örnek)
/etc/cassandra/cassandra.yaml dosyasında (IP: 192.168.1.102):
cluster_name: 'MyCassandraCluster'
listen_address: 192.168.1.102
rpc_address: 192.168.1.102
seed düğümleri listesi (tüm düğümlerde aynı olmalı)
seeds: "192.168.1.101,192.168.1.102"
endpoint_snitch: GossipingPropertyFileSnitch
/etc/cassandra/cassandra-rackdc.properties dosyasında (IP: 192.168.1.102):
dc=datacenter1
rack=rack1
Düğüm 3 Yapılandırması (Örnek)
/etc/cassandra/cassandra.yaml dosyasında (IP: 192.168.1.103):
cluster_name: 'MyCassandraCluster'
listen_address: 192.168.1.103
rpc_address: 192.168.1.103
seed düğümleri listesi (tüm düğümlerde aynı olmalı)
seeds: "192.168.1.101,192.168.1.102"
endpoint_snitch: GossipingPropertyFileSnitch
/etc/cassandra/cassandra-rackdc.properties dosyasında (IP: 192.168.1.103):
dc=datacenter1
rack=rack1
Yapılandırma dosyalarını kaydettikten sonra her düğümde Cassandra servisini yeniden başlatmaya hazırız.
Güvenlik Duvarı (Firewall) Yapılandırması
Cassandra düğümlerinin birbirleriyle ve istemcilerle iletişim kurabilmesi için gerekli portların güvenlik duvarında açık olması gerekir. Ubuntu’da UFW (Uncomplicated Firewall) kullanıyorsanız, aşağıdaki komutları her düğümde çalıştırın:
sudo ufw allow 7000/tcp # Düğümler arası iletişim (gossip)
sudo ufw allow 7001/tcp # Düğümler arası SSL iletişim (eğer kullanılıyorsa)
sudo ufw allow 7199/tcp # JMX portu (nodetool için)
sudo ufw allow 9042/tcp # CQL istemci portu (cqlsh için)
sudo ufw allow 9160/tcp # Thrift istemci portu (eski istemciler için, artık önerilmez)
sudo ufw enable
sudo ufw status verbose
Bu portlar, Cassandra kümesinin düzgün çalışması için temel portlardır.
Kümenin Başlatılması ve Doğrulanması
Tüm yapılandırmalar tamamlandıktan sonra, düğümleri başlatabilir ve küme durumunu kontrol edebiliriz.
Düğümleri Başlatma Sırası
1. Önce Tohum Düğümleri Başlatın: seeds listesinde belirttiğiniz düğümleri önce başlatın (örneğimizde cassandra-node1 ve cassandra-node2).
sudo systemctl start cassandra
2. Diğer Düğümleri Başlatın: Tohum düğümleri başladıktan ve bir süre sonra diğer düğümleri başlatın (cassandra-node3).
sudo systemctl start cassandra
Küme Durumunu Kontrol Etme
Herhangi bir düğümde nodetool status komutunu çalıştırarak kümenin durumunu kontrol edebilirsiniz:
nodetool status
Çıktı aşağıdaki gibi görünmelidir:
Datacenter: datacenter1
=======================
Status=Up/Down
| State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.1.101 123.45 KB 256 100.0% xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rack1
UN 192.168.1.102 123.45 KB 256 100.0% yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy rack1
UN 192.168.1.103 123.45 KB 256 100.0% zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz rack1
* Status sütunu: UN (Up/Normal) durumu, düğümün çalışır durumda olduğunu ve kümenin normal bir parçası olduğunu gösterir. DN (Down/Normal), UL (Up/Leaving) gibi başka durumlar da olabilir.
* Address sütunu: Düğümün IP adresini gösterir.
* Load sütunu: Düğümdeki toplam veri yükünü gösterir.
* Owns (effective) sütunu: Düğümün küme verisinin ne kadarını tuttuğunu gösterir. Tüm düğümlerin yaklaşık olarak eşit bir yüzdeye sahip olması beklenir.
* Host ID: Her düğüm için benzersiz bir tanımlayıcıdır.
* Rack ve Datacenter: cassandra-rackdc.properties dosyasında belirttiğiniz değerlerdir.
Eğer herhangi bir düğüm UN durumunda değilse, aşağıdaki sorun giderme adımlarını izleyin:
* Cassandra günlüklerini kontrol edin: /var/log/cassandra/system.log dosyasını inceleyin. Hata mesajları sorunun kökenini gösterebilir.
* Ağ bağlantısını kontrol edin: ping ve telnet komutlarıyla düğümler arası bağlantıyı ve port erişimini test edin.
* Güvenlik duvarını kontrol edin: Gerekli portların açık olduğundan emin olun.
* cassandra.yaml dosyasını tekrar kontrol edin: Özellikle listen_address, rpc_address, seeds ve cluster_name değerlerinin doğru olduğundan emin olun.
Veri Modeli ve Temel İşlemler
Küme başarıyla kurulduktan sonra, Cassandra’ya bağlanıp veri modellemesi yapabilir ve temel CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirebiliriz. Cassandra’ya bağlanmak için cqlsh (Cassandra Query Language Shell) aracını kullanırız.
Herhangi bir düğümde cqlsh komutunu çalıştırın:
cqlsh 192.168.1.101 # Herhangi bir düğümün IP adresini kullanabilirsiniz
cqlsh istemine bağlandıktan sonra, CQL (Cassandra Query Language) komutlarını çalıştırabilirsiniz.
Keyspace Oluşturma
Cassandra’da veriler keyspace adı verilen mantıksal birimlerde gruplandırılır. Bir keyspace oluştururken, verilerin küme genelinde nasıl kopyalanacağını belirleyen bir çoğaltma stratejisi (replication strategy) ve çoğaltma faktörü (replication factor) belirtmeniz gerekir.
* SimpleStrategy: Tek bir veri merkezi için kullanılır. Tüm replikalar aynı veri merkezinde bulunur.
* NetworkTopologyStrategy: Birden fazla veri merkezi olan üretim ortamları için önerilir. Her veri merkezi için ayrı ayrı çoğaltma faktörü belirlemenizi sağlar.
Örnek olarak, SimpleStrategy ile bir keyspace oluşturalım:
CREATE KEYSPACE myapp_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
Burada replication_factor: 3, verinin 3 farklı düğümde kopyalanacağı anlamına gelir. Bu, 2 düğümün arızalanması durumunda bile verinin hala erişilebilir olmasını sağlar.
Eğer NetworkTopologyStrategy kullanıyorsanız:
CREATE KEYSPACE myapp_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': 3};
Burada datacenter1 için 3 replika belirttik.
Keyspace’i oluşturduktan sonra, onu kullanmaya başlayabilirsiniz:
USE myapp_keyspace;
Tablo Oluşturma
Keyspace içinde tablolar oluşturabilirsiniz. Cassandra’da tablo oluştururken birincil anahtar (primary key) belirlemek zorunludur. Birincil anahtar, bölüm anahtarı (partition key) ve kümeleme anahtarından (clustering key) oluşur.
* Bölüm Anahtarı: Verinin hangi düğümde depolanacağını belirler. İyi seçilmiş bir bölüm anahtarı, veri dağıtımını optimize eder.
* Kümeleme Anahtarı: Bir bölüm içindeki verilerin nasıl sıralanacağını belirler.
Örnek bir kullanıcı tablosu oluşturalım:
CREATE TABLE users (
user_id UUID PRIMARY KEY,
username text,
email text,
created_at timestamp
);
Burada user_id bölüm anahtarıdır.
Daha karmaşık bir örnek, user_id ve post_id‘nin birincil anahtar olduğu bir gönderi tablosu:
CREATE TABLE posts (
user_id UUID,
post_id TIMEUUID,
post_content text,
created_at timestamp,
PRIMARY KEY ((user_id), post_id)
);
Burada user_id bölüm anahtarıdır ve post_id kümeleme anahtarıdır. Bu, belirli bir user_id‘ye ait tüm gönderilerin aynı bölümde depolanacağı ve post_id‘ye göre sıralanacağı anlamına gelir.
Veri Ekleme ve Sorgulama
Veri eklemek için INSERT komutunu kullanın:
INSERT INTO users (user_id, username, email, created_at) VALUES (uuid(), 'alice', 'alice@example.com', toTimestamp(now()));
INSERT INTO users (user_id, username, email, created_at) VALUES (uuid(), 'bob', 'bob@example.com', toTimestamp(now()));
Veri sorgulamak için SELECT komutunu kullanın:
SELECT * FROM users;
SELECT * FROM users WHERE user_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;
Önemli: Cassandra’da sorgular genellikle birincil anahtarın bir kısmını veya tamamını içermelidir. Rastgele veya birincil anahtar olmayan sütunlara göre sorgulama yapmak, küme genelinde performans sorunlarına yol açabilir (full table scan).
Bakım ve Yönetim
Cassandra kümesinin sağlıklı ve performanslı çalışmasını sağlamak için düzenli bakım ve yönetim faaliyetleri gereklidir.
nodetool Komutları
nodetool aracı, Cassandra düğümlerini yönetmek için kullanılan güçlü bir komut satırı aracıdır.
* nodetool status: Kümenin genel durumunu gösterir (daha önce bahsedildi).
* nodetool repair: Düğümler arasındaki veri tutarlılığını sağlar. Cassandra, hataya dayanıklı bir sistem olsa da, tutarsızlıklar zamanla ortaya çıkabilir. repair işlemi, bu tutarsızlıkları düzeltir. Düzenli olarak (örneğin haftalık) çalıştırılması önerilir.
nodetool repair myapp_keyspace
* nodetool cleanup: Bir düğümün artık tutmaması gereken verileri (örneğin, bir düğüm kümeden ayrıldıktan veya çoğaltma faktörü değiştirildikten sonra) temizler.
nodetool cleanup
* nodetool drain: Bir düğümü kapatmadan önce tüm bellek içi verileri diske yazar. Bu, düğümün güvenli bir şekilde kapatılmasını sağlar.
nodetool drain
* nodetool flush: Bellekteki commitlog’u diske yazar (memtable’ları SSTable’lara dönüştürür).
* nodetool decommission: Bir düğümü kümeden güvenli bir şekilde kaldırır. Bu işlem, düğümdeki tüm verileri diğer düğümlere taşır.
* nodetool rebuild: Yeni eklenen bir düğümün kümedeki verileri diğer düğümlerden kopyalamasını sağlar.
* nodetool gcstats: Java çöp toplama (garbage collection) istatistiklerini gösterir. Performans sorunlarını teşhis etmek için faydalıdır.
* nodetool ring: Kümenin halka topolojisini gösterir.
Güncelleme ve Yama Uygulama
Cassandra güncellemeleri genellikle “rolling restart” yöntemiyle yapılır. Bu, kümenin kesintisiz çalışmaya devam ederken düğümlerin tek tek güncellenmesi anlamına gelir.
1. Bir düğümü durdurun.
2. Yazılımı güncelleyin (örneğin sudo apt update && sudo apt upgrade cassandra -y).
3. Düğümü başlatın.
4. nodetool status ile düğümün UN durumuna geldiğinden emin olun.
5. Bir sonraki düğüme geçin.
Yedekleme ve Geri Yükleme
Cassandra, anlık görüntü (snapshot) mekanizması ile yedekleme yapılmasına olanak tanır.
nodetool snapshot -t my_backup_tag myapp_keyspace
Bu komut, myapp_keyspace için bir anlık görüntü oluşturur. Anlık görüntüler, /var/lib/cassandra/data/keyspace_name/table_name/snapshots/my_backup_tag dizininde saklanır. Geri yükleme, bu dosyaları uygun dizinlere kopyalayarak ve düğümü yeniden başlatarak yapılır.
Performans İpuçları ve En İyi Uygulamalar
Cassandra kümesinden en iyi performansı elde etmek için bazı en iyi uygulamaları takip etmek önemlidir:
1. Donanım Seçimi:
* SSD Diskler: Cassandra, rastgele okuma/yazma işlemleri için yoğun disk G/Ç’ye ihtiyaç duyar. SSD’ler, geleneksel HDD’lere göre önemli ölçüde daha iyi performans sunar.
* Yeterli RAM: Memtable’lar ve önbellekler için bol miktarda RAM, disk G/Ç’sini azaltır.
* CPU: Çoğu iş yükü için 4-8 çekirdek yeterli olabilir, ancak yoğun işlem gerektiren iş yüklerinde daha fazlası gerekebilir.
2. Java GC Ayarları: Cassandra’nın jvm.options dosyasında (genellikle /etc/cassandra/jvm.options veya /etc/cassandra/conf/jvm.options) Java Çöp Toplama (Garbage Collection) ayarlarını optimize etmek, özellikle yüksek yük altında performansı artırabilir. G1GC (Garbage-First Garbage Collector) genellikle önerilir.
3. Veri Modellemesi: Cassandra’daki en kritik performans faktörlerinden biridir.
* Sorgu Odaklı Veri Modellemesi: Uygulamanızın yapacağı sorguları önceden belirleyin ve tablolarınızı bu sorguları verimli bir şekilde yanıtlayacak şekilde tasarlayın.
* Bölüm Anahtarı (Partition Key): Verilerin küme genelinde eşit şekilde dağılmasını sağlayacak ve sıcak bölümleri (hot partitions) önleyecek bir bölüm anahtarı seçin.
* Kümeleme Anahtarı (Clustering Key): Bir bölüm içindeki verilerin sorgu gereksinimlerinize göre sıralanmasını sağlayın.
4. Çoğaltma Faktörü (Replication Factor) ve Tutarlılık Seviyesi (Consistency Level):
* replication_factor (RF), veri kaybına karşı dayanıklılığı ve okuma/yazma performansını etkiler. Genellikle üretim ortamlarında 3 veya daha yüksek bir RF önerilir.
* consistency_level (CL), bir okuma veya yazma işleminin başarılı sayılması için kaç replikanın onay vermesi gerektiğini belirler. QUORUM (RF/2 + 1) en yaygın ve dengeli seçimdir. CL ve RF’nin doğru kombinasyonu, veri tutarlılığı ve kullanılabilirlik arasında bir denge kurar.
5. Snitch Seçimi: GossipingPropertyFileSnitch gibi topolojiye duyarlı bir snitch kullanmak, Cassandra’nın verileri coğrafi olarak akıllıca dağıtmasını ve ağ trafiğini optimize etmesini sağlar.
6. İstemci Sürücüleri: Cassandra ile etkileşim kurmak için optimize edilmiş istemci sürücüleri kullanın ve bağlantı havuzu (connection pooling), yeniden deneme politikaları (retry policies) gibi özellikleri doğru yapılandırın.
7. İzleme (Monitoring): Kümenizin sağlığını ve performansını izlemek için Prometheus, Grafana, JMX gibi araçları kullanın. CPU, RAM, disk G/Ç, ağ trafiği, Cassandra metrikleri (okuma/yazma gecikmeleri, çöp toplama süreleri) gibi temel metrikleri takip edin.
Sorun Giderme
Cassandra kurulumu veya küme operasyonları sırasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözüm ipuçları:
* Düğüm Küme’ye Katılamıyor:
* Günlükleri kontrol edin: /var/log/cassandra/system.log dosyasını inceleyin. WARN veya ERROR mesajları arayın.
* cassandra.yaml: cluster_name, listen_address, rpc_address, seeds parametrelerinin doğru ve tüm düğümler arasında tutarlı olduğundan emin olun.
* Ağ bağlantısı: Düğümlerin birbirlerinin listen_address ve rpc_address portlarına erişebildiğinden emin olun (telnet veya netcat ile test edin).
* Güvenlik duvarı: Gerekli portların açık olduğundan emin olun.
* Java sürümü: Doğru Java sürümünün (OpenJDK 11) kurulu olduğundan ve JAVA_HOME‘un doğru ayarlandığından emin olun.
* nodetool status boş veya sadece tek düğümü gösteriyor:
* Yukarıdaki “Düğüm Küme’ye Katılamıyor” sorun giderme adımlarını izleyin.
* Tohum düğümlerinin ilk başladığından ve stabil olduğundan emin olun.
* Diğer düğümlerin tohum düğümlerine doğru şekilde bağlanabildiğinden emin olun.
* Performans Düşüşü:
* Sistem kaynakları: CPU, RAM ve disk G/Ç kullanımını izleyin. Kaynak darboğazları olabilir.
* Cassandra günlükleri: Uzun çöp toplama duraklamaları (GC pauses) veya okuma/yazma gecikmeleri olup olmadığını kontrol edin.
* Veri modeli: Sorgularınızın bölüm anahtarını doğru kullanıp kullanmadığını kontrol edin. Kötü veri modeli, küme genelinde dengesiz yük dağılımına yol açabilir.
* nodetool cfstats veya nodetool tpstats: Tablo istatistiklerini ve iş parçacığı havuzu istatistiklerini inceleyerek darboğazları belirleyin.
* Veri Tutarsızlıkları:
* nodetool repair işlemini düzenli olarak çalıştırdığınızdan emin olun.
* replication_factor ve consistency_level ayarlarınızın uygulamanızın gereksinimlerini karşıladığını kontrol edin.
Sonuç
Bu makalede, Ubuntu 22.04 üzerinde Apache Cassandra’yı kurma ve çok düğümlü bir küme olarak yapılandırma sürecini ayrıntılı olarak inceledik. Cassandra’nın dağıtık mimarisi, yüksek ölçeklenebilirlik ve hataya dayanıklılık özellikleri, onu büyük veri ve yüksek kullanılabilirlik gerektiren uygulamalar için ideal bir seçim haline getirmektedir.
Başarılı bir Cassandra kümesi kurulumu, doğru ön gereksinimlerin karşılanması, dikkatli yapılandırma ve düzenli bakım ile mümkündür. cassandra.yaml dosyasındaki temel parametreleri anlamak, nodetool gibi yönetim araçlarını etkin bir şekilde kullanmak ve en iyi uygulama önerilerine uymak, kümenizin uzun vadeli sağlığı ve performansı için kritik öneme sahiptir.
Artık temel bir Cassandra kümesine sahip olduğunuza göre, veri modellemesi konusunda daha derinlemesine bilgi edinmek, farklı çoğaltma stratejileri ve tutarlılık seviyelerini denemek ve kümenizin performansını optimize etmek için daha fazla keşif yapmaya hazırsınız demektir.