So installieren Sie Apache Kafka unter CentOS 7

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 Gruppewheelhinzu, 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.propertiesangegeben. Ö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 Dienstkafkagestartet 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.sherstellen. 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.sherstellen. 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.propertiesjeweils die folgenden Änderungen vornehmen:

  • Der Wert der Eigenschaftbroker.idollte 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 Eigenschaftzookeeper.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.connectauf 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.