Apache Kafka Kurulumu: Tek Düğüm ve Docker ile Adım Adım Kurulum

Üretim ortamında Kafka kurmadan önce kaç kez “şu an test için bir şey lazım” diyip saatlerce uğraştım, hatırlamıyorum bile. Sonunda bu süreçleri bir yere yazmak istedim çünkü aynı soruları çevremdeki sysadmin arkadaşlarından da sürekli duyuyorum. Bu yazıda hem doğrudan sunucuya Kafka kurulumunu hem de Docker ile hızlı bir ortam hazırlamayı ele alacağım. Teoriyi minimumda tutup işe yarar bir kurulum rehberi sunmaya çalışacağım.

Apache Kafka Nedir, Neden Kullanıyoruz?

Kısaca geçeyim burayı çünkü “Kafka nedir” sorusuna Google’da binlerce cevap var. Asıl meseleye odaklanmak istiyorum.

Kafka, yüksek verimli, dağıtık bir mesaj akış platformudur. Mikro servisler arasında mesaj iletimi, log aggregation, event sourcing ve stream processing gibi senaryolarda kullanırsınız. Bir e-ticaret platformunda sipariş servisi, stok servisi ve bildirim servisi arasındaki iletişimi Kafka üzerinden kurduğunuzda servisler birbirinden bağımsızlaşır. Biri çöktüğünde diğerleri etkilenmez, mesajlar kaybolmaz.

Tek düğüm kurulum genellikle geliştirme, test ve küçük ölçekli iç uygulamalar için yeterlidir. Üretimde mutlaka cluster kurmanız gerekir ama başlangıç noktası olarak tek düğüm mükemmeldir.

Ön Gereksinimler

Kuruluma başlamadan önce sisteminizin hazır olduğundan emin olun.

Java gereksinimi: Kafka, JVM üzerinde çalışır. Java 11 veya daha üstü bir sürüm gereklidir. Java 17 ile çalışmak daha stabil bir deneyim sunuyor.

# Java sürümünü kontrol edin
java -version

# Ubuntu/Debian'da Java kurulumu
sudo apt update
sudo apt install -y openjdk-17-jdk

# RHEL/CentOS/Rocky Linux'ta
sudo dnf install -y java-17-openjdk-devel

# JAVA_HOME ayarı
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

Sistem kaynakları: Tek düğüm için minimum 2 CPU, 4 GB RAM öneririm. Kafka bellekten çok disk I/O’ya bağımlıdır, bu yüzden SSD kullanıyorsanız performans farkı ciddi oluyor.

Hostname ayarı: Kafka, hostname’e duyarlıdır. Kurulumdan önce hostname’in doğru ayarlandığından emin olun.

# Hostname kontrolü
hostname -f

# Gerekirse /etc/hosts dosyasına ekleyin
echo "192.168.1.100 kafka-node1 kafka-node1.example.com" >> /etc/hosts

Kafka İndirme ve Kurulum

Apache Kafka’yı doğrudan Apache mirror’larından indireceğiz. Sürüm seçiminde dikkatli olun, Kafka 2.x ile 3.x arasında önemli farklar var. Bu yazıda Kafka 3.6.x kullanacağım.

# Kafka indirme
cd /opt
sudo wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz

# Arşivi açma
sudo tar -xzf kafka_2.13-3.6.1.tgz
sudo ln -s kafka_2.13-3.6.1 kafka
sudo chown -R kafka:kafka /opt/kafka*

# Dedicated kullanıcı oluşturma (bunu atlamayın)
sudo useradd -r -s /sbin/nologin -d /opt/kafka kafka
sudo chown -R kafka:kafka /opt/kafka*

Kafka dizin yapısı şu şekilde görünür:

  • /opt/kafka/bin: Kafka komut satırı araçları
  • /opt/kafka/config: Konfigürasyon dosyaları
  • /opt/kafka/libs: Java kütüphaneleri
  • /opt/kafka/logs: Kafka uygulama logları (mesaj logları buraya değil)

