Debian 9 Üzerinde Apache Kafka Kurulumu ve Yapılandırma Kılavuzu
Günümüzün veri odaklı dünyasında, büyük miktarda verinin gerçek zamanlı olarak işlenmesi, analiz edilmesi ve sistemler arasında güvenli bir şekilde aktarılması kritik bir öneme sahiptir. Geleneksel veritabanları ve mesajlaşma kuyrukları, saniyede milyonlarca olayın üretildiği modern mikro hizmet mimarilerinde ve büyük veri senaryolarında yetersiz kalabilmektedir. İşte bu noktada Apache Kafka devreye girmektedir. Apache Kafka; yüksek performanslı, ölçeklenebilir, hata toleranslı ve dağıtık bir olay akış (event streaming) platformudur. LinkedIn tarafından geliştirilen ve daha sonra Apache Yazılım Vakfı’na bağışlanan Kafka, günümüzde Netflix, Uber, Spotify gibi dünya devi teknoloji şirketleri tarafından yoğun bir şekilde kullanılmaktadır.
Bu makalede, kararlılığı ve güvenilirliği ile bilinen Debian 9 (Stretch) işletim sistemi üzerinde adım adım Apache Kafka kurulumunu, yapılandırılmasını ve temel kullanım senaryolarını ele alacağız. Kurulumu gerçekleştirirken güvenlik standartlarına uygun olarak özel bir sistem kullanıcısı oluşturacak, Kafka’nın bağımlılığı olan Java Runtime Environment (JRE) kurulumunu yapacak, sistem servislerini (systemd) yapılandıracak ve son olarak sistemin düzgün çalıştığını doğrulamak için temel bir mesajlaşma testi gerçekleştireceğiz.
Gereksinimler ve Ön Hazırlık
Kuruluma başlamadan önce, Debian 9 sunucunuzun minimum sistem gereksinimlerini karşıladığından emin olmanız gerekir. Apache Kafka, bellek (RAM) kullanımı konusunda oldukça hassas bir mimariye sahiptir. Hem Zookeeper hem de Kafka broker bileşenleri JVM (Java Virtual Machine) üzerinde çalıştığı için sisteminizde en az 2 GB RAM bulunması önerilir. Üretim (production) ortamları için ise bu miktar çok daha yüksek olmalıdır. Bu kılavuzdaki adımları uygulamak için aşağıdaki gereksinimlere sahip olmalısınız:
- Temiz bir Debian 9 (Stretch) kurulumu.
- Sudo yetkilerine sahip root dışı (non-root) bir kullanıcı hesabı.
- İnternet bağlantısı (gerekli paketlerin indirilebilmesi için).
- En az 2 GB RAM ve 2 vCPU işlemci gücü.
İlk olarak, sunucumuzdaki mevcut paket listesini güncelleyelim ve kurulu olan paketleri en son sürümlerine yükseltelim. Bu işlem, kurulum sırasında yaşanabilecek olası bağımlılık çakışmalarını önleyecektir. Terminale şu komutları girerek başlayın:
sudo apt update
sudo apt upgrade -y
Sistem güncellendikten sonra, dosyaları indirmek ve arşivden çıkarmak için kullanacağımız temel araçların (wget, curl, tar) sistemde kurulu olduğundan emin olalım:
sudo apt install wget curl tar -y
Adım 1: Java Runtime Environment (JRE) Kurulumu
Apache Kafka ve Apache Zookeeper, Java dilinde yazılmıştır ve çalışabilmek için bir Java Sanal Makinesi’ne (JVM) ihtiyaç duyarlar. Kafka, Java 8 ve üzeri sürümleri desteklemektedir. Debian 9 depolarında varsayılan olarak OpenJDK 8 bulunmaktadır. Bu rehberde, kararlı çalışması ve geniş uyumluluğu nedeniyle OpenJDK 8 kurulumunu gerçekleştireceğiz.
Java’yı yüklemek için aşağıdaki komutu çalıştırın:
sudo apt install default-jre -y
Kurulum tamamlandıktan sonra, Java’nın başarıyla yüklendiğini ve doğru sürümün aktif olduğunu doğrulamak için Java sürüm kontrolü yapalım:
java -version
Bu komutun çıktısında aşağıdakine benzer bir ifade görmelisiniz:
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-1~deb9u1-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
Java ortam değişkenlerinin sistem genelinde tanımlanması, Java tabanlı uygulamaların kararlı çalışması açısından önemlidir. Özellikle JAVA_HOME değişkeninin tanımlanması gerekir. Debian 9 üzerinde Java’nın kurulu olduğu varsayılan dizini bulmak için şu komutu kullanabilirsiniz:
sudo update-alternatives --config java
Bu komut size Java’nın yolunu gösterecektir (örneğin: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java). Buradan yola çıkarak JAVA_HOME yolunu /usr/lib/jvm/java-8-openjdk-amd64 olarak belirleyebiliriz. Bu değişkeni kalıcı hale getirmek için /etc/environment dosyasını düzenleyelim:
sudo nano /etc/environment
Dosyanın sonuna aşağıdaki satırı ekleyin:
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
Dosyayı kaydedip kapatın (Nano editöründe Ctrl+O, Enter ve ardından Ctrl+X ile). Değişikliklerin mevcut oturumda geçerli olması için dosyayı kaynak olarak yükleyin:
source /etc/environment
Değişkenin doğru tanımlandığını doğrulamak için şu komutu çalıştırabilirsiniz:
echo $JAVA_HOME
Adım 2: Kafka İçin Özel Kullanıcı Oluşturma
Güvenlik açısından, Apache Kafka gibi ağ üzerinden hizmet veren servislerin root yetkileriyle çalıştırılması kesinlikle önerilmez. Olası bir güvenlik açığında saldırganların tüm sunucuyu ele geçirmesini engellemek amacıyla, yalnızca Kafka servislerini çalıştıracak sınırlandırılmış yetkilere sahip özel bir sistem kullanıcısı oluşturmalıyız.
Bu amaçla kafka adında yeni bir kullanıcı oluşturalım:
sudo useradd -m -r -d /home/kafka -s /bin/bash kafka
Bu komuttaki parametrelerin açıklamaları şunlardır:
-m: Kullanıcı için bir ev (home) dizini oluşturur.-r: Bu kullanıcının bir sistem kullanıcısı olduğunu belirtir (şifre ile doğrudan giriş yapamaz).-d /home/kafka: Ev dizininin yolunu belirler.-s /bin/bash: Kullanıcının kullanacağı varsayılan kabuğu (shell) tanımlar.
Şimdi bu kullanıcıya geçici olarak sudo yetkisi verelim (kurulum adımlarını bu kullanıcı ile gerçekleştireceğiz, kurulum bittikten sonra güvenliği artırmak adına bu yetkiyi kaldırabilirsiniz):
sudo usermod -aG sudo kafka
Oluşturduğumuz kafka kullanıcısının oturumuna geçiş yapalım:
su - kafka
Adım 3: Apache Kafka’nın İndirilmesi ve Kurulması
Kafka’yı kurmak için Apache’nin resmi web sitesinden en güncel ve kararlı ikili (binary) dağıtımını indirmemiz gerekmektedir. Kafka sürümleri genellikle Kafka_Sürümü-Scala_Sürümü formatında adlandırılır. Bu rehberde, Scala 2.13 ile derlenmiş olan kararlı bir Kafka sürümünü (örneğin 3.4.0) indireceğiz.
Öncelikle geçici indirme işlemlerimiz için bir dizin oluşturalım ve oraya geçelim:
mkdir ~/indirmeler
cd ~/indirmeler
Şimdi wget kullanarak Kafka arşiv dosyasını indirelim:
wget https://archive.apache.org/dist/kafka/3.4.0/kafka_2.13-3.4.0.tgz
İndirme işlemi tamamlandıktan sonra, indirilen dosyanın bütünlüğünü doğrulamak iyi bir uygulamadır. Ancak bu adımı geçerek doğrudan arşiv dosyasını açabiliriz. Arşivi çıkarmak ve Kafka’yı çalıştıracağımız kalıcı dizine taşımak için aşağıdaki komutları uygulayın:
mkdir ~/kafka
tar -xvzf kafka_2.13-3.4.0.tgz -C ~/kafka --strip-components=1
--strip-components=1 parametresi, arşivin içerisindeki ana klasörü atlayarak tüm içeriği doğrudan oluşturduğumuz ~/kafka dizininin altına açmamızı sağlar. Böylece temiz bir dizin yapısı elde etmiş oluruz. Klasörün içeriğini kontrol edelim:
ls -la ~/kafka
Bu dizinde bin (çalıştırılabilir scriptler), config (yapılandırma dosyaları) ve libs (kütüphaneler) gibi temel klasörleri görmelisiniz.
Adım 4: Apache Kafka ve Zookeeper Yapılandırması
Geleneksel mimaride Apache Kafka, küme (cluster) yönetimi, metadata depolama, lider seçimi ve düğümler (nodes) arası koordinasyon için Apache Zookeeper’a ihtiyaç duyar. Her ne kadar Kafka’nın yeni sürümlerinde KRaft (Kafka Raft Metadata Mode) ile Zookeeper bağımlılığı ortadan kalkmaya başlasa da, Debian 9 gibi eski sistemlerde ve mevcut üretim ortamlarının büyük bir kısmında Zookeeper kullanımı hala yaygındır. Bu nedenle rehberimizde Zookeeper tabanlı kuruluma odaklanacağız.
Kafka yapılandırma dosyaları ~/kafka/config/ dizini altında yer alır. İlk olarak Kafka’nın veri depolama dizinini yapılandıracağız. Varsayılan olarak Kafka, verilerini geçici bir dizin olan /tmp/kafka-logs altında saklar. Ancak sunucu yeniden başlatıldığında /tmp dizini temizlenebileceği için bu durum veri kaybına yol açar. Bu yüzden kalıcı bir veri dizini oluşturmalıyız.
Veri depolama dizinlerini oluşturalım:
mkdir -p ~/kafka/data/zookeeper
mkdir -p ~/kafka/data/kafka
Zookeeper Yapılandırması
Zookeeper yapılandırma dosyasını (zookeeper.properties) düzenleyerek veri dizinini güncelleyelim:
nano ~/kafka/config/zookeeper.properties
Dosya içerisindeki dataDir parametresini bulun ve oluşturduğumuz yeni dizin ile değiştirin:
dataDir=/home/kafka/kafka/data/zookeeper
Varsayılan olarak Zookeeper 2181 numaralı portu kullanır. Eğer bu portu değiştirmek istemiyorsanız diğer ayarlara dokunmanıza gerek yoktur. Dosyayı kaydedip kapatın.
Kafka Yapılandırması
Şimdi ana Kafka yapılandırma dosyasını (server.properties) düzenleyelim:
nano ~/kafka/config/server.properties
Bu dosyada değiştirilmesi veya doğrulanması gereken birkaç önemli parametre bulunmaktadır:
- log.dirs: Kafka’nın mesaj loglarını saklayacağı dizindir. Varsayılan değeri
/tmp/kafka-logsolan bu parametreyi oluşturduğumuz kalıcı dizin ile değiştirmeliyiz:log.dirs=/home/kafka/kafka/data/kafka - delete.topic.enable: Varsayılan olarak Kafka’da oluşturulan konuların (topics) silinmesi devre dışı bırakılmış olabilir. Konuları kolayca silebilmek için dosyanın sonuna şu satırı ekleyin:
delete.topic.enable=true - listeners: Kafka’nın dış dünyadan gelen bağlantıları kabul edeceği adres ve port bilgisidir. Eğer Kafka’ya sadece yerel makineden erişilecekse varsayılan ayarlar yeterlidir. Ancak dışarıdan erişim sağlanacaksa aşağıdaki satırı bulun ve kendi sunucu IP adresinizle güncelleyin (satır başındaki
#işaretini kaldırmayı unutmayın):listeners=PLAINTEXT://your_server_ip:9092Not: Yerel testler için bu satırı
PLAINTEXT://localhost:9092şeklinde bırakabilirsiniz. - zookeeper.connect: Kafka’nın Zookeeper’a bağlanacağı adrestir. Zookeeper aynı sunucuda çalışacağı için bu değer varsayılan olarak kalabilir:
zookeeper.connect=localhost:2181
Gerekli değişiklikleri yaptıktan sonra dosyayı kaydedip kapatın.
Adım 5: Systemd Servis Dosyalarının Oluşturulması
Kafka ve Zookeeper’ı arka planda sürekli çalışan servisler haline getirmek ve sistem açılışında otomatik olarak başlamalarını sağlamak için systemd servis dosyaları oluşturmamız gerekir. Bu sayede servisleri systemctl komutları ile kolayca yönetebilir, çökmeleri durumunda otomatik olarak yeniden başlatılmalarını sağlayabiliriz.
Öncelikle root yetkilerine sahip bir kullanıcıya geri dönmemiz veya komutların başına sudo eklememiz gerekir. Servis dosyalarını oluşturmak için aşağıdaki adımları takip edin.
Zookeeper Systemd Servis Dosyası
Zookeeper servisi için yeni bir unit dosyası oluşturalım:
sudo nano /etc/systemd/system/zookeeper.service
Aşağıdaki yapılandırma metnini dosyaya yapıştırın:
[Unit]
Description=Apache Zookeeper Service
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
Dosyayı kaydedip kapatın.
Kafka Systemd Servis Dosyası
Şimdi Kafka servisi için unit dosyasını oluşturalım. Kafka’nın çalışabilmesi için Zookeeper’ın çalışır durumda olması gerektiğinden, bu dosyada Zookeeper bağımlılığını belirteceğiz:
sudo nano /etc/systemd/system/kafka.service
Aşağıdaki yapılandırma metnini dosyaya yapıştırın:
[Unit]
Description=Apache Kafka Broker
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=kafka
Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64"
ExecStart=/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
Dosyayı kaydedip kapatın.
Servislerin Aktifleştirilmesi ve Başlatılması
Yeni oluşturduğumuz servis dosyalarının systemd tarafından algılanması için systemd daemon’ını yeniden yüklememiz gerekir:
sudo systemctl daemon-reload
Şimdi her iki servisi de başlatalım ve sistem açılışında otomatik olarak başlamaları için etkinleştirelim:
sudo systemctl start zookeeper
sudo systemctl start kafka
sudo systemctl enable zookeeper
sudo systemctl enable kafka
Servislerin durumunu kontrol ederek her şeyin yolunda olduğundan emin olalım. İlk olarak Zookeeper durumunu kontrol edin:
sudo systemctl status zookeeper
Çıktıda active (running) ifadesini görmelisiniz. Ardından Kafka’nın durumunu kontrol edin:
sudo systemctl status kafka
Eğer her iki servis de sorunsuz bir şekilde çalışıyorsa, kurulum aşaması başarıyla tamamlanmış demektir. Eğer bir hata ile karşılaşırsanız, hata detaylarını incelemek için aşağıdaki komutla sistem loglarına göz atabilirsiniz:
sudo journalctl -u kafka.service -n 50 --no-pager
Adım 6: Kurulumun Test Edilmesi (Mesaj Gönderme ve Alma)
Kurulumun ve servislerin sorunsuz çalıştığını doğrulamak için Kafka’nın sunduğu yerleşik komut satırı araçlarını kullanarak bir test gerçekleştireceğiz. Bu test kapsamında bir “Konu” (Topic) oluşturacak, bir “Üretici” (Producer) ile bu konuya mesaj gönderecek ve bir “Tüketici” (Consumer) ile gönderdiğimiz mesajları gerçek zamanlı olarak okuyacağız.
Bu adımları gerçekleştirmek için tekrar kafka kullanıcısına geçiş yapalım:
su - kafka
1. Konu (Topic) Oluşturma
Kafka’da veriler “Topic” adı verilen kategoriler altında toplanır. İlk testimiz için “TestKonusu” adında, tek bölümlü (partition) ve tek çoğaltma faktörüne (replication factor) sahip bir konu oluşturalım:
/home/kafka/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic TestKonusu
Oluşturulan konunun başarıyla kaydedildiğini doğrulamak için mevcut konuları listeleyelim:
/home/kafka/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
Çıktıda TestKonusu adını görmelisiniz.
2. Üretici (Producer) ile Mesaj Gönderme
Kafka konularına veri yazan bileşenlere “Producer” denir. Komut satırından etkileşimli olarak mesaj gönderebilmek için yerleşik konsol üreticisini başlatalım:
/home/kafka/kafka/bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic TestKonusu
Bu komutu çalıştırdıktan sonra terminal sizden girdi bekleyecektir. Buraya birkaç test mesajı yazıp her mesajdan sonra Enter tuşuna basın:
Merhaba Kafka, Debian 9 uzerinde calisiyorsun!
Bu ilk test mesajimdir.
Sistem sorunsuz gorunuyor.
Mesajları yazdıktan sonra üreticiden çıkmak için Ctrl+C tuş kombinasyonunu kullanabilirsiniz.
3. Tüketici (Consumer) ile Mesajları Okuma
Gönderdiğimiz mesajları okumak için “Consumer” bileşenine ihtiyacımız vardır. Yeni bir terminal penceresi açıp kafka kullanıcısı ile giriş yapabilir veya mevcut terminalde konsol tüketicisini başlatabilirsiniz. Gönderilen tüm mesajları en başından itibaren okumak için --from-beginning parametresini kullanacağız:
/home/kafka/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TestKonusu --from-beginning
Komutu çalıştırdıktan kısa bir süre sonra, üretici tarafında yazdığınız tüm mesajların ekrana sırasıyla basıldığını göreceksiniz:
Merhaba Kafka, Debian 9 uzerinde calisiyorsun!
Bu ilk test mesajimdir.
Sistem sorunsuz gorunuyor.
Tüketiciyi durdurmak için yine Ctrl+C tuşlarına basabilirsiniz. Bu test, Apache Kafka’nın Debian 9 üzerinde mesajları başarıyla kabul ettiğini, depoladığını ve tüketicilere ulaştırdığını kanıtlamaktadır.
Adım 7: Güvenlik ve Sıkılaştırma (Öneriler)
Kurulumu başarıyla tamamladık, ancak bu sistem şu haliyle varsayılan ayarlarla çalışmaktadır ve dış dünyaya açık bir üretim ortamı için yeterince güvenli değildir. Sunucunuzu canlı ortama almadan önce aşağıdaki güvenlik önlemlerini almanızı şiddetle öneririz:
1. Sudo Yetkilerinin Kaldırılması
Kurulum başında kafka kullanıcısına verdiğimiz sudo yetkisini artık kaldırabiliriz. Bu işlem, kullanıcının sistem genelinde kritik değişiklikler yapmasını engeller:
sudo gpasswd -d kafka sudo
2. Güvenlik Duvarı (Firewall) Yapılandırması
Kafka (9092) ve Zookeeper (2181) portları dış dünyaya doğrudan açık olmamalıdır. Eğer sadece belirli uygulama sunucularının Kafka’ya erişmesini istiyorsanız, Debian 9 üzerinde iptables veya ufw kullanarak bu portlara erişimi sınırlandırmalısınız.
Örneğin, ufw kullanarak sadece belirli bir IP adresine (örneğin uygulama sunucunuzun IP’si olan 192.168.1.100) Kafka portuna erişim izni vermek için:
sudo ufw allow from 192.168.1.100 to any port 9092 proto tcp
3. SSL/TLS ve SASL Kimlik Doğrulaması
Varsayılan olarak Kafka üzerindeki veriler şifrelenmeden (plaintext) iletilir. Üretim ortamlarında istemciler ile Kafka broker’ları arasındaki trafiği şifrelemek için SSL/TLS yapılandırması yapılmalıdır. Ayrıca, yetkisiz kullanıcıların mesaj göndermesini veya okumasını engellemek için SASL (Simple Authentication and Security Layer) mekanizması entegre edilmelidir.
Sonuç
Bu rehberde, Debian 9 (Stretch) üzerinde Apache Kafka ve onun vazgeçilmez yardımcısı Apache Zookeeper’ın kurulumunu detaylı bir şekilde ele aldık. Sistem kaynaklarının verimli kullanılması amacıyla özel bir sistem kullanıcısı oluşturduk, Java ortamını hazırladık ve servislerin arka planda kesintisiz çalışabilmesi için systemd yapılandırmasını tamamladık. Son olarak, komut satırı araçlarıyla sistemin işlevselliğini test ettik.
Apache Kafka, doğru yapılandırıldığında ve ölçeklendirildiğinde mikro hizmet mimarinizin can damarı haline gelebilecek güçte bir araçtır. Bu kurulumun ardından, Kafka kümenizi genişletmek için yeni broker’lar ekleyebilir, veri saklama politikalarını (retention policies) optimize edebilir ve Kafka Connect veya Kafka Streams gibi ileri seviye bileşenleri entegre ederek gerçek zamanlı veri analitiği projelerinizi geliştirmeye başlayabilirsiniz.
