Apache Kafka im Überblick

Unternehmen nutzen Apache Kafka, um Entscheidungen nahezu in Echtzeit zu treffen. Diese Datendrehscheibe und Event-Streaming-Plattform ermöglicht Antworten in dem Moment, in dem die Fragen aufkommen, und hilft Organisationen dabei, vom Warten zum Handeln zu kommen.

Ein Apache Kafka Cluster

Apache Kafka im Überblick
1

Nachrichten sind die Nutzdaten, auch als Records bezeichnet. Sie werden als Byte-­Arrays gesendet und sind in der Regel in Batches gruppiert.

2

Producer senden Nachrichten an den Leader einer Partition und wählen die Partition selbst mit Hilfe eines Partitioners aus.

3

Topics werden verwendet, um Nachrichten eines bestimmten Themas zu bündeln. Sie sind mit Tabellen in einer Datenbank vergleichbar.

4

Partitionen sind das Rückgrat der Kafka-Performance. Topics werden in Partitionen unterteilt, um Prozesse zu parallelisieren und skalierbar zu machen. Darüber hinaus können Partitionen über Kafka-Broker hinweg repliziert werden, um Ausfallsicherheit und hohe Verfügbarkeit zu gewährleisten.

5

Consumer empfangen und verarbeiten Nachrichten von Kafka und können aus

6

Consumer Groups ermöglichen die parallele Verarbeitung und skalierbare Nachrichtenverarbeitung, indem sie Partitionen und Nachrichten unter den Consumern aufteilen. Fällt ein Consumer aus, übernehmen die anderen in der Gruppe dessen Aufgaben, was Ausfallsicherheit gewährleistet.

7

Broker sind die Kafka-Server. Sie teilen Replicas und Aufgaben gleichmäßig unter sich, was die Leistung verbessert. Fällt ein Broker aus, übernimmt ein anderer, was die Zuverlässigkeit erhöht.

8

Leader ist der Broker, der für Lese- und Schreiboperationen einer Partition verantwortlich ist. Die Leader sind so gleichmäßig wie möglich auf alle Broker verteilt.

9

Follower sind die Broker, auf die die Partitionen vom Leader kopiert werden, um die Resilienz zu erhöhen.

10

Koordinationscluster (KRaft, zuvor ZooKeeper-Ensemble) wird von Kafka zur internen Koordination verwendet.

Begriffe

  1. Nachrichten sind die Nutzdaten, auch als Records bezeichnet. Sie werden als Byte-­Arrays gesendet und sind in der Regel in Batches gruppiert.

  2. Producer senden Nachrichten an den Leader einer Partition und wählen die Partition selbst mit Hilfe eines Partitioners aus.

  3. Topics werden verwendet, um Nachrichten eines bestimmten Themas zu bündeln. Sie sind mit Tabellen in einer Datenbank vergleichbar.

  4. Partitionen sind das Rückgrat der Kafka-Performance. Topics werden in Partitionen unterteilt, um Prozesse zu parallelisieren und skalierbar zu machen. Darüber hinaus können Partitionen über Kafka-Broker hinweg repliziert werden, um Ausfallsicherheit und hohe Verfügbarkeit zu gewährleisten.

  5. Consumer empfangen und verarbeiten Nachrichten von Kafka und können aus

  6. Consumer Groups ermöglichen die parallele Verarbeitung und skalierbare Nachrichtenverarbeitung, indem sie Partitionen und Nachrichten unter den Consumern aufteilen. Fällt ein Consumer aus, übernehmen die anderen in der Gruppe dessen Aufgaben, was Ausfallsicherheit gewährleistet.

  7. Broker sind die Kafka-Server. Sie teilen Replicas und Aufgaben gleichmäßig unter sich, was die Leistung verbessert. Fällt ein Broker aus, übernimmt ein anderer, was die Zuverlässigkeit erhöht.

  8. Leader ist der Broker, der für Lese- und Schreiboperationen einer Partition verantwortlich ist. Die Leader sind so gleichmäßig wie möglich auf alle Broker verteilt.

  9. Follower sind die Broker, auf die die Partitionen vom Leader kopiert werden, um die Resilienz zu erhöhen.

  10. Koordinationscluster (KRaft, zuvor ZooKeeper-Ensemble) wird von Kafka zur internen Koordination verwendet.

