Comment installer Apache Kafka sur Debian 9

L’auteur a sélectionné le Free and Open Source pour recevoir un don dans le cadre du Write for DOnations programme.

introduction

Apache Kafka est un courtier de messages distribué largement répandu, conçu pour gérer efficacement de gros volumes de données en temps réel. Un cluster Kafka est non seulement hautement évolutif et tolérant aux pannes, mais il offre également un débit beaucoup plus élevé par rapport à d’autres courtiers de messagerie tels que ActiveMQ et https: //www.rabbitmq. com / [RabbitMQ]. Bien qu’il soit généralement utilisé comme système de messagerie publish / subscribe, de nombreuses organisations l’utilisent également pour l’agrégation de journaux car il offre un stockage persistant des messages publiés.

Un système de messagerie de publication / abonnement permet à un ou plusieurs producteurs de publier des messages sans tenir compte du nombre de consommateurs ou de la façon dont ils traiteront les messages. Les clients abonnés sont automatiquement informés des mises à jour et de la création de nouveaux messages. Ce système est plus efficace et évolutif que les systèmes où les clients interrogent périodiquement pour déterminer si de nouveaux messages sont disponibles.

Dans ce tutoriel, vous allez installer et utiliser Apache Kafka 2.1.1 sur Debian 9.

Conditions préalables

Pour suivre, vous aurez besoin de:

  • Un serveur Debian 9 et un utilisateur non root avec les privilèges sudo. Suivez les étapes spécifiées dans ce guide si vous n’avez pas configuré d’utilisateur non root.

  • Au moins 4 Go de RAM sur le serveur. Les installations sans cette quantité de RAM peuvent provoquer l’échec du service Kafka, avec la Java machine virtuelle (JVM) générant une exception «Mémoire épuisée» au démarrage.

  • OpenJDK 8 installé sur votre serveur. Pour installer cette version, suivez les instructions https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-debian-9#installing-the-default-jrejdk] à ces instructions] sur l’installation de versions spécifiques d’OpenJDK. Kafka est écrit en Java, il nécessite donc une machine virtuelle Java; cependant, son script de démarrage a un bogue de détection de version qui l’empêche de démarrer avec les versions de machine virtuelle Java supérieures à 8.

Étape 1 - Créer un utilisateur pour Kafka

Kafka pouvant gérer les requêtes sur un réseau, vous devez créer un utilisateur dédié. Ceci minimise les dommages sur votre machine Debian si le serveur Kafka est compromis. Nous allons créer un utilisateur * kafka * dédié à cette étape, mais vous devez créer un autre utilisateur non root pour effectuer d’autres tâches sur ce serveur une fois la configuration de Kafka terminée.

Connecté en tant qu’utilisateur sudo non root, créez un utilisateur appelé * kafka * avec la commande + useradd +:

sudo useradd kafka -m

L’indicateur + -m + garantit qu’un répertoire de base sera créé pour l’utilisateur. Ce répertoire personnel, + / home / kafka +, servira de répertoire d’espace de travail pour l’exécution de commandes dans les sections ci-dessous.

Définissez le mot de passe avec + passwd +:

sudo passwd kafka

Ajoutez l’utilisateur * kafka * au groupe + sudo + à l’aide de la commande + adduser +, de sorte qu’il dispose des privilèges nécessaires pour installer les dépendances de Kafka:

sudo adduser kafka sudo

Votre utilisateur * kafka * est maintenant prêt. Connectez-vous à ce compte en utilisant + su +:

su -l kafka

Maintenant que nous avons créé l’utilisateur spécifique à Kafka, nous pouvons passer au téléchargement et à l’extraction des fichiers binaires Kafka.

Étape 2 - Télécharger et extraire les fichiers binaires Kafka

Téléchargeons et extrayons les fichiers binaires Kafka dans des dossiers dédiés du répertoire personnel de notre utilisateur * kafka *.

Pour commencer, créez un répertoire dans + / home / kafka + appelé + Téléchargements + pour stocker vos téléchargements:

mkdir ~/Downloads

Installez + curl + en utilisant + apt-get + pour pouvoir télécharger des fichiers distants:

sudo apt-get update && sudo apt-get install -y curl

Une fois que + curl + est installé, utilisez-le pour télécharger les fichiers binaires Kafka:

curl "https://www.apache.org/dist/kafka//kafka_.tgz" -o ~/Downloads/kafka.tgz

Créez un répertoire nommé + kafka + et accédez à ce répertoire. Ce sera le répertoire de base de l’installation de Kafka:

mkdir ~/kafka && cd ~/kafka

Extrayez l’archive que vous avez téléchargée à l’aide de la commande + tar +:

tar -xvzf ~/Downloads/kafka.tgz --strip 1

Nous spécifions l’indicateur + - strip 1 + pour nous assurer que le contenu de l’archive est extrait dans + ~ / kafka / + lui-même et non dans un autre répertoire (comme + ~ / kafka / kafka _ / +) à l’intérieur de cela.

Maintenant que nous avons téléchargé et extrait les fichiers binaires, nous pouvons maintenant configurer Kafka pour permettre la suppression de la rubrique.

