Geliştirme ortamı için basitçe Kafka kurulumu
Tags: kafka, zookeeper, topic, docker
Published: 2022-07-07 14:55:57

Apache Kafka, belirli verilerin bir sistemden toplanıp diğer sistemlere kararlı bir şekilde transferini sağlayan dağıtık bir veri akış uygulamasıdır. Özellikle büyük veri sistemlerinde verilerin düzenlileşmesi ve transflerinin yönetilmesi için sıklıkla kullanıldığını görmekteyiz.

# Mimari

Bu dökümanda basitçe bir **Kafka** kurulumu yapacağız. Kafka kurulumunun yanında çeşitli sistemlerle birlikte kullanılan ve dağıtık yapılar için koordinasyon hizmetini sağlayan **ZooKeeper**'ı da kuracağız.

Bu iki sistem için 2181 portunda yayın yapan ZooKeeper ve 9092 portundan yayın yapan Kafka isimli iki docker imajını ayağa kaldıracağız. Bunlar için docker ve docker-compose kurulu olduğunu varsayarak ilerleyeceğiz.

Docker imajlarını aşağıdaki iki adresten alacak şekilde kullanacağız.
* https://hub.docker.com/r/wurstmeister/zookeeper/
* https://hub.docker.com/r/wurstmeister/kafka/

# Servislerin ayağa kaldırılması

Docker üzerinde sistemin ayağa kaldırılması için bir klasöre geçip aşağıdaki dosyayı **docker-compose.yml** olarak kaydetmeniz gerekmektedir.

```
version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
```

Daha sonrasında kaydettiğiniz dosyanın bulunduğu klasörde aşağıdaki komutu kullanabilirsiniz.

```bash
docker-compose -f docker-compose.yml up -d
```

Çıktı olarak aşağıdaki gibi bir çıktı görmeniz gerekmektedir:

```
Creating network "kafka01_default" with the default driver
Pulling zookeeper (wurstmeister/zookeeper:)...
latest: Pulling from wurstmeister/zookeeper
a3ed95caeb02: Pull complete
...
f0dd38204b6f: Pull complete
Digest: sha256:7a7fd44a72104bfbd24a77844bad5fabc86485b036f988ea927d1780782a6680
Status: Downloaded newer image for wurstmeister/zookeeper:latest
Pulling kafka (wurstmeister/kafka:)...
latest: Pulling from wurstmeister/kafka
42c077c10790: Pull complete
...
539ec416bc55: Pull complete
Digest: sha256:2d4bbf9cc83d9854d36582987da5f939fb9255fb128d18e3cf2c6ad825a32751
Status: Downloaded newer image for wurstmeister/kafka:latest
Creating kafka     ... done
Creating zookeeper ... done
```

Bu adımların sonunda `docker ps` komutu ile aşağıdaki gibi ayakta olan iki konteynır görmeniz gerekmektedir.

```
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                NAMES
fee8bfc6cebb   wurstmeister/zookeeper   "/bin/sh -c '/usr/sb…"   45 minutes ago   Up 45 minutes   22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   zookeeper
f8c2ab063d6c   wurstmeister/kafka       "start-kafka.sh"         45 minutes ago   Up 45 minutes   0.0.0.0:9092->9092/tcp                               kafka
```

# Kafka üzerinde topic oluşturma

Kafka üzerindeki yapıyı bu dokümanda anlatmayacağım. Bir çok kaynakta bununla ilgili Türkçe ve İngilizce bir çok içerik bulunuyor. 

Docker compose ile kafka isminde oluşan docker container'ına giriş için aşağıdaki komutu kullanabilirsiniz:

```bash
docker exec -it kafka /bin/sh
```

Bu adımdan sonra aşağıdaki komut ile kafka'nın "binary" dizinine girip çalıştırılabilecek komutları görebilirsiniz. Tabi ki sürüme göre klasörün ismi de değişeceğini varsayabilirsiniz:

```bash
cd /opt/kafka_<sürümbilgisi>/bin
```

Bu adımdan sonra topic oluşturmak için aşağıdaki komutu uygulamak yeterli olacaktır.

```bash
kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic ornek_topic
```

Bu adımda aşağıdaki gibi ornek_topic'in oluşturulduğu bilgisi alınmalıdır.

```
Created topic ornek_topic.
```

# Topic'in kontrol edilmesi

Aynı klasörde iken kafka üzerindeki topiclerin listesini öğrenebilirsiniz.

```bash
kafka-topics.sh --list --zookeeper zookeeper:2181
```

Bu adımda çıktı olarak ornek_topic çıktısını görmeniz yeterli olacaktır.