Apache Kafka, dağıtılmış bir mesajlaşma platformu olarak büyük veri akışlarını işleyebilmek için tasarlanmış güçlü bir araçtır. Kafka, başlangıçta ZooKeeper adı verilen bir üçüncü taraf araçla çalışarak, dağıtılmış sistemlerin koordinasyonunu ve yönetimini sağlıyordu. Ancak son dönemde Apache Kafka, KRaft (Kafka Raft) adı verilen yeni bir mimariyi benimseyerek ZooKeeper bağımlılığını ortadan kaldırmıştır. KRaft, Kafka’nın daha entegre, verimli ve ölçeklenebilir bir yapı ile çalışmasını sağlamakta olup, özellikle büyük verinin yönetimi noktasında önemli avantajlar sunmaktadır.

1. ZooKeeper: Kafka’nın Geleneksel Koordinasyon Aracı

ZooKeeper, Apache tarafından geliştirilen ve dağıtılmış sistemlerde koordinasyonu sağlamak amacıyla kullanılan bir araçtır. Kafka’nın daha eski sürümlerinde, ZooKeeper, verilerin bütünlüğünü sağlamak, broker’lar arasında iletişimi düzenlemek ve sistemdeki liderlik seçimlerini yönetmek gibi kritik görevleri üstlenmiştir. Bu görevler, Kafka cluster’larının sağlıklı çalışmasını garanti etmek için büyük önem taşır.

ZooKeeper’ın Kafka’daki Rolü
ZooKeeper, Kafka’nın eski mimarisinde, aşağıdaki başlıca işlevleri yerine getirirdi:

Meta Veri Yönetimi: Kafka’daki topic, partition ve replication bilgilerini saklar.
Liderlik Seçimi: Kafka’nın partition’ları için lider broker’ları belirler.
Cluster Yönetimi: Cluster’daki broker’ların aktif olup olmadığını kontrol eder ve başarısız broker’lar hakkında bilgi verir.
ZooKeeper, Zab (ZooKeeper Atomic Broadcast) protokolünü kullanarak tüm düğümlerdeki verilerin tutarlılığını sağlar. Bu protokol, tüm düğümler arasında veri senkronizasyonu ve güvenilirlik için oldukça önemlidir. ZooKeeper’da ZNode adı verilen yapıların içinde veriler depolanır ve liderlik seçimleri yapılırken, herhangi bir broker’ın başarısız olması durumunda yeni bir lider seçilmesi sağlanır.

2. KRaft: Kafka’nın Yeni Nesil Mimarisi

Son yıllarda, Kafka topluluğu, ZooKeeper’a olan bağımlılığı kaldırmak ve Kafka’nın daha hızlı, daha verimli ve daha kolay yönetilebilen bir yapıya kavuşmasını sağlamak amacıyla KRaft (Kafka Raft) mimarisini geliştirmiştir. KRaft, Kafka’nın kendi içinde, veri tutarlılığını ve liderlik seçimlerini yöneten bir Raft protokolüne dayanmaktadır. Bu, Kafka’nın doğrudan ve entegre bir şekilde çalışmasını sağlar. KRaft mimarisi, veri tutarlılığı ve liderlik seçimlerini dış bir sistemden bağımsız olarak kendi iç sisteminde gerçekleştirir.

KRaft’ın Avantajları
Daha Basit Bir Mimari: ZooKeeper’a olan bağımlılığı ortadan kaldırarak, Kafka cluster’larının yönetimi daha basit hale gelir.
Daha Hızlı Liderlik Seçimi: Raft protokolü, düşük gecikme süreleriyle lider seçim süreçlerini hızlı bir şekilde gerçekleştirir.
Yüksek Performans: Kafka broker’ları, tüm meta veri işlemlerini kendi bünyesinde yönettiği için daha az gecikme yaşanır ve sistemin genel verimliliği artar.
Yüksek Ölçeklenebilirlik: Raft protokolü sayesinde Kafka cluster’ları daha ölçeklenebilir hale gelir. Yeni broker’ların eklenmesi, daha az kesinti ve daha hızlı bir şekilde yapılabilir.

KRaft’ın Temel Bileşenleri
Controller Quorum: KRaft modunda, controller quorum adı verilen bir grup broker, meta verileri yönetir ve liderlik seçimlerini gerçekleştirir.
Raft Konsensüs Protokolü: Raft, Kafka cluster’ı içerisindeki veri tutarlılığını sağlayan ve liderlik seçimlerini yöneten bir konsensüs algoritmasıdır.
Log Yönetimi: Tüm meta veri işlemleri, Kafka’nın iç sisteminde özel bir log dosyasına kaydedilir, bu da veri tutarlılığına katkı sağlar.

3. Kafka KRaft Cluster Kurulumu: Adım Adım

KRaft modunda bir Kafka cluster kurulumu, ZooKeeper tabanlı kurulumdan farklıdır. KRaft kullanarak bir cluster kurarken dikkat edilmesi gereken birkaç temel adım vardır. Bu adımlar, Kafka’yı ZooKeeper’sız çalıştırmanın nasıl mümkün olduğunu göstermektedir.

a) Konfigürasyon Dosyası (server.properties)

KRaft modunda çalışan bir broker için temel yapılandırma şöyledir:

node.id=1  
process.roles=broker,controller
log.dirs=/var/kafka/logs
cluster.id=qArX3aLaRKaQ2jE
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
controller.quorum.voters=1@192.168.1.1:9093,2@192.168.1.2:9093,3@192.168.1.3:9093

b) Cluster ID ve Meta Veri Formatlama

Cluster ID oluşturma:

bin/kafka-storage.sh random-uuid

Meta veriyi formatlama:

