Apache Kafka Replication ve Acknowledgment #2

Kayhan Öztürk
4 min readNov 18, 2023

--

Apache Kafka Nedir, Ne Zaman Kullanılır? konusundan sonra kafkaya veri nasıl yazılır ve replikasyon kavramlarından aşağıda detaylıca bahsedilmektedir.

Apache kafka’ya verinin nasıl yazıldığından bahsetmeden önce; zookeeper, broker ve replication kavramlarından bahsetmek daha faydalı olacaktır.

Zookeeper: Broker’ların koordine edilmesi, çöken broker’lardan ve silinen topic’lerden haberdar olunması, keşfedilmesi sorumluluğuna sahiptir.

Broker: Kafka’ya gönderdiğimiz veriler broker’larda saklanır ve işlenir. Event’ler/mesajlar broker’da harddisklerde saklanır.

Replication Kavramı Nedir?

Her verinin kopyalanacak sayısını belirttiğimiz kavramdır. Bir verinin kaç replikasyonu olacağını belirterek, ilgili verilerin kopyalarını tutup veri kaybının önüne geçebiliriz. Her verinin kaç ayrı broker’da tutulacağını belirterek, veri kaybının önüne geçebilmemizi sağlamış olur. Örnek bir use-case üzerinden ilerleyelim:

Cluster’ımızda 5 broker yer alsın ve replikasyonumuz 3 olsun. Bu brokerlardan/sunuculardan herhangi biri çöktüğü durumda, yeni kopyası diğer broker’a yazılır. Fakat buradaki en önemli konu: server yani broker sayısının, replication factor değerinden daha fazla olması gerektiğidir. Aksi durumda veri kaybı yaşanması olasıdır.

Kafkaya Veri Nasıl Yazılır?

Apache kafka, verileri broker’ların içerisindeki topic’lerde saklar. Topic’lerden bahsettiğimiz durumda partition’lara da değinmekte fayda vardır. Topic içerisinde partition’lar yer alır. Aslında veriler, topicler içerisinde partitionlara yazılır. Her topic içerisinde bir veya daha fazla partition olabilir. Her yeni yazdığımız veri partitionlar’da devamlı sona doğru eklenir(loglama mantığı gibi düşünebiliriz).

Kafka Veri Saklama Yöntemleri Nelerdir?

Kafka’da 2 çeşit veri saklama yöntemi mevcuttur.

  • Zaman: Eğer veriler belirtilen gün sayısından eski ise bu veriler silinir. Eğer biz bu değeri 10 gün olarak belirttiysek, 10 günden eski olan mesajların tümü silinecektir.
  • Veri Büyüklüğü: Topic içerisindeki veri büyüklüğü belirtilerek, ilgili veri büyüklüğüne geldiğinde verilerin silinmesi sağlanabilir.

Veri büyüklüğünden ziyade zaman bazlı saklama yöntemi daha çok tercih edilir.

Partition Kullanmamızın Nedenleri Nelerdir?

  • Aggregation: Yukarıdaki örnekte bahsettiğimiz üzere yazılan verileri, belirli özelliklere kategorilere göre toplanmasını sağlayabiliriz.
  • Event sourcing: Verilerin sıralı bir şekilde tutulması, saklanması için partition’ları kullanabiliriz.
  • Consumer sayısı artabilir: Partition kullanarak, birden fazla consumer tarafından ayrı ayrı partitionlar okunabilir. Her partitiondan yalnızca bir consumer, ilgili mesajı okuyabileceğinden consumer sayımızın fazla olduğu durumlarda partition’lardan faydalanabiliriz.

Partition Kullandığımız Use-Case’den Bahsedelim:

Haber portalı yazdığımızı farzedelim. Kullanıcının okuduğu haberleri anlık olarak “haberler” topic’ine yazdığımızı düşünelim.Bu topic’de ise 2 adet ayrı partition yaratalım. Birinci partition’da belirli kategorideki okunan haber verilerini tutup, diğer partition’da farklı kategorilerde okunan haberlerin verilerini gönderebiliriz. Böylelikle consume edecek servisimizde, “haberler” topic’indeki hangi partition’ı (kategoriye göre) okuyacağını bilerek ilgili topic’in istediği partition’ını okuyabilir.

Veriler Partitionlara Nasıl Yazılır?

