Kafka Nedir? Cluster Olarak Nasıl Kurulur?

Kaan Berk ÖZBEK
4 min readOct 29, 2023

--

Apache Kafka, yüksek performanslı ve dağıtık veri akış platformudur. Kafka, büyük miktarlardaki veriyi gerçek zamanlı olarak toplamak, işlemek ve depolamak için kullanılan bir mesaj sistemi ve akış işleme platformudur. Açık kaynaklı bir proje olup Apache Software Foundation tarafından geliştirilmektedir.

Zookeeper:
Zookeeper, Apache Kafka’nın çalışmasını sağlayan bir dağıtık koordinasyon hizmetidir. Kafka, birçok farklı sunucu (broker) üzerinde çalışır ve bu sunucuların koordinasyonu ve yönetimi için Zookeeper kullanılır.

Zookeeper’ın temel görevleri:

- Broker Yönetimi: Zookeeper, Kafka brokerlarının hangi sunucularda çalıştığını ve bunların durumunu takip eder.

- Lider Seçimi: Kafka’da her partition için bir lider broker seçilir. Zookeeper, bu lider seçimi işlemini yönetir.

- Konfigürasyon Depolama: Kafka konfigürasyon bilgilerini ve diğer önemli metaveriyi Zookeeper üzerinde saklar.

- Hata Algılama ve İşlemi: Zookeeper, Kafka’nın hata durumlarına nasıl yanıt vereceğini belirler ve bu hataları algılar.

Kafka Broker:
Kafka broker, Kafka mesajlarını saklayan, yöneten ve istemcilere ileten sunuculardır. Birden fazla broker, bir Kafka kümesi oluşturur. Brokerlar, Kafka konularını ve partition’ları yönetirler.

Temel görevleri:

- Mesaj Saklama: Brokerlar, Kafka konularındaki mesajları saklarlar. Her bir partition, bir broker üzerinde saklanır.

- Veri İletimi: Brokerlar, istemcilere verileri ileterek mesajların yayılmasını sağlarlar.

- Lider ve Follower Roller: Her partition, bir leader ve bir veya daha fazla follower broker’a sahiptir. Leader, yazma işlemlerini yönetir, followerlar ise verileri kopyalar ve istemcilere hizmet verir.

Partition:
Kafka’da bir konu (topic), bir veya daha fazla partition’a bölünebilir. Partition’lar, verileri paralel olarak işlemek için kullanılır. Her partition, bir lider ve bir veya daha fazla follower ile birlikte bir broker üzerinde saklanır. Partition’lar, mesajların saklandığı temel birimlerdir.

Topic:
Kafka’da bir topic, belirli bir konu veya veri akışını temsil eder. Veriler, bu konulara yayılır ve istemciler bu konulara abone olarak verileri tüketirler. Her bir konu, bir veya daha fazla partition’a sahip olabilir.

Replication:
Kafka’da verilerin dayanıklılığını artırmak için replication (replikasyon) kullanılır. Her partition, birden fazla broker üzerinde replike edilebilir. Bu, verilerin yedeklenmesini ve yedek brokerların kullanılması durumunda yüksek kullanılabilirlik sağlar.

Offset:
Kafka’daki her mesajın bir benzersiz bir offset değeri vardır. Offset, bir partition içindeki mesajların sırasını belirler. İstemciler, offset kullanarak mesajları okur ve işlerler. Offset, istemcilerin nerede kaldıklarını takip etmelerine yardımcı olur.

Producer:
Kafka üreticileri (producer’lar), verileri Kafka konularına gönderen uygulamalardır. Producer’lar, verileri belirli bir konuya gönderirler ve bu veriler partition’lara yazılır.

Consumer:
Kafka tüketicileri (consumer’lar), verileri Kafka konularından okuyan uygulamalardır. Tüketiciler, bir konuya abone olurlar ve verileri okur, işler veya başka bir yere iletirler. Kafka tüketicileri, veri işleme uygulamaları, depolama sistemleri veya diğer veri analizi araçlarıyla entegre edilebilirler.

Kafka 2.8.0 sonrası Zookeeper zorunluluğunu kaldırmıştır fakat şu anda Kafka’nın Prod ortamda Zookeeper olmadan kurulması henüz önerilmiyor, fakat test ortamlarında Zookeeper olmadan kurulum gerçekleştirilebilir. Kafka’nın 4.X sürümlerinde Zookeper olmadan kurulum yapılabilecek olması bekleniyor.