ZooKeeper ve KRaft Modu

Kafka 2.8’den itibaren KRaft modu (ZooKeeper’sız mod) deneysel olarak, 3.3’ten itibaren ise production-ready olarak kullanılabilir hale geldi. Kafka 4.0 ile ZooKeeper desteği tamamen kaldırılıyor. Bu yüzden bu yazıda ağırlıklı olarak KRaft modunu anlatacağım ama ZooKeeper ile kuruluma da kısaca değineceğim.

KRaft Modu ile Kurulum (Önerilen)

KRaft modunda ZooKeeper’a ihtiyaç yok. Kafka kendi içinde Raft consensus protokolünü kullanıyor.

# KRaft için cluster ID oluşturma
cd /opt/kafka
sudo -u kafka bin/kafka-storage.sh random-uuid
# Çıktı örneği: MkU3OEVBNTcwNTJENDM2Qg

# Bu UUID'yi bir yere not edin, bir sonraki adımda kullanacaksınız

Şimdi config/kraft/server.properties dosyasını düzenleyelim:

sudo -u kafka nano /opt/kafka/config/kraft/server.properties

Temel konfigürasyon parametreleri:

  • process.roles=broker,controller: Hem broker hem controller rolü üstleniyor
  • node.id=1: Her node için benzersiz ID
  • controller.quorum.voters=1@localhost:9093: Controller voter listesi
  • listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093: Dinlenecek adresler
  • advertised.listeners=PLAINTEXT://SUNUCU_IP:9092: Dışarıya duyurulan adres
  • log.dirs=/opt/kafka/data: Mesaj log dizini
  • num.partitions=3: Default partition sayısı
  • default.replication.factor=1: Tek düğüm için 1 yeterli
  • log.retention.hours=168: Log saklama süresi (7 gün)
  • log.segment.bytes=1073741824: Segment boyutu (1 GB)
# Data dizini oluşturma
sudo mkdir -p /opt/kafka/data
sudo chown kafka:kafka /opt/kafka/data

# Storage formatlaması (UUID'yi kendinizinkiyle değiştirin)
sudo -u kafka bin/kafka-storage.sh format 
  -t MkU3OEVBNTcwNTJENDM2Qg 
  -c config/kraft/server.properties

Systemd Servis Dosyası Oluşturma

Kafka’yı sistem servisi olarak tanımlamak, yönetimi çok kolaylaştırır. Sunucu yeniden başladığında otomatik ayağa kalkması için bu adımı atlamamanızı öneririm.

sudo nano /etc/systemd/system/kafka.service
[Unit]
Description=Apache Kafka Server (KRaft Mode)
Documentation=http://kafka.apache.org/documentation.html
After=network.target

[Service]
Type=simple
User=kafka
Group=kafka
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="KAFKA_HEAP_OPTS=-Xmx1G -Xms1G"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/kraft/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
# Servisi aktif etme
sudo systemctl daemon-reload
sudo systemctl enable kafka
sudo systemctl start kafka
sudo systemctl status kafka

Kurulumu Test Etme

Kafka ayaktaysa hemen bir test yapalım. Bu adım hem kurulumun doğru çalıştığını hem de temel Kafka operasyonlarını anlamanızı sağlar.

# Test topic oluşturma
sudo -u kafka /opt/kafka/bin/kafka-topics.sh 
  --create 
  --topic test-topic 
  --bootstrap-server localhost:9092 
  --partitions 3 
  --replication-factor 1

# Topic listesini görme
sudo -u kafka /opt/kafka/bin/kafka-topics.sh 
  --list 
  --bootstrap-server localhost:9092

# Topic detayları
sudo -u kafka /opt/kafka/bin/kafka-topics.sh 
  --describe 
  --topic test-topic 
  --bootstrap-server localhost:9092

# Mesaj gönderme (başka terminal açın)
sudo -u kafka /opt/kafka/bin/kafka-console-producer.sh 
  --topic test-topic 
  --bootstrap-server localhost:9092

