Der Autor hat dieFree and Open Source Fundausgewählt, um eine Spende im Rahmen desWrite for DOnations-Programms zu erhalten.
Einführung
Apache Kafka ist ein beliebter Broker für verteilte Nachrichten, der für die effiziente Verarbeitung großer Mengen von Echtzeitdaten entwickelt wurde. Ein Kafka-Cluster ist nicht nur hoch skalierbar und fehlertolerant, sondern hat auch einen viel höheren Durchsatz als andere Nachrichtenbroker wieActiveMQ undRabbitMQ. Obwohl es im Allgemeinen alspublish/subscribe-Nachrichtensystem verwendet wird, verwenden viele Organisationen es auch für die Protokollaggregation, da es dauerhaften Speicher für veröffentlichte Nachrichten bietet.
Ein Publish / Subscribe-Messaging-System ermöglicht es einem oder mehreren Produzenten, Nachrichten zu veröffentlichen, ohne die Anzahl der Konsumenten oder die Art und Weise zu berücksichtigen, wie sie die Nachrichten verarbeiten. Abonnierte Clients werden automatisch über Updates und das Erstellen neuer Nachrichten informiert. Dieses System ist effizienter und skalierbarer als Systeme, bei denen Clients regelmäßig abfragen, um festzustellen, ob neue Nachrichten verfügbar sind.
In diesem Tutorial installieren und verwenden Sie Apache Kafka 2.1.1 unter CentOS 7.
Voraussetzungen
Um mitzukommen, benötigen Sie:
-
Ein CentOS 7-Server und ein Benutzer ohne Rootberechtigung mit Sudo-Berechtigungen. Befolgen Sie die inguideangegebenen Schritte, wenn Sie keinen Nicht-Root-Benutzer eingerichtet haben.
-
Mindestens 4 GB RAM auf dem Server. Installationen ohne diese RAM-Größe können dazu führen, dass der Kafka-Dienst fehlschlägt, wobeiJava virtual machine (JVM) beim Start eine Ausnahme "Nicht genügend Speicher" auslöst.
-
OpenJDK 8 ist auf Ihrem Server installiert. Befolgen Sie zum Installieren dieser Versionthese instructions, um bestimmte Versionen von OpenJDK zu installieren. Kafka ist in Java geschrieben, daher ist eine JVM erforderlich. Das Start-Shell-Skript weist jedoch einen Versionserkennungsfehler auf, der dazu führt, dass das Starten mit JVM-Versionen über 8 fehlschlägt.
[[Schritt-1 - Erstellen eines Benutzers für Kafka]] == Schritt 1 - Erstellen eines Benutzers für Kafka
Da Kafka Anforderungen über ein Netzwerk verarbeiten kann, sollten Sie einen dedizierten Benutzer dafür erstellen. Dies minimiert Schäden an Ihrem CentOS-Computer, falls der Kafka-Server gefährdet sein sollte. In diesem Schritt erstellen wir einen dediziertenkafka-Benutzer. Sie sollten jedoch einen anderen Nicht-Root-Benutzer erstellen, um andere Aufgaben auf diesem Server auszuführen, sobald Sie Kafka eingerichtet haben.
Erstellen Sie mit dem Befehluseradd
einen Benutzer namenskafka, der als Nicht-Root-Sudo-Benutzer angemeldet ist:
sudo useradd kafka -m
Das Flag-m
stellt sicher, dass ein Basisverzeichnis für den Benutzer erstellt wird. Dieses Ausgangsverzeichnis,/home/kafka
, fungiert in den folgenden Abschnitten als Arbeitsbereichsverzeichnis für die Ausführung von Befehlen.
Legen Sie das Passwort mitpasswd
fest:
sudo passwd kafka
Fügen Sie den Benutzerkafkamit dem Befehladduser
der Gruppewheel
hinzu, damit er über die erforderlichen Berechtigungen zum Installieren der Kafka-Abhängigkeiten verfügt:
sudo usermod -aG wheel kafka
Der Benutzer Ihreskafkaist jetzt bereit. Melden Sie sich mitsu
in diesem Konto an:
su -l kafka
Nachdem wir den Kafka-spezifischen Benutzer erstellt haben, können wir die Kafka-Binärdateien herunterladen und extrahieren.
[[Schritt 2 - Herunterladen und Extrahieren der Kafka-Binärdateien]] == Schritt 2 - Herunterladen und Extrahieren der Kafka-Binärdateien
Laden Sie die Kafka-Binärdateien herunter und extrahieren Sie sie in dedizierte Ordner im Home-Verzeichnis unsereskafka-Benutzers.
Erstellen Sie zunächst in/home/kafka
ein Verzeichnis mit dem NamenDownloads
, um Ihre Downloads zu speichern:
mkdir ~/Downloads
Verwenden Siecurl
, um die Kafka-Binärdateien herunterzuladen:
curl "https://www.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz
Erstellen Sie ein Verzeichnis mit dem Namenkafka
und wechseln Sie in dieses Verzeichnis. Dies ist das Basisverzeichnis der Kafka-Installation:
mkdir ~/kafka && cd ~/kafka
Extrahieren Sie das heruntergeladene Archiv mit dem Befehltar
:
tar -xvzf ~/Downloads/kafka.tgz --strip 1
Wir geben das Flag--strip 1
an, um sicherzustellen, dass der Inhalt des Archivs in~/kafka/
elbst und nicht in einem anderen Verzeichnis (z. B.~/kafka/kafka_2.11-2.1.1/
) extrahiert wird.
Nachdem wir die Binärdateien erfolgreich heruntergeladen und extrahiert haben, können wir die Konfiguration auf Kafka fortsetzen, um das Löschen von Themen zu ermöglichen.
[[Schritt 3 - Konfigurieren des Kafka-Servers]] == Schritt 3 - Konfigurieren des Kafka-Servers
Das Standardverhalten von Kafka erlaubt es uns nicht,topic, die Kategorie, Gruppe oder den Feednamen zu löschen, unter denen Nachrichten veröffentlicht werden können. Um dies zu ändern, bearbeiten wir die Konfigurationsdatei.
Die Konfigurationsoptionen von Kafka sind inserver.properties
angegeben. Öffnen Sie diese Datei mitvi
oder Ihrem bevorzugten Editor:
vi ~/kafka/config/server.properties
Fügen wir eine Einstellung hinzu, mit der wir Kafka-Themen löschen können. Drücken Siei
, um Text einzufügen, und fügen Sie am Ende der Datei Folgendes hinzu:
~/kafka/config/server.properties
delete.topic.enable = true
Wenn Sie fertig sind, drücken SieESC
, um den Einfügemodus zu verlassen, und:wq
, um die Änderungen in die Datei zu schreiben und zu beenden. Nachdem wir Kafka konfiguriert haben, können wir System-Unit-Dateien erstellen, die ausgeführt und beim Start aktiviert werden.
[[Schritt-4 - Erstellen von Systemd-Unit-Dateien und Starten des Kafka-Servers]] == Schritt 4 - Erstellen von Systemd-Unit-Dateien und Starten des Kafka-Servers
In diesem Abschnitt erstellen wirsystemd unit files für den Kafka-Dienst. Auf diese Weise können wir allgemeine Dienstaktionen wie Starten, Stoppen und Neustarten von Kafka auf eine Weise ausführen, die mit anderen Linux-Diensten konsistent ist.
Zookeeper ist ein Dienst, mit dem Kafka seinen Clusterstatus und seine Konfigurationen verwaltet. Es wird häufig in vielen verteilten Systemen als integraler Bestandteil verwendet. Wenn Sie mehr darüber erfahren möchten, besuchen Sie die offiziellenZookeeper docs.
Erstellen Sie die Einheitendatei fürzookeeper
:
sudo vi /etc/systemd/system/zookeeper.service
Geben Sie die folgende Einheitendefinition in die Datei ein:
/etc/systemd/system/zookeeper.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
Der Abschnitt[Unit]
gibt an, dass Zookeeper ein Netzwerk benötigt und das Dateisystem bereit sein muss, bevor es gestartet werden kann.
Der Abschnitt[Service]
gibt an, dass systemd die Shell-Dateienzookeeper-server-start.sh
undzookeeper-server-stop.sh
zum Starten und Stoppen des Dienstes verwenden soll. Es gibt auch an, dass Zookeeper automatisch neu gestartet werden soll, wenn es nicht normal beendet wird.
Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.
Erstellen Sie als Nächstes die systemd-Servicedatei fürkafka
:
sudo vi /etc/systemd/system/kafka.service
Geben Sie die folgende Einheitendefinition in die Datei ein:
/etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
Der Abschnitt[Unit]
gibt an, dass diese Einheitendatei vonzookeeper.service
abhängt. Dadurch wird sichergestellt, dasszookeeper
automatisch gestartet wird, wenn der Dienstkafa
gestartet wird.
Der Abschnitt[Service]
gibt an, dass systemd die Shell-Dateienkafka-server-start.sh
undkafka-server-stop.sh
zum Starten und Stoppen des Dienstes verwenden soll. Es gibt auch an, dass Kafka automatisch neu gestartet werden soll, wenn es nicht normal beendet wird.
Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.
Nachdem Sie die Einheiten definiert haben, starten Sie Kafka mit dem folgenden Befehl:
sudo systemctl start kafka
Überprüfen Sie die Journalprotokolle auf die Einheitkafka
, um sicherzustellen, dass der Server erfolgreich gestartet wurde:
journalctl -u kafka
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
OutputJul 17 18:38:59 kafka-centos systemd[1]: Started kafka.service.
Sie haben jetzt einen Kafka-Server, der Port9092
überwacht.
Während wir den Dienstkafka
gestartet haben, wird er beim automatischen Neustart unseres Servers nicht automatisch gestartet. Führen Sie Folgendes aus, umkafka
beim Serverstart zu aktivieren:
sudo systemctl enable kafka
Nachdem wir die Dienste gestartet und aktiviert haben, überprüfen wir die Installation.
[[Schritt-5 - Testen der Installation]] == Schritt 5 - Testen der Installation
Lassen Sie uns eine“Hello World”-Nachricht veröffentlichen und verwenden, um sicherzustellen, dass sich der Kafka-Server ordnungsgemäß verhält. Das Veröffentlichen von Nachrichten in Kafka erfordert:
-
Aproducer, mit dem Datensätze und Daten zu Themen veröffentlicht werden können.
-
Aconsumer, das Nachrichten und Daten von Themen liest.
Erstellen Sie zunächst ein Thema mit dem NamenTutorialTopic
, indem Sie Folgendes eingeben:
~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic
Sie werden die folgende Ausgabe sehen:
OutputCreated topic "TutorialTopic".
Sie können einen Produzenten über die Befehlszeile mit dem Skriptkafka-console-producer.sh
erstellen. Es werden der Hostname, der Port und ein Themenname des Kafka-Servers als Argumente erwartet.
Veröffentlichen Sie die Zeichenfolge"Hello, World"
im ThemaTutorialTopic
, indem Sie Folgendes eingeben:
echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
Als Nächstes können Sie einen Kafka-Consumer mit dem Skriptkafka-console-consumer.sh
erstellen. Es erwartet den Hostnamen und den Port des ZooKeeper-Servers sowie einen Themennamen als Argumente.
Der folgende Befehl verwendet Nachrichten vonTutorialTopic
. Beachten Sie die Verwendung des Flags--from-beginning
, mit dem Nachrichten verwendet werden können, die vor dem Start des Verbrauchers veröffentlicht wurden:
~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
Wenn keine Konfigurationsprobleme vorliegen, sollteHello, World
in Ihrem Terminal angezeigt werden:
OutputHello, World
Das Skript wird weiterhin ausgeführt und wartet darauf, dass weitere Nachrichten im Thema veröffentlicht werden. Öffnen Sie einfach ein neues Terminal und starten Sie einen Produzenten, um weitere Nachrichten zu veröffentlichen. Sie sollten sie alle in der Ausgabe des Verbrauchers sehen können.
Wenn Sie mit dem Testen fertig sind, drücken SieCTRL+C
, um das Consumer-Skript zu stoppen. Nachdem wir die Installation getestet haben, fahren wir mit der Installation von KafkaT fort.
[[Schritt-6 -—- Installation von Kafkat-optional]] == Schritt 6 - Installation von KafkaT (optional)
KafkaT ist ein Tool von Airbnb, mit dem Sie Details zu Ihrem Kafka-Cluster einfacher anzeigen und bestimmte Verwaltungsaufgaben über die Befehlszeile ausführen können. Da es sich um ein Ruby-Juwel handelt, benötigen Sie Ruby, um es zu verwenden. Sie benötigen außerdemruby-devel
und Build-bezogene Pakete wiemake
undgcc
, um die anderen Edelsteine erstellen zu können, von denen es abhängt. Installieren Sie sie mityum
:
sudo yum install ruby ruby-devel make gcc patch
Sie können KafkaT jetzt mit dem Befehl gem installieren:
sudo gem install kafkat
KafkaT verwendet.kafkatcfg
als Konfigurationsdatei, um die Installations- und Protokollverzeichnisse Ihres Kafka-Servers zu ermitteln. Es sollte auch einen Eintrag enthalten, der KafkaT auf Ihre ZooKeeper-Instanz verweist.
Erstellen Sie eine neue Datei mit dem Namen.kafkatcfg
:
vi ~/.kafkatcfg
Fügen Sie die folgenden Zeilen hinzu, um die erforderlichen Informationen zu Ihrem Kafka-Server und Ihrer Zookeeper-Instanz anzugeben:
~/.kafkatcfg
{
"kafka_path": "~/kafka",
"log_path": "/tmp/kafka-logs",
"zk_path": "localhost:2181"
}
Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.
Sie können KafkaT jetzt verwenden. So können Sie zunächst Details zu allen Kafka-Partitionen anzeigen:
kafkat partitions
Sie werden die folgende Ausgabe sehen:
OutputTopic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
__consumer_offsets 0 0 [0] [0]
...
...
Sie sehenTutorialTopic
sowie__consumer_offsets
, ein internes Thema, das von Kafka zum Speichern von kundenbezogenen Informationen verwendet wird. Sie können Zeilen, die mit__consumer_offsets
beginnen, ignorieren.
Weitere Informationen zu KafkaT finden Sie unterGitHub repository.
[[Schritt 7 - Einrichten eines Multi-Node-Clusters optional]] == Schritt 7 - Einrichten eines Multi-Node-Clusters (optional)
Wenn Sie einen Multi-Broker-Cluster mit mehreren CentOS 7-Computern erstellen möchten, müssen Sie die Schritte 1, 4 und 5 auf jedem neuen Computer wiederholen. Darüber hinaus sollten Sie in der Dateiserver.properties
jeweils die folgenden Änderungen vornehmen:
-
Der Wert der Eigenschaft
broker.id
ollte so geändert werden, dass er im gesamten Cluster eindeutig ist. Diese Eigenschaft identifiziert jeden Server im Cluster eindeutig und kann eine beliebige Zeichenfolge als Wert haben. Zum Beispiel"server1"
,"server2"
usw. -
Der Wert der Eigenschaft
zookeeper.connect
sollte so geändert werden, dass alle Knoten auf dieselbe ZooKeeper-Instanz verweisen. Diese Eigenschaft gibt die Adresse der Zookeeper-Instanz an und folgt dem Format<HOSTNAME/IP_ADDRESS>:<PORT>
. Zum Beispiel"203.0.113.0:2181"
,"203.0.113.1:2181"
usw.
Wenn Sie mehrere ZooKeeper-Instanzen für Ihren Cluster haben möchten, sollte der Wert der Eigenschaftzookeeper.connect
auf jedem Knoten eine identische, durch Kommas getrennte Zeichenfolge sein, in der die IP-Adressen und Portnummern aller ZooKeeper-Instanzen aufgeführt sind.
[[Schritt-8 - Einschränkung des Kafka-Benutzers]] == Schritt 8 - Einschränkung des Kafka-Benutzers
Nachdem alle Installationen abgeschlossen sind, können Sie die Administratorrechte des Benutzerskafkaentfernen. Melden Sie sich vorher ab und wieder als jeder andere Benutzer ohne Rootberechtigung an. Wenn Sie immer noch dieselbe Shell-Sitzung ausführen, mit der Sie dieses Lernprogramm gestartet haben, geben Sie einfachexit
ein.
Entfernen Sie den Benutzer vonkafkaaus der Sudo-Gruppe:
sudo gpasswd -d kafka wheel
Um die Sicherheit Ihres Kafka-Servers weiter zu verbessern, sperren Sie das Kennwort des Benutzerskafkamit dem Befehlpasswd
. Dies stellt sicher, dass sich niemand mit diesem Konto direkt beim Server anmelden kann:
sudo passwd kafka -l
Zu diesem Zeitpunkt können sich nurroot odersudo
Benutzer alskafka
anmelden, indem Sie den folgenden Befehl eingeben:
sudo su - kafka
Wenn Sie es in Zukunft entsperren möchten, verwenden Siepasswd
mit der Option-u
:
sudo passwd kafka -u
Sie haben jetzt die Administratorrechte des Benutzerskafkaerfolgreich eingeschränkt.
Fazit
Sie haben jetzt Apache Kafka sicher auf Ihrem CentOS-Server ausgeführt. Sie können es in Ihren Projekten verwenden, indem Sie Kafka-Produzenten und -Konsumenten mitKafka clients erstellen, die für die meisten Programmiersprachen verfügbar sind. Um mehr über Kafka zu erfahren, können Sie auch dessendocumentation konsultieren.