Wichtige CLI-Befehle

Nachrichten produzieren

kafka-console-producer.sh 	# Nachrichten produzieren
    --bootstrap-server localhost:9092
    --topic mytopic		# zu welchem Topic?
    OPTIONAL   mit Keys produzieren (Key:Value)
    --property parse.key=true
    --property key.separator=:
Nachrichten produzieren
kafka-console-producer.sh \
    --bootstrap-server localhost:9092 \
    --topic orders
Hello World
Order #12345
Customer request
# Mit Strg+D beenden
Nachrichten mit Keys produzieren
kafka-console-producer.sh \
    --bootstrap-server localhost:9092 \
    --topic user-events \
    --property parse.key=true \
    --property key.separator=:
user123:{"action": "login", "timestamp": "2024-01-15T10:30:00Z"}
user456:{"action": "purchase", "amount": 99.99}
user789:{"action": "logout", "session_duration": 1800}
# Mit Strg+D beenden
Empfohlene Einstellungen
# Für Zuverlässigkeit
acks=all
enable.idempotence=true

# Für Durchsatz
batch.size=524288 # z.B. 512KiB, Standard: 16384 (16KiB), Höhere Werte erhöhen den Durchsatz
linger.ms=5 # Standard: 0, Wartet auf weitere Nachrichten, um ein Batch zu füllen
compression.type=lz4 # Standard: none, Komprimiert die Nachrichten, um den Durchsatz zu erhöhen

# Für Überwachung
client.id=my-producer-app

Nachrichten konsumieren

kafka-console-consumer.sh 	# Nachrichten konsumieren
    --bootstrap-server localhost:9092
    --topic mytopic		# Von welchem Topic?
    OPTIONAL
    --from-beginning		# von Anfang an lesen
    --property print.key=true	# Key anzeigen
    --group my_group		# einer Consumer Group zuweisen
Nachrichten konsumieren
kafka-console-consumer.sh \
    --bootstrap-server localhost:9092 \
    --topic orders
# Mit Strg+C beenden
Nachrichten von Anfang an konsumieren
kafka-console-consumer.sh \
    --bootstrap-server localhost:9092 \
    --topic orders \
    --from-beginning
# Mit Strg+C beenden
Nachrichten mit Keys konsumieren
kafka-console-consumer.sh \
    --bootstrap-server localhost:9092 \
    --topic user-events \
    --property print.key=true \
    --from-beginning
# Mit Strg+C beenden
Nachrichten mit einer Consumer Group konsumieren
kafka-console-consumer.sh \
    --bootstrap-server localhost:9092 \
    --topic user-events \
    --group mygroup \
    --from-beginning
# Mit Strg+C beenden

Topics

kafka-topics.sh 		# Topic-Operationen
    --bootstrap-server localhost:9092
    --list 			# alle Topics auflisten
    --topic mytopic
    --create 			# Topic erstellen
    --replication-factor 3	# Wie viele Replikate?
    OPTIONAL
    --config min.insync.replicas=2 # andere Einstellungen
    --describe 		# Topic beschreiben
    --delete			# es löschen
Ein Topic erstellen
kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --create \
    --topic new-topic \
    --partitions 6 \
    --replication-factor 1
Wichtige Einstellungen
# Für Zuverlässigkeit
replication-factor=3
min.insync.replicas=2

# Für Durchsatz
partitions = 12 # Standard: 1

# Für Bereinigung
cleanup.policy=delete
retention.hours=168 # Standard: Nachrichten nach 7 Tagen löschen

# Für komprimierte Topics
cleanup.policy=compact

# Für dauerhafte Aufbewahrung
cleanup.policy=delete
retention.hours=-1

Weiterlesen:

Ein Topic beschreiben
kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --describe \
    --topic new-topic
Topics auflisten
kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --list
Ein Topic löschen
kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --delete \
    --topic new-topic

Consumer Groups