# Mesaj okuma (başka terminal)
sudo -u kafka /opt/kafka/bin/kafka-console-consumer.sh 
  --topic test-topic 
  --from-beginning 
  --bootstrap-server localhost:9092

Producer terminaline birkaç mesaj yazıp consumer terminalinde göründüğünü görürseniz kurulum başarılıdır.

Docker ile Kafka Kurulumu

Docker ile Kafka kurmak, özellikle geliştirme ortamları ve CI/CD pipeline’ları için çok daha hızlı ve pratik. Burada iki farklı yaklaşım göstereceğim.

Docker Compose ile Tek Düğüm KRaft

docker-compose.yml dosyası oluşturun:

version: '3.8'

services:
  kafka:
    image: confluentinc/cp-kafka:7.5.0
    container_name: kafka-standalone
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: 'broker,controller'
      KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:9093'
      KAFKA_LISTENERS: 'PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093'
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9092'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT'
      KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
      KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_LOG_DIRS: '/var/lib/kafka/data'
      CLUSTER_ID: 'MkU3OEVBNTcwNTJENDM2Qg'
    volumes:
      - kafka-data:/var/lib/kafka/data
    networks:
      - kafka-net

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    depends_on:
      - kafka
    ports:
      - "8080:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    networks:
      - kafka-net

volumes:
  kafka-data:

networks:
  kafka-net:
    driver: bridge
# Başlatma
docker compose up -d

# Log takibi
docker compose logs -f kafka

# Durum kontrolü
docker compose ps

Kafka UI için http://localhost:8080 adresine gidin. Topic’leri görsel olarak yönetebileceğiniz güzel bir arayüz sizi karşılar. Özellikle mesaj içeriklerini debug ederken çok işe yarıyor.

Docker İçinde Kafka Komutları Çalıştırma

# Docker container içinde topic işlemleri
docker exec -it kafka-standalone 
  kafka-topics --create 
  --topic uygulama-loglar 
  --bootstrap-server localhost:9092 
  --partitions 3 
  --replication-factor 1

# Container içinden mesaj gönderme
docker exec -it kafka-standalone 
  kafka-console-producer 
  --topic uygulama-loglar 
  --bootstrap-server localhost:9092

Gerçek Dünya Senaryosu: Uygulama Loglarını Kafka’ya Yönlendirme

Bu kurulumun pratikte nasıl kullanıldığını görmek için basit bir örnek verelim. Diyelim ki bir web uygulamasının access loglarını Kafka’ya yazıp oradan farklı sistemlere dağıtmak istiyorsunuz.

Önce log topic’ini oluşturalım:

sudo -u kafka /opt/kafka/bin/kafka-topics.sh 
  --create 
  --topic web-access-logs 
  --bootstrap-server localhost:9092 
  --partitions 6 
  --replication-factor 1 
  --config retention.ms=604800000 
  --config cleanup.policy=delete 
  --config max.message.bytes=1048576

Bu topic konfigürasyonunda:

  • partitions=6: Nginx access log dosyası genellikle yüksek hacimlidir, 6 partition yeterli parallelism sağlar
  • retention.ms=604800000: 7 günlük log saklama (ms cinsinden)
  • cleanup.policy=delete: Eski loglar silinsin, compaction istemiyoruz
  • max.message.bytes=1048576: Tek mesaj maksimum 1 MB

Filebeat veya Fluentd gibi bir log shipper ile Nginx loglarını bu topic’e yazabilirsiniz. Tüketici tarafında ise Elasticsearch’e, S3’e veya başka bir sisteme iletebilirsiniz.

Güvenlik Duvarı Ayarları

Kafka portlarını güvenlik duvarında açmayı unutmayın. Dış erişim gerekiyorsa dikkatli olun, Kafka varsayılan olarak authentication gerektirmez.

# UFW ile (Ubuntu)
sudo ufw allow 9092/tcp comment "Kafka Broker"
sudo ufw allow 9093/tcp comment "Kafka Controller"