Étape 3 - Configuration du serveur Kafka

Le comportement par défaut de Kafka ne nous permettra pas de supprimer un topic, la catégorie, le groupe ou le nom du flux dans lequel des messages peuvent être publiés. Pour modifier cela, modifions le fichier de configuration.

Les options de configuration de Kafka sont spécifiées dans + server.properties. Ouvrez ce fichier avec + nano + ou votre éditeur préféré:

nano ~/kafka/config/server.properties

Ajoutons un paramètre qui nous permettra de supprimer les sujets Kafka. Ajoutez ce qui suit au bas du fichier:

~ / kafka / config / server.properties

delete.topic.enable = true

Enregistrez le fichier et quittez + nano +. Maintenant que nous avons configuré Kafka, nous pouvons passer à la création de fichiers d’unité Systemd pour l’exécution et l’activation au démarrage.

Étape 4 - Création de fichiers d’unité Systemd et démarrage du serveur Kafka

Dans cette section, nous allons créer systemd pour le service Kafka. Cela nous aidera à effectuer les opérations de service courantes telles que le démarrage, l’arrêt et le redémarrage de Kafka d’une manière compatible avec les autres services Linux.

ZooKeeper est un service utilisé par Kafka pour gérer son état et ses configurations de cluster. Il est couramment utilisé dans de nombreux systèmes distribués en tant que composant intégral. Si vous souhaitez en savoir plus à ce sujet, visitez les documents officiels ZooKeeper.

Créez le fichier d’unité pour + zookeeper +:

sudo nano /etc/systemd/system/zookeeper.service

Entrez la définition d’unité suivante dans le fichier:

/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

La section + [Unit] + indique que ZooKeeper requiert la mise en réseau et que le système de fichiers est prêt avant de pouvoir démarrer.

La section + [Service] + spécifie que systemd doit utiliser les fichiers shell + zookeeper-server-start.sh + et + zookeeper-server-stop.sh + pour démarrer et arrêter le service. Il spécifie également que ZooKeeper doit être redémarré automatiquement s’il se ferme anormalement.

Ensuite, créez le fichier de service systemd pour + kafka +:

sudo nano /etc/systemd/system/kafka.service

Entrez la définition d’unité suivante dans le fichier:

/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

La section + [Unit] + indique que ce fichier d’unité dépend de + zookeeper.service +. Cela garantira que + zookeeper + sera démarré automatiquement au démarrage du service + kafka +.

La section + [Service] + spécifie que systemd doit utiliser les fichiers shell + kafka-server-start.sh + et + kafka-server-stop.sh + pour démarrer et arrêter le service. Il spécifie également que Kafka doit être redémarré automatiquement s’il se ferme anormalement.

Maintenant que les unités ont été définies, démarrez Kafka avec la commande suivante:

sudo systemctl start kafka

Pour vous assurer que le serveur a bien démarré, consultez les journaux du journal pour l’unité + kafka +:

sudo journalctl -u kafka

Vous devriez voir une sortie similaire à celle-ci:

OutputMar 23 13:31:48 kafka systemd[1]: Started kafka.service.

Vous avez maintenant un serveur Kafka qui écoute sur le port + 9092 +.

Bien que nous ayons démarré le service + kafka +, si nous devions redémarrer notre serveur, il ne serait pas démarré automatiquement. Pour activer + kafka + au démarrage du serveur, exécutez:

sudo systemctl enable kafka

Maintenant que nous avons démarré et activé les services, vérifions l’installation.

Étape 5 - Test de l’installation

Publions et utilisons un message * «Hello World» * pour nous assurer que le serveur Kafka se comporte correctement. La publication de messages dans Kafka nécessite:

  • Un producer, qui permet la publication d’enregistrements et de données dans des sujets.

  • Un consommateur, qui lit les messages et les données des sujets.

Commencez par créer un sujet nommé + TutorialTopic + en tapant:

~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic

Vous pouvez créer un producteur à partir de la ligne de commande en utilisant le script + kafka-console-producer.sh +. Il attend le nom d’hôte du serveur Kafka, son port et un nom de sujet comme arguments.

Publiez la chaîne " Hello, World " dans la rubrique + TutorialTopic + en tapant:

echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

Ensuite, vous pouvez créer un consommateur Kafka en utilisant le script + kafka-console-consumer.sh +. Il attend le nom d’hôte et le port du serveur ZooKeeper, ainsi qu’un argument de sujet.

La commande suivante consomme des messages de + TutorialTopic +. Notez l’utilisation de l’indicateur + - from-begin +, qui permet la consommation de messages publiés avant le démarrage du consommateur:

~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning

S’il n’y a pas de problèmes de configuration, vous devriez voir + Hello, World sur votre terminal:

OutputHello, World

Le script continuera à s’exécuter, en attendant que davantage de messages soient publiés dans le sujet. N’hésitez pas à ouvrir un nouveau terminal et à lancer un producteur pour publier quelques messages supplémentaires. Vous devriez pouvoir les voir tous dans la production du consommateur.