kafka-consumer-groups.sh	# Consumer Groups verwalten
    --bootstrap-server localhost:9092
    --list			# alle Consumer Groups anzeigen
    --describe 		# mehr Info über die Groups
    --reset-offsets 		# Offsets zurücksetzen:
    --execute			# sonst: Dry run
    --to-datetime 		# Auf eine Zeit zurücksetzen
    --to-earliest		# Zur ältesten Nachricht
    --to-latest		# Zur neuesten Nachricht
    # mehr lesen: siehe Hilfe-Seite
    --delete-offsets		# nur Offsets löschen?
    --delete			# oder die ganze Group?
    # worauf bezieht sich der Befehl? (kombinierbar)
    --group mygroup		# auf eine Group?
    --all-groups		# auf alle Groups?
    --topic mytopic		# auf ein Topic?
    --all-topics		# auf alle Topics?
Consumer Groups auflisten
kafka-consumer-groups.sh \
    --bootstrap-server localhost:9092 \
    --list
Eine Consumer Group beschreiben
kafka-consumer-groups.sh \
    --bootstrap-server localhost:9092 \
    --describe \
    --group mygroup

Performance Tests

kafka-producer-perf-test.sh	# Producer Performance Tests
    --topic mytopic
    --num-records 1000	# Anzahl der zu produzierenden Nachrichten
    --throughput -1	 	# deaktivieren oder MSG/s
    --record-size 1000	# Größe in Bytes
    ALTERNATIVE
    --payload-file myfile.json # eine Nachricht pro Zeile
    --producer-props bootstrap.servers=... # Einstellungen
    OPTIONAL
    --producer.config producer.properties # aus Datei lesen
Einfacher Producer-Leistungstest
kafka-producer-perf-test.sh \
    --topic performance-test \
    --num-records 10000000 \
    --record-size 1024 \
    --throughput -1 \
    --producer-props bootstrap.servers=localhost:9092
Für Durchsatz optimierter Performance Test
kafka-producer-perf-test.sh \
    --topic throughput-test \
    --num-records 1000000000 \
    --record-size 1024 \
    --throughput -1 \
    --producer-props bootstrap.servers=localhost:9092 \
    batch.size=943718 \
    linger.ms=10 \
    compression.type=lz4
kafka-consumer-perf-test.sh	# Consumer Performance Tests
    --bootstrap-server localhost:9092
    --topic mytopic
    --consumer.config consumer.properties	# Einstellungen
    --messages 1000000	# wie viele Nachrichten lesen?
Einfacher Consumer-Leistungstest
kafka-consumer-perf-test.sh \
    --bootstrap-server localhost:9092 \
    --topic performance-test \
    --messages 100000 \
    --group performance-test

Nützliche Tools

kafka-streams-application-reset.sh	# Kafka Streams-Anwendungen zurücksetzen
kafka-leader-election.sh		# neuen Partition Leader wählen
kafka-reassign-partitions.sh		# Partitionen zwischen Brokern verschieben
kafka-configs.sh			# Einstellungen verwalten
kafka-dump-log.sh			# Segmente anzeigen
kafka-acls.sh				# Berechtigungen verwalten
kcat					# Alternative zu kafka-console-producer und consumer
    -b localhost:9092
    -t mytopic
    -C/-P				# Consumer oder Producer
Kafka Streams-Anwendungen zurücksetzen
kafka-streams-application-reset.sh \
    --bootstrap-servers localhost:9092 \
    --application-id my-streams-app \
    --input-topics input-topic \
    --to-datetime 2024-01-01T00:00:00Z
Neuen Partition Leader wählen
kafka-leader-election.sh \
    --bootstrap-server localhost:9092 \
    --election-type PREFERRED \
    --all-topic-partitions
Nachrichten mit kcat produzieren und konsumieren
# Nachrichten produzieren
kcat \
    -b localhost:9092 \
    -t mytopic \
    -P
Hello World
Another message
# Mit Strg+D beenden

# Nachrichten konsumieren
kcat \
    -b localhost:9092 \
    -t mytopic \
    -C

Hallo, ich bin Anatoly! Ich liebe es, bei Menschen das Funkeln in den Augen zu wecken. Als Apache Kafka Experte und Buchautor bringe ich seit über einem Jahrzehnt IT zum Leben - mit Leidenschaft statt Langeweile, mit Erlebnissen statt endlosen Folien.