Mesajların ilgili topiclerdeki partitionlara nasıl yazılacağından detaylıca bahsedelim.

  • Round-robin: Producer servisimizde eğer herhangi bir key belirtilmezse, yani ilgili mesajların şu partition’a yazılması gerekiyor şeklinde bir konfigurasyona sahip değilse devreye round-robin girmiş olur. Round-robin kafka veri yazımında varsayılan davranıştır diyebiliriz. “news” topic’ine 2 mesaj gönderdiğimizi düşünelim ve bu topic’de 2 adet partition olsun. Her gelen mesaj sırasıyla partition’lara yazılır. İlk mesaj “news” topic’indeki birinci partitiona, ikinci mesaj ise aynı topic’teki ikinci partition’a yazılır.
  • Aggregation: Kategorilere göre veriyi yazdığımız kavramdır diyebiliriz. “news” topic’inde ekonomi, spor gibi partition’lara ayırarak gönderdiğimiz verileri kategorilerine göre bölerek partition’lara yazabiliriz. Ekonomi ile ilgili olan mesajı, aynı topic’in ekonomi partition’ına; spor ile ilgili olan mesajı ise aynı topic’in spor partition’ınına yazabiliriz. Böylelikle kategoriye göre partition’lara yazmış oluruz.
  • Event Sourcing: Belirli bir id değerine göre verilerimizi partition’lara bölüştürebiliriz. Örneğin; admin ve user rollerinde kullanıcılarımız olduğunu düşünelim. Bu kullanıcıların hareketlerini “activites” topic’ine yazacağız. Bu topic’imizde de 2 partition yer aldığını düşünelim. Admin rolü için gelen mesajda, admin id’sini göndererek ilk partitiona, user rolü için gelen mesajda ise user id’sinden ayrıştırarak ikinci partition’a yazabiliriz. Böylelikle event sourcing gerçekleştirmiş oluruz.

Acknowledgment Nedir?

Acknowledgmentdan bahsetmeden önce leader partition kavramından bahsetmekten faydalı olacaktır.

Leader partition: 7 broker’ımızın olduğu bir sistem düşünelim. 1 adet de topic’imiz var. Bu topic’in ise 2 tane partition’ı olsun. Replication factor değerimiz ise 3 olsun. Producer her yeni veri gönderdiğinde, kafka bu broker’lar arasından leader partition seçer ve bizim yazdığımız veriler ilk olarak buraya gönderilir. Sonrasında ise leader partitiondaki veri, kopyalarının tutulduğu diğer broker’daki partitionlara gönderilerek senkronizasyon sağlanmış olur. Leader broker dışındaki tüm broker’lara, replika adı verilir.

Acknowledgment Kavramı

Kafkaya veri yazarken, hangi safhalarının tamamlanarak çalışacağını belirttiğimiz kavrama acknowledgment adı verilir. Normalde 3 aşamadan oluşan veri yazma işlemi(kafkaya veri göndermek, leader partition’da saklanması ve bu verinin diğer replika partitionlara yazılması/senkronize olması) farklı acknowledgment durumlarına göre de gerçekleştirilebilir.

  • Ack — 0: Producer veriyi kafkaya gönderir ve onay beklemeden işlemlerine devam eder. Herhangi bir onay almadan işlemlerine devam ettiği için verinin kafkada saklanıp saklanmama ihtimali gibi pek çok konu muammadır. En hızlı fakat en riskli olan yöntem budur diyebiliriz.
  • Ack- 1: Producer veriyi kafkaya gönderir, leader partition’a veri yazılır. Leader partitiondan onay gönderilir. Leader partition’a yazıldığının onayı verildikten sonra diğer replika partition’lara aynı verinin senkronizasyonu beklenmeden işlemlere devam edilir. Mesaj diğer partitionlara senkronize olmayabilir ve mesaj kaybına sebebiyet verebilir. Ack-0'a göre daha güvenilirdir.
  • Ack- all: En güvenli yöntem ack:all yöntemidir diyebiliriz. Producer kafkaya veriyi gönderir, leader partition’a yazılmasını bekler ve sonrasında diğer replika partitionlarla leader partition’ının senkronize olması beklenir. Tüm aşamalar tamamlandıktan sonra onay alarak, işlemlerine devam eder. Her ne kadar bu yöntem en güvenilir olsa da, en yavaş çalışan yöntem de budur diyebiliriz.

Kafka ile ilgili diğer yazı serimizde ise uygulamalı olarak kafkayı implemente ettiğimiz ve projemize uygun olarak tüm konfigürasyonlarını ayarladığımız servisi yazacağız.

--

--