L’auteur a décidé que le Free and Open Source Fund recevrait une donation dans le cadre du programme Write for Donations.
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.
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.
É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.
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.
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 :
...
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.
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 :
[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 :
[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 :
OutputMar 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.
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 :
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 :
OutputHello, 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.
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 :
{
"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 :
OutputTopic 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.
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:21811
, 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.
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
.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!