Apache Kafka auf der Konsole

Kafka ist eine schlanke Message Queue, deren Kernfeatures, im Vergleich zu etwa Apache ActiveMQ, besonders stark auf Skalierbarkeit, Performance und Fehlertoleranz ausgerichtet sind.

Nachdem im letzten Artikel zu Apache Kafka bereits die Grundlagen erläutert wurden, enthält dieser Artikel eine Anleitung zum grundlegenden Setup von Apache Kafka mit ZooKeeper. Auch die Verwendung des Kafka Message Brokers sowie Consumer und Producer werden hier thematisiert.

Apache Kafka starten

Zunächst wird eine einfache Kafka-Instanz mit ZooKeeper aufgesetzt. Diese kann hier (https://kafka.apache.org/downloads) heruntergeladen werden. Für dieses Beispiel wurde Version 0.11.0.1 für Scala 2.11 verwendet. ZooKeeper wird hier verwendet, um in einem späteren Schritt ohne großen Aufwand weitere Nodes dem Cluster hinzufügen zu können.

Das heruntergeladene Archiv lässt sich unter Windows mit einigen Konsolenbefehlen starten. Dazu wird zunächst in das entpackte Verzeichnis gewechselt (in unserem Fall …\kafka_2.11-0.11.0.1).

Im ersten Schritt wird nun die lokale ZooKeeper-Instanz gestartet. Dazu genügt der Aufruf des Befehls

bin\windows\zookeeper-server-start config\zookeeper.properties

Damit wird die ZooKeeper-Instanz mit der Konfigurationsdatei aus .\config\zookeeper.properties gestartet. In dieser config können Einstellungen, wie beispielsweise der ZooKeeper-Port, die maximale Anzahl an Verbindungen pro IP, vorgenommen werden.

Nachdem ZooKeeper nun läuft, kann die Kafka-Server-Instanz nun in einer neuen Konsole gestartet werden. Dazu wird der Befehl

bin\windows\kafka-server-start.bat config\server.properties

abgeschickt.

Im nächsten Schritt kann nun ein Topic hinzugefügt werden. Dazu wird folgender Befehl in ein neues Konsolenfenster eingegeben:

bin\windows\kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

Es wird also das kafka-topics-Skript ausgeführt mit folgenden Argumenten:

  • –create (zum Erstellen eines Topics)
  • –zookeper localhost:2181 (Es soll mit einer ZooKeeper-Instanz verbunden werden, welche unter localhost auf Port 2181 wartet)
  • –replication-factor 1 (Das Topic wird nicht repliziert)
  • –partitions 1 (Es soll nur eine Partition geben)
  • –topic test (Der Name des neuen Topics soll „test“ lauten)

Um Nachrichten über die Konsole an das Topic zu senden, wird

bin\windows\kafka-console-producer --broker-list localhost:9092 --topic test

eingegeben. Der Producer verbindet sich dann automatisch mit dem Broker unter localhost:9092 auf das Topic “test”. Jetzt können Nachrichten eingegeben werden.

Um ein Topic zu abonnieren, wird dieser Befehl eingegeben:

bin\windows\kafka-console-consumer --zookeeper localhost:2181 --topic test --from-beginning

unter –zookeeper localhost:2181 wird dabei die ZooKeeper-Instanz spezifiziert, –topic test gibt das Topic (“test”) an und –from-beginning spezifiziert, dass die Nachrichten ab Offset 0 zurückgegeben werden sollen. Damit werden also alle Nachrichten empfangen, die auf dem Topic „test“ in der Message Queue eingereiht sind, sowie alle Nachrichten, die ab jetzt noch an das Topic gesendet werden.

Ein weiterer, interessanter Befehle ist:

bin\windows\kafka-topics --list --zookeeper localhost:2181

Dieser Befehl listet die von der ZooKeeper-Instanz verwalteten Topics unter localhost:2181 auf.

Apache Kafka im Cluster

Da ein Cluster mit nur eine Knoten wenig Sinn ergibt, soll nun ein zweiter Knoten gestartet werden. Dazu muss in der server.properties neben dem zookeeper (zookeeper.connect) noch eine eindeutige BrokerId (broker.id) eingestellt werden. Danach kann die neue Serverinstanz einfach über das kafka-server-start-Skript gestartet werden und verbindet sich dann automatisch mit der spezifizierten ZooKeeper-Instanz.

Wenn wir nun ein neues Topic erstellen, können wir dieses einfach über beide Nodes skalieren. Dazu kann zum Beispiel ein Replikationsfaktor von 2 und eine Partitionsanzahl von 2 eingestellt werden.

bin\windows\kafka-topics --create --zookeeper localhost:2181 --replication-factor 2 --partitions 2 --topic test2

In unserem Beispiel wird dann auf jedem Node eine Partition gehostet und die jeweils andere repliziert. Dies lässt sich auch mit dem Describe-Befehl auslesen:

bin\windows\kafka-topics --describe --zookeeper localhost:2181 --topic test2

Das Resultat sieht wie folgt aus:

Topic:test2    PartitionCount:2        ReplicationFactor:2     Configs:
        Topic: test2   Partition: 0    Leader: 0       Replicas: 0,1   Isr: 0,1
        Topic: test2   Partition: 1    Leader: 1       Replicas: 1,0   Isr: 1,0

Hier wird neben dem Namen weitere detaillierten Information zum Topic angezeigt. Dazu gehören neben der Anzahl der Partition, dem Replikationsfaktor, und den Konfigurationseinstellungen auch Informationen zum Cluster und den Partitionen. Etwa auf welchen Servern die Replikas laufen: Hier läuft die erste Partition (PartitionId 0) auf Node 0 mit einem Replika auf Node 1 und die zweite Partition (PartitionId 1) auf Node 1 mit einem Replika auf Node 0) mit einem Replikat auf 1. „Isr“ beschreibt im Übrigen die Anzahl der In-Sync-Replicas. Wenn man nun einen der Kafka-Server beendet, wird automatisch der andere Node zum Leader befördert. Sobald der beendete Server wieder da ist, wird er automatisch wieder synchronisiert.

Fazit

Es fällt auf, dass sich Kafka ohne großen Aufwand mit der Standardkonfiguration starten und testen lässt. Ein Cluster zu erstellen ist denkbar einfach und die Kommandozeilentools enthalten die meisten Basis- und Diagnosefunktionen, die man von ihnen erwarten würde. Der nächste Schritt wäre jetzt, das Kafka-Cluster mit einer echten Anwendung zu testen. Dazu wird es im nächsten Artikel mehrere kleine Demoanwendungen geben.

Short URL for this post: https://wp.me/p4nxik-2Un
This entry was posted in Java Runtimes - VM, Appserver & Cloud and tagged , , , , . Bookmark the permalink.

Leave a Reply