bin/kafka-storage.sh format --config /path/to/server.properties --cluster-id <CLUSTER_ID>

c) Broker’ların Başlatılması

Her broker, kendi yapılandırma dosyası ile başlatılır:

bin/kafka-server-start.sh /path/to/server.properties

Daha detaylı bir konfigürasyon dosyası aşağıdaki gibidir

##############
# Genel Ayarlar
##############
# Kafka Broker ID (Her broker için farklı olmalı)
node.id=1

# Broker'ın işlevi (hem broker hem de controller olarak çalışacak)
process.roles=broker,controller

# Meta veri ve logların depolanacağı dizin
log.dirs=/var/kafka/logs



##############
# Listeners
##############
# Broker'ın istemci bağlantılarını dinleyeceği adres ve port
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

# Diğer broker'lara ve controller node'lara bildirilecek adres
advertised.listeners=PLAINTEXT://192.168.1.1:9092

# Controller quorum için kullanılacak dinleyici
controller.listener.names=CONTROLLER

# Broker'lar arası iletişim için kullanılacak dinleyici
inter.broker.listener.name=PLAINTEXT

##############
# Raft Protokolü Ayarları
##############
# Controller quorum voters: Raft protokolünde oy verebilecek controller'lar
controller.quorum.voters=1@192.168.1.1:9093,2@192.168.1.2:9093,3@192.168.1.3:9093

##############
# Log ve Segment Ayarları
##############
# Log segmentlerinin maksimum boyutu (varsayılan: 1GB)
log.segment.bytes=1073741824

# Log segmentlerinin saklanma süresi (örnek: 7 gün)
log.retention.hours=168

# Logların toplam boyut sınırı (örnek: 100GB)
log.retention.bytes=107374182400

# Eski log segmentlerinin ne sıklıkla temizleneceği (varsayılan: 5 dakika)
log.retention.check.interval.ms=300000

# Log dosyalarının flush edilmesi için maksimum süre
log.flush.interval.ms=1000

##############
# Replication Ayarları
##############
# Replication faktörü için minimum ISR (in-sync replicas) sayısı
min.insync.replicas=2

# Replikasyon için zaman aşımı
replica.lag.time.max.ms=10000

# ISR (in-sync replicas) için kontrol sıklığı
replica.lag.max.messages=4000

##############
# Zaman Aşımı ve İstemci Ayarları
##############
# Broker'ın session timeout süresi
broker.session.timeout.ms=30000

# İstemci bağlantıları için istek zaman aşımı
socket.request.max.bytes=104857600

# Her bağlantı için maksimum bekleme süresi
connections.max.idle.ms=600000

##############
# Üretim Ortami Ayarları
##############
# Üretim ortamı için güvenlik ayarları
num.network.threads=3
num.io.threads=8
num.replica.fetchers=4

# Cache boyutu (temel performans ayarı)
num.replica.fetch.threads=3
log.cleaner.threads=2
log.cleaner.io.buffer.size=524288

##############
# Monitoring ve Yönetim
##############
# JMX (Java Management Extensions) ayarları
jmx.port=9999
jmx.hostname=192.168.1.1

# Metrics (Prometheus gibi izleme araçları için)
metric.reporters=kafka.metrics.KafkaMetricsReporter
metrics.sample.window.ms=30000
metrics.num.samples=2

##############
# Güvenlik (Opsiyonel)
##############
# SSL/TLS etkinleştirme için örnek
#ssl.keystore.location=/path/to/keystore.jks
#ssl.keystore.password=your-password
#ssl.truststore.location=/path/to/truststore.jks
#ssl.truststore.password=your-password
#listeners=SSL://:9092

# SASL etkinleştirme (örn: Kerberos, PLAIN)
#sasl.enabled.mechanisms=PLAIN
#security.protocol=SASL_SSL

##############
# Diğer Ayarlar
##############
# Offset saklama ayarları
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2

# Zookeeper kullanmadığınızı belirtmek için boş bırakın
zookeeper.connect=

4. Performans Parametreleri ve Optimizasyon

KRaft veya ZooKeeper ile çalışan bir Kafka cluster’ında, aşağıdaki parametreler kritik öneme sahiptir:

a) Ağ İş Parçacıkları (num.network.threads)

Broker’ın ağ bağlantılarını yöneten iş parçacıklarıdır.

Önerilen Değer: CPU çekirdeği sayısının 1-2 katı.

b) G/Ç İş Parçacıkları (num.io.threads)

Disk okuma/yazma işlemlerini yönetir.

Önerilen Değer: Disk performansına göre artırılabilir (örneğin, SSD kullanılıyorsa daha yüksek değerler).

c) Replikasyon İş Parçacıkları (num.replica.fetchers)

Broker’lar arasında replikasyon için kullanılan iş parçacıklarıdır.

Önerilen Değer: Replikasyon faktörüne ve partition sayısına bağlı olarak artırılabilir.

6. Sonuç ve Öneriler
Apache Kafka, KRaft moduyla ZooKeeper bağımlılığını ortadan kaldırarak daha entegre, hızlı ve ölçeklenebilir bir yapı sunmaktadır.

Küçük Sistemler: KRaft, daha basit yönetim ve kurulum avantajı sağlar.
Büyük Sistemler: Yüksek partition sayısı ve replikasyon faktörüyle çalışan cluster’lar için KRaft, performans artışı sağlar.
Eğer Kafka’yı yeni kuruyorsanız, KRaft modunu tercih ederek daha modern ve yönetimi kolay bir yapı elde edebilirsiniz. Ancak mevcut bir ZooKeeper tabanlı cluster’ınız varsa, KRaft’a geçiş planlı bir şekilde yapılmalıdır.

Paylaş
Bağlantıyı kopyala