# Firewalld ile (RHEL/CentOS)
sudo firewall-cmd --permanent --add-port=9092/tcp
sudo firewall-cmd --permanent --add-port=9093/tcp
sudo firewall-cmd --reload

# Belirli IP'den erişime izin verme (daha güvenli)
sudo ufw allow from 10.0.1.0/24 to any port 9092

Yaygın Sorunlar ve Çözümleri

Kafka kurulumlarında en sık karşılaşılan sorunları listeleyelim.

“Connection refused” hatası: Kafka’nın ayağa kalkması birkaç saniye sürebilir. systemctl status kafka ile servis durumunu, journalctl -u kafka -f ile logları inceleyin. Genellikle Java heap ayarı veya disk izinleri sorun çıkarır.

“Leader not available” hatası: Topic yeni oluşturulduğunda kısa süre bu hatayı görebilirsiniz. Birkaç saniye bekleyip tekrar deneyin. Kalıcıysa replication factor ile partition sayısını kontrol edin.

Yavaş consumer performansı: fetch.min.bytes ve fetch.max.wait.ms parametrelerini ayarlayın. Ayrıca consumer group’unuzda partition sayısından fazla consumer varsa bazı consumer’lar boşta bekler.

Disk doluluk problemi:

# Kafka log dizininin boyutunu kontrol etme
du -sh /opt/kafka/data/*

# Topic bazında retention ayarı
sudo -u kafka /opt/kafka/bin/kafka-configs.sh 
  --bootstrap-server localhost:9092 
  --entity-type topics 
  --entity-name web-access-logs 
  --alter 
  --add-config retention.ms=259200000

Monitoring: Temel Metrikleri Takip Etme

Kafka’yı kurduktan sonra izlemeye almadan bırakmayın. JMX metrikleri Prometheus ile çekebilirsiniz. Basit başlangıç için kafka-consumer-groups betiği işe yarar.

# Consumer group lag takibi
sudo -u kafka /opt/kafka/bin/kafka-consumer-groups.sh 
  --bootstrap-server localhost:9092 
  --describe 
  --group uygulama-consumer-group

# Tüm consumer groupları listeleme
sudo -u kafka /opt/kafka/bin/kafka-consumer-groups.sh 
  --bootstrap-server localhost:9092 
  --list

# Broker metadata kontrolü
sudo -u kafka /opt/kafka/bin/kafka-metadata-quorum.sh 
  --bootstrap-server localhost:9092 
  describe --status

Consumer lag, Kafka monitoring’inin kalp atışıdır. Bir consumer group partition’lardan ne kadar geride kaldığını gösterir. Lag sürekli artıyorsa consumer’larınız mesajlara yetişemiyor demektir, ya consumer sayısını artırın ya da partition sayısını.

Sonuç

Kafka kurulumu ilk bakışta karmaşık görünebilir ama adım adım gidildiğinde oldukça mantıklı bir yapısı var. KRaft moduna geçiş, ZooKeeper bağımlılığını ortadan kaldırarak operasyonel yükü ciddi ölçüde azalttı. Artık ayrı bir ZooKeeper cluster yönetmek zorunda değilsiniz.

Docker kurulumu geliştirme ortamları için altın değerinde. Kafka UI ile birlikte kullandığınızda topic yönetimi, consumer lag takibi ve mesaj debug’ı çok kolaylaşıyor. Ancak Docker kurulumunu production’a taşırken volume yönetimine ve ağ konfigürasyonuna ekstra dikkat edin.

Tek düğüm kurulumu bir başlangıç noktasıdır. Yüksek erişilebilirlik gerektiren senaryolarda minimum 3 broker’dan oluşan bir cluster kurmanız gerekir. Ama sisteminizi önce tek düğümde anlayın, sonra ölçeklendirin. Bu yaklaşım hem öğrenme sürecinizi hızlandırır hem de production’da sürprizlerle karşılaşma ihtimalinizi azaltır.

Kafka ile ilgili bir sonraki yazıda cluster kurulumu ve replication konfigürasyonunu ele alacağım. Sorularınız olursa yorumlarda buluşuruz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir