Tutorial

Comment installer Apache Kafka sur Debian 10

ApacheMessagingOpen SourceDebian 10

L'auteur a décidé que le Free and Open Source Fund recevrait une donation dans le cadre du programme Write for Donations.

Introduction

Apache Kafka est un courtier de messages très populaire conçu pour traiter de gros volumes de données en temps réel. Un cluster Kafka est très évolutif et tolérant aux pannes et a également un débit beaucoup plus élevé que d'autres courtiers de messages tels que ActiveMQ ou RabbitMQ. Bien qu'il soit généralement utilisé comme un système de messagerie publish/subscribe, de nombreuses organisations l'utilisent également pour l'agrégation de journaux, car il offre un stockage permanent pour les messages publiés.

Un système de messagerie publish/subscribe permet à un ou plusieurs producteurs de publier des messages sans tenir compte du nombre de consommateurs ni de la manière 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 plus évolutif que les systèmes où les clients effectuent des sondages périodiques pour déterminer si de nouveaux messages sont disponibles.

Dans ce tutoriel, vous allez installer et configurer Apache Kafka 2.1.1 en toute sécurité sur un serveur Debian 10, puis tester votre installation en produisant et en consommant un message Hello World. Vous installerez alors facultativement KafkaT pour surveiller Kafka et mettre en place un cluster multi-noeuds Kafka.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

Remarque : les installations ne disposant pas de 4 Go de RAM peuvent provoquer l'échec du service Kafka, la machine virtuelle Java (JVM) lançant une exception "Out Of Memory" lors du démarrage.

Étape 1 - Créez un utilisateur pour Kafka

Étant donné que Kafka peut traiter les demandes sur un réseau, il est préférable de créer un utilisateur dédié à cette fin. Cela permet de minimiser les dommages à votre machine Debian si le serveur Kafka est compromis. Vous créerez l'utilisateur Kafka dédié au cours de cette étape.

Connectez-vous en tant qu'utilisateur non root sudo, créez un utilisateur appelé Kafka avec la commande useradd :

  • sudo useradd kafka -m

Le drapeau -m garantit qu'un répertoire d'accueil sera créé pour l'utilisateur. Ce répertoire d'accueil, /home/kafka, fera office de répertoire de votre espace de travail pour l'exécution de commandes ultérieures.

Définissez le mot de passe en utilisant passwd :

  • sudo passwd kafka

Entrez le mot de passe que vous souhaitez utiliser pour cet utilisateur.

Ensuite, ajoutez l'utilisateur Kafka au groupe sudo avec la commande adduser, afin 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 vous avez créé l'utilisateur spécifique à Kafka, vous pouvez passer au téléchargement et à l'extraction des binaires de Kafka.

Étape 2 - Téléchargez et extrayez les binaires de Kafka

Au cours de cette étape, vous téléchargerez et extrairez les binaires Kafka dans des dossiers dédiés dans le répertoire d'accueil de votre utilisateur Kafka.

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

  • mkdir ~/Downloads

Ensuite, installez curl en utilisant apt-get de sorte que vous puissiez téléchargez des fichiers à distance :

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

Lorsque vous êtes invités à le faire, tapez Y pour confirmer le téléchargement curl.

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

  • curl "https://archive.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz

Créez un répertoire appelé Kafka et accédez à ce répertoire. Ce sera le répertoire de base de l'installation Kafka :

  • mkdir ~/kafka && cd ~/kafka

Extrayez l'archive que vous avez téléchargée en utilisant la command tar :

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

Vous avez spécifié le drapeau --strip 1 pour vous assurer que le contenu de l'archive est extrait dans ~/kafka/ lui-même et non dans un autre répertoire à l'intérieur de celui-ci, comme ~/kafka/kafka_2.12-2.1.1/.

Maintenant que vous avez téléchargé et extrait les binaires avec succès, vous pouvez passer à la configuration de Kafka pour permettre la suppression de sujets.

Étape 3 - Configurez le serveur Kafka

Le comportement par défaut de Kafka ne nous permettra pas de supprimer un sujet, la catégorie, le groupe ou le nom du flux au sein duquel les messages peuvent être publiés. Pour modifier cela, vous devez éditer 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 la ligne surlignée suivante au bas du fichier :

~/kafka/config/server.properties
...
group.initial.rebalance.delay.ms

delete.topic.enable = true

Enregistrez le fichier et quittez nano. Maintenant que vous avez configuré Kafka, vous pouvez créer des fichiers unitaires systemd pour le fonctionnement et l'activation de Kafka au démarrage.

Étape 4 - Créez des fichiers unitaires Systemd et démarrez le serveur Kafka

Dans cette section, vous créerez des fichiers unitaires systemd pour le service Kafka. Cela vous aidera à effectuer des actions de service communes telles que le démarrage, l'arrêt et le redémarrage de Kafka d'une manière cohérente avec les autres services Linux.

ZooKeeper est un service que Kafka utilise pour gérer l'état de son cluster et les configurations. Il est couramment utilisé dans les systèmes distribués comme un élément à part entière. Dans ce tutoriel, vous utiliserez Zookeeper pour gérer ces aspects de Kafka. Si vous souhaitez en savoir plus, consultez les documents officiels du ZooKeeper.

Tout d'abord, créez le fichier unitaire pour zookeeper :

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

Saisissez 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é] précise que ZooKeeper nécessite le réseautage et que le système de fichiers doit être prêt pour que le démarrage soit possible.

La section [Service] précise que systemd doit utiliser les fichiers shell zookeeper-server-start.sh et zookeeper-server-stop.sh​​​​​​ pour lancer et arrêter le service. Il précise également que ZooKeeper doit être redémarré automatiquement s'il est quitté anormalement.

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

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

Saisissez 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é] précise que ce fichier unitaire dépend de zookeeper.service. Cela garantira que zookeeper se lance automatiquement lorsque le service Kafka débute.

La section [Service] précise 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 précise également que Kafka doit être redémarré automatiquement s'il est quitté anormalement.

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

  • sudo systemctl start kafka

Pour vous assurer que le serveur a bien démarré, vérifiez les journaux de l'unité Kafka :

  • sudo journalctl -u kafka

Vous verrez un résultat similaire à celui qui suit :

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

Vous avez maintenant un serveur Kafka en écoute sur le port 9092, qui est le port par défaut pour Kafka.

Vous avez lancé le service kafka, mais si vous deviez redémarrer votre serveur, il ne se lancerait pas encore automatiquement. Pour activer Kafka au démarrage du serveur, exécutez :

  • sudo systemctl enable kafka

Maintenant que vous avez lancé et activé les services, il est temps de vérifier l'installation.

Étape 5 - Testez l'installation

Nous allons publier et consommer un message Hello World pour nous assurer que le serveur Kafka se comporte correctement. Publier des messages dans Kafka nécessite :

  • Un producteur, qui permet la publication d'enregistrements et de données par thèmes.
  • Un consommateur, qui lit les messages et les données provenant de sujets.

Tout d'abord, créez un sujet appelé TutorialTopic en tapant :

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

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

Publiez la chaine Hello World dans le sujet TutorialTopic en tapant :

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

Le drapeau --broker-list détermine la liste des courtiers de messages à qui envoyer un message, dans le cas présent localhost:9092. --topic désigne le sujet comme TutorialTopic.

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

La commande suivante consomme les messages de TutorialTopic. Notez l'utilisation du drapeau --from-beginning, qui permet la consommation de messages qui ont été publiés avant que le consommateur n'ait commencé :

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

--bootstrap-server fournit une liste d'entrées dans le cluster Kafka. Dans le cas présent, vous utilisez localhost:9092.

Vous verrez Hello, World dans votre terminal :

Output
Hello, World

Le script continuera à fonctionner, en attendant que d'autres messages soient publiés sur le sujet. N'hésitez pas à ouvrir un nouveau terminal et à créer un producteur pour publier quelques messages supplémentaires. Vous devriez pouvoir tous les voir dans la sortie du consommateur. Si vous souhaitez en savoir plus sur la façon d'utiliser Kafka, consultez la documentation officielle de Kafka.

Une fois vos tests terminés, appuyez sur CTRL+C pour arrêter le script de consommation. Maintenant que vous avez testé l'installation, vous pouvez passer à l'installation de KafkaT afin de mieux administrer votre cluster Kafka.

Étape 6 - Installez KafkaT (facultatif)

KafkaT est un outil d'Airbnb qui vous permet de visualiser plus facilement les détails de votre cluster Kafka et d'effectuer certaines tâches administratives depuis la ligne de commande. Etant donné qu'il s'agit d'un gem Ruby, vous aurez besoin de Ruby pour l'utiliser. Vous aurez aussi besoin du package build-essential pour pouvoir construire les autres gems dont il dépend. Installez-les en utilisant apt :

  • sudo apt install ruby ruby-dev build-essential

