Niedawno uczyłem się Kafki. W tym celu między innymi chciałem uruchomić sobie na komputerze kilka brokerów Kafki, wysłać jakiś komunikat, i odebrać go. Oto moje notatki, jak to robiłem.
Plan jest taki: uruchomię pod Dockerem (mam już go zainstalowanego) zookeepera i sześć brokerów. Skonfiguruję jeden topik z dwiema partycjami i potrójną replikacją. Wyślę komunikat komandlajnowym narzędziem kafkacat, potem odbiorę go też komandlajnowym narzędziem kafkacat.
Instaluję kafkacat:
$ sudo apt-get install kafkacat
Jeśli trzeba, oram dockera, zwłaszcza jeśli te eksperymenty robię nie pierwszy raz:
$ docker rm -f $(docker ps -aq)
$ docker network prune
Ściągam dockerowy obraz z zookeeperem i obraz z brokerem kafkowym:
$ docker pull confluentinc/cp-zookeeper:latest
$ docker pull confluentinc/cp-kafka:latest
Tworzę w dockerze sieć, po której będą rozmawiały brokery i zookeeper:
$ docker network create kafka
Uruchamiam zookeepera:
$ docker run -d --network=kafka --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper:latest
Uruchamiam sześć brokerów:
$ docker run -d --network=kafka --name=broker1 -p 9092:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=1 -e KAFKA_LISTENERS=PLAINTEXT://broker1:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker1:29092,PLAINTEXT_HOST://localhost:9092 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
$ docker run -d --network=kafka --name=broker2 -p 9093:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=2 -e KAFKA_LISTENERS=PLAINTEXT://broker2:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker2:29092,PLAINTEXT_HOST://localhost:9093 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
$ docker run -d --network=kafka --name=broker3 -p 9094:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=3 -e KAFKA_LISTENERS=PLAINTEXT://broker3:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker3:29092,PLAINTEXT_HOST://localhost:9094 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
$ docker run -d --network=kafka --name=broker4 -p 9095:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=4 -e KAFKA_LISTENERS=PLAINTEXT://broker4:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker4:29092,PLAINTEXT_HOST://localhost:9095 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
$ docker run -d --network=kafka --name=broker5 -p 9096:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=5 -e KAFKA_LISTENERS=PLAINTEXT://broker5:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker5:29092,PLAINTEXT_HOST://localhost:9096 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
$ docker run -d --network=kafka --name=broker6 -p 9097:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_BROKER_ID=6 -e KAFKA_LISTENERS=PLAINTEXT://broker6:29092,PLAINTEXT_HOST://:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker6:29092,PLAINTEXT_HOST://localhost:9097 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT confluentinc/cp-kafka:latest
Konfiguruję topic:
$ docker exec -it broker1 kafka-topics --create --topic obejrzane_filmy --partitions 2 --replication-factor 3 --bootstrap-server broker1:9092
Oglądam przez ciekawość konfigurację topica, żeby zobaczyć który broker jest w której partycji, które brokery są liderami itp:
$ docker exec -it broker1 kafka-topics --describe --topic obejrzane_filmy --bootstrap-server broker1:9092
Wysyłam komunikat, jako bootstrap używając któregokolwiek brokera:
$ echo '12345:{"userId": 12345, "film": "Nad Niemnem", "data": "2023-07-06"}' | kafkacat -P -b localhost:9093 -t obejrzane_filmy -K:
Odbieram komunikat, jako bootstrap używając któregokolwiek brokera:
$ kafkacat -C -b localhost:9092 -t obejrzane_filmy
Oglądam, które komunikaty są na których partycjach:
$ kafkacat -C -b localhost:9092 -t obejrzane_filmy -p 0
$ kafkacat -C -b localhost:9092 -t obejrzane_filmy -p 1
Oglądam sobie przez ciekawość logi brokerów:
$ docker logs broker1 | less