Lorsque vous avez terminé les tests, appuyez sur les touches + CTRL + C + pour arrêter le script consommateur. Maintenant que nous avons testé l’installation, passons à l’installation de KafkaT.

Étape 6 - Installation de KafkaT (facultatif)

KafkaT est un outil Airbnb qui facilite la visualisation des détails de votre cluster Kafka et l’exécution de certaines tâches administratives à partir de la ligne de commande. Parce que c’est un joyau Ruby, vous aurez besoin de Ruby pour l’utiliser. Vous aurez également besoin du paquet + build-essential + pour pouvoir construire les autres gemmes dont il dépend. Installez-les en utilisant + apt +:

sudo apt install ruby ruby-dev build-essential

Vous pouvez maintenant installer KafkaT en utilisant la commande gem:

sudo gem install kafkat

KafkaT utilise + .kafkatcfg + comme fichier de configuration pour déterminer les répertoires d’installation et de journalisation de votre serveur Kafka. Il devrait également avoir une entrée pointant KafkaT vers votre instance de ZooKeeper.

Créez un nouveau fichier nommé + .kafkatcfg +:

nano ~/.kafkatcfg

Ajoutez les lignes suivantes pour spécifier les informations requises sur votre serveur Kafka et votre instance Zookeeper:

~ / .kafkatcfg

{
 "kafka_path": "~/kafka",
 "log_path": "/tmp/kafka-logs",
 "zk_path": "localhost:2181"
}

Vous êtes maintenant prêt à utiliser KafkaT. Pour commencer, voici comment vous l’utiliseriez pour afficher les détails de toutes les partitions Kafka:

kafkat partitions

Vous verrez la sortie suivante:

OutputTopic                 Partition   Leader      Replicas        ISRs
TutorialTopic         0             0         [0]             [0]
__consumer_offsets    0               0           [0]                           [0]
...
...

Vous verrez «+ TutorialTopic », ainsi que « consumer_offsets », un sujet interne utilisé par Kafka pour stocker les informations relatives au client. Vous pouvez ignorer en toute sécurité les lignes commençant par ` consumer_offsets +`.

Pour en savoir plus sur KafkaT, reportez-vous à son référentiel GitHub.

Étape 7 - Configuration d’un cluster à plusieurs noeuds (facultatif)

Si vous souhaitez créer un cluster multi-courtiers utilisant plus de machines Debian 9, vous devez répéter les étapes 1, 4 et 5 sur chacune des nouvelles machines. De plus, vous devez apporter les modifications suivantes dans le fichier + server.properties pour chacune d’elles:

  • La valeur de la propriété + broker.id + doit être modifiée pour être unique dans tout le cluster. Cette propriété identifie de manière unique chaque serveur du cluster et peut avoir n’importe quelle chaîne comme valeur. Par exemple, " server1 ", " server2 ", etc.

  • La valeur de la propriété + zookeeper.connect + doit être modifiée de sorte que tous les nœuds pointent vers la même instance de ZooKeeper. Cette propriété spécifie l’adresse de l’instance ZooKeeper et suit le format + <HOSTNAME / IP_ADDRESS>: <PORT> +. Par exemple, ": 2181 ", ": 2181 " etc.

Si vous souhaitez avoir plusieurs instances ZooKeeper pour votre cluster, la valeur de la propriété + zookeeper.connect + sur chaque nœud doit être une chaîne identique, séparée par des virgules, répertoriant les adresses IP et les numéros de port de toutes les instances de ZooKeeper.

Étape 8 - Restriction de l’utilisateur Kafka

Maintenant que toutes les installations sont terminées, vous pouvez supprimer les privilèges d’administrateur de l’utilisateur * kafka *. Avant de le faire, déconnectez-vous et reconnectez-vous comme n’importe quel autre utilisateur sudo non root. Si vous exécutez toujours la même session shell avec laquelle vous avez commencé ce tutoriel, tapez simplement + exit +.

Supprimez l’utilisateur * kafka * du groupe sudo:

sudo deluser kafka sudo

Pour améliorer encore la sécurité de votre serveur Kafka, verrouillez le mot de passe de l’utilisateur * kafka * à l’aide de la commande + passwd +. Cela garantit que personne ne peut se connecter directement au serveur en utilisant ce compte:

sudo passwd kafka -l

À ce stade, seul l’utilisateur root ou sudo peut se connecter en tant que + kafka + en tapant la commande suivante:

sudo su - kafka

À l’avenir, si vous voulez le déverrouiller, utilisez + passwd + avec l’option + -u +:

sudo passwd kafka -u

Vous avez maintenant restreint avec succès les privilèges d’administrateur de l’utilisateur * kafka *.

Conclusion

Apache Kafka s’exécute maintenant de manière sécurisée sur votre serveur Debian. Vous pouvez vous en servir dans vos projets en créant des producteurs et des consommateurs Kafka à l’aide des Kafka clients, disponibles pour la plupart des langages de programmation. Pour en savoir plus sur Kafka, vous pouvez également consulter son documentation.