Vous pouvez désormais installer KafkaT en utilisant la command gem :

  • sudo CFLAGS=-Wno-error=format-overflow gem install kafkat

L'option CFLAGS=-Wno-error=format-overflow désactive les avertissements de débordement de format et est nécessaire pour le gem ZooKeeper, qui est une dépendance de KafkaT.

KafkaT utilise .kafkatcfg comme fichier de configuration pour déterminer les répertoires d'installation et de connexion de votre serveur Kafka. Il doit également inclure une entrée permettant de relier KafkaT à votre instance ZooKeeper.

Créez un nouveau fichier appelé .kafkatcfg :

  • nano ~/.kafkatcfg

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

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

Vous êtes désormais prêt à utiliser KafkaT. Pour commencer, voici comment vous pourriez l'utiliser pour visualiser les détails de toutes les partitions Kafka :

  • kafkat partitions

Vous verrez le résultat suivant :

Output
Topic Partition Leader Replicas ISRs TutorialTopic 0 0 [0] [0] __consumer_offsets 0 0 [0] [0] ...

La sortie montre TutorialTopic, ainsi que __consumer_offsets, un sujet interne utilisé par Kafka pour stocker les informations liées au client. Vous pouvez sans risque ignorer les lignes commençant par __consumer_offsets.

Pour en savoir plus sur KafkaT, consultez son dépôt GitHub.

Maintenant que vous avez installé KafkaT, vous pouvez éventuellement configurer Kafka sur une cluster de serveurs Debian 10 pour en faire un cluster multi-noeuds.

Étape 7 - Mettez en place un cluster multi-noeuds (facultatif)

Si vous souhaitez créer un cluster multi-courtiers en utilisant plus de serveurs Debian 10, répétez l'étape 1, l'étape 4 et l'étape 5 sur chacune des nouvelles machines. En outre, effectuez les modifications suivantes dans le fichier ~/kafka/config/server.properties pour chacune d'entre elles :

  • Modifiez la valeur de la propriété broker.id de sorte qu'elle soit unique dans l'ensemble du 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…, seraient utiles comme identificateurs.

  • Modifiez la valeur de la propriété zookeeper.connect de sorte que tous les nœuds pointent vers la même instance ZooKeeper. Cette propriété précise l'adresse de l'instance du ZooKeeper et suit le format <HOSTNAME/IP_ADDRESS>:<PORT>. Pour ce tutoriel, vous utiliserez your_first_server_IP:2181​​​1​​​, en remplaçant your_first_server_IP par l'adresse IP du serveur Debian 10 que vous avez déjà mis en place.

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

Remarque : si vous avez un pare-feu activé sur le serveur Debian 10 avec Zookeeper installé, veillez à ouvrir le port 2181 pour autoriser les requêtes entrantes des autres nœuds du cluster.

Étape 8 - Restreignez l'utilisateur Kafka

Maintenant que toutes les installations sont terminées, vous pouvez retirer les privilèges administratifs de l'utilisateur Kafka. Avant de le faire, déconnectez-vous et reconnectez-vous comme tout autre utilisateur non root sudo. Si vous utilisez toujours la session shell avec laquelle vous avez commencé ce tutoriel, tapez simplement exit.

Retirez l'utilisateur kafka du groupe sudo :

  • sudo deluser kafka sudo

Pour améliorer encore davantage la sécurité de votre serveur Kafka, verrouillez le mot de passe de l'utilisateur kafka à l'aide de la commande passwd. Cela permet de s'assurer 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 dans la commande suivante :

  • sudo su - kafka

À l'avenir, si vous souhaitez le déverrouiller, utilisez passwd avec l'option -u.

  • sudo passwd kafka -u

Vous avez maintenant restreint avec succès les privilèges administratifs de l'utilisateur Kafka.

Conclusion

Apache Kafka fonctionne désormais en toute sécurité sur votre serveur Debian. Vous pouvez l'utiliser dans vos projets en créant des producteurs et des consommateurs Kafka en utilisant Kafka clients (ils sont disponibles dans la plupart des langages de programmation). Pour en savoir plus sur Kafka, vous pouvez également consulter la documentation Apache Kafka.

Creative Commons License