Kafka Partition Yapısı

Kafka Nasıl Kurulur?

Kafka Java ve Scala ile yazılmıştır, bu sebeple Java ve Jre’ye ihtiyaç duyar. Best Practice olarak replikasyonun ve HA yapının düzgün çalışabilmesi için minimum 3 Broker sunucuya ihtiyaç duyulmaktadır. 3 adet de Zookeeper sunucusu gerekmektedir.

sudo apt-get update
sudo apt-get install default-jre

Zookeeper kurulumu:

sudo wget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
sudo tar -xzf apache-zookeeper-3.6.3-bin.tar.gz -C /opt
telnet localhost 2181 //zookeperin kurulumunu kontrol etmek için portunu kontrol ediyoruz.
ruok // telnet attıktan sonra çıkan ekrana yazılacaktır, eğer zookeeper doğru çalışıyordsa imok yanıtı gelecektir.

Zookeeper config dosyası aşağıdaki gibidir.

# ZooKeeper'ın veri ve log dosyalarının saklanacağı dizini belirtir. Bu ayar, /datadisk/zookeeper dizinini kullanır.
dataDir=/data/zookeeper

# ZooKeeper istemcilerinin bu portu kullanarak ZooKeeper sunucusuna erişebileceği portu belirtir. Varsayılan olarak 2181 kullanılır.
clientPort=2181

# Bir istemci tarafından eş zamanlı bağlantı sayısını sınırlar. "0" sınırsız bağlantı anlamına gelir.

# ZooKeeper'ın kullanacağı zaman birimidir. Milisaniye cinsinden belirtilir. Örnekte 2000 (2 saniye) olarak ayarlanmıştır.
tickTime=2000

# Sunucular arasındaki senkronizasyon için süre sınırlamalarını belirtir.
initLimit=10

# Timeout olmadan önce (küme dışına çıkmadan önce) kaç kere ulaşamayacağını belirler.
syncLimit=5

# ZooKeeper sunucularını tanımlar. x değeri sunucu numarasını temsil eder. Her sunucu, sunucunun FQDN'si ve port numaraları ile ilişkilendirilir.
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

Her sunucu için sadece sayılardan oluşabilen uniq Zookeeper ID yaratılması gerekmektedir, ID sadece sayılardan oluşabilir. Aşağıda daha önce oluşturduğumuz myid dosyasının içine her bir sunucuda 1,2,3 olarak giriş yapmalıyız. Buradaki değerler ve zookeeper.config dosyası içindeki değerler aynı olmalıdır.

echo "1" > /data/zookeeper/myid

Zookeeper’in çalışıp çalışmadığını kontrol etmek için kullanılır.

/opt/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start

Kafka server.properties dosyası:

# Broker ID, her bir Kafka broker'ı için benzersiz olmalıdır.
broker.id=0

# Kafka broker'ın dinleyeceği port.
listeners=PLAINTEXT://:9092

# Verilerin saklanacağı klasör yolu.
log.dirs=/var/lib/kafka/data

# Log temizleme politikası ve sıkıştırma ayarları.
log.retention.hours=168
log.retention.bytes=1073741824

# Kafka logların içeriği ve ayrıntısı için loglama düzeyi.
log.cleaner.enable=false
log.segment.bytes=1073741824

# ZooKeeper ile iletişim için kullanılacak adres ve port.
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

# Kafka broker'ın JVM parametreleri.
# Kafka heap boyutu ve diğer JVM ayarları burada tanımlanır.
# Example:
# -Xmx512M
# -Xms512M
# -server
# -XX:PermSize=128M
# -XX:MaxPermSize=128M
# -XX:+UseG1GC

# Offsets konusunun replikasyon faktörü (replication factor).
offsets.topic.replication.factor=3

# İşlem durumu (transaction state) konusunun replikasyon faktörü (replication factor).
transaction.state.log.replication.factor=3

# İşlem durumu (transaction state) konusunun minimum ISR (in-sync replica) sayısı.
transaction.state.log.min.isr=2

# Bir topic için varsayılan partition sayısı, broker sayısı kadar olmalıdır.
num.partitions=3

Ardından aşağıdaki komutlar çalıştırılarak Kafka başlatılır.

/opt/kafka/kafka-server-start.sh –daemon 
/opt/kafka/config/server.properties
Kafka Cluster Yapısı

--

--

Kaan Berk ÖZBEK

Senior Application Management / DevOps Engineer@Doğuş Teknoloji