Comment installer Apache Kafka sur CentOS 7

L'auteur a sélectionné lesFree and Open Source Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

Apache Kafka est un courtier de messages distribué populaire 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 a également un débit beaucoup plus élevé par rapport à d'autres courtiers de messages tels queActiveMQ etRabbitMQ. Bien qu'il soit généralement utilisé comme système de messageriepublish/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 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 didacticiel, vous allez installer et utiliser Apache Kafka 2.1.1 sur CentOS 7.

Conditions préalables

Pour suivre, vous aurez besoin de:

  • Un serveur CentOS 7 et un utilisateur non root avec des privilèges sudo. Suivez les étapes spécifiées dans ceguide 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, avecJava virtual machine (JVM) lançant une exception «Mémoire insuffisante» au démarrage.

  • OpenJDK 8 installé sur votre serveur. Pour installer cette version, suivezthese 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.

[[step-1 -—- creation-a-user-for-kafka]] == Étape 1 - Création d'un utilisateur pour Kafka

Kafka pouvant gérer les requêtes sur un réseau, vous devez créer un utilisateur dédié. Cela minimise les dommages causés à votre machine CentOS si le serveur Kafka était compromis. Nous allons créer un utilisateurkafka 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 que vous avez terminé la configuration de Kafka.

Connecté en tant qu'utilisateur sudo non root, créez un utilisateur appelékafka avec la commandeuseradd:

sudo useradd kafka -m

L'indicateur-m garantit qu'un répertoire personnel sera créé pour l'utilisateur. Ce répertoire personnel,/home/kafka, agira comme notre répertoire d'espace de travail pour l'exécution des commandes dans les sections ci-dessous.

Définissez le mot de passe à l'aide depasswd:

sudo passwd kafka

Ajoutez l'utilisateurkafka au groupewheel avec la commandeadduser, afin qu'il dispose des privilèges requis pour installer les dépendances de Kafka:

sudo usermod -aG wheel kafka

Votre utilisateurkafka est maintenant prêt. Connectez-vous à ce compte en utilisantsu:

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.

[[step-2 -—- download-and-extracting-the-kafka-binaries]] == Étape 2 - Téléchargement et extraction des binaires Kafka

Téléchargeons et extrayons les binaires Kafka dans des dossiers dédiés dans le répertoire personnel de l’utilisateurkafka.

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

mkdir ~/Downloads

Utilisezcurl pour télécharger les binaires Kafka:

curl "https://www.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 de Kafka:

mkdir ~/kafka && cd ~/kafka

Extrayez l'archive que vous avez téléchargée à l'aide de la commandetar:

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 (tel que~/kafka/kafka_2.11-2.1.1/) à l'intérieur.

Maintenant que nous avons téléchargé et extrait les fichiers binaires, nous pouvons passer à la configuration pour Kafka afin de permettre la suppression de la rubrique.

[[step-3 -—- configuration-the-kafka-server]] == Étape 3 - Configuration du serveur Kafka

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

Les options de configuration de Kafka sont spécifiées enserver.properties. Ouvrez ce fichier avecvi ou votre éditeur préféré:

vi ~/kafka/config/server.properties

Ajoutons un paramètre qui nous permettra de supprimer les sujets Kafka. Appuyez suri pour insérer du texte et ajoutez ce qui suit au bas du fichier:

~/kafka/config/server.properties

delete.topic.enable = true

Lorsque vous avez terminé, appuyez surESC pour quitter le mode d'insertion et sur:wq pour écrire les modifications dans le fichier et quitter. 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.

[[step-4 -—- creation-systemd-unit-files-and-startup-the-kafka-server]] == Étape 4 - Création de fichiers d'unité Systemd et démarrage du serveur Kafka

Dans cette section, nous allons créersystemd unit files 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, visitez le site officielZookeeper docs.

Créez le fichier d'unité pourzookeeper:

sudo vi /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] spécifie que Zookeeper nécessite un réseau et que le système de fichiers soit prêt avant de pouvoir démarrer.

La section[Service] spécifie que systemd doit utiliser les fichiers shellzookeeper-server-start.sh etzookeeper-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.

Enregistrez et fermez le fichier une fois l’édition terminée.

Ensuite, créez le fichier de service systemd pourkafka:

sudo vi /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] spécifie que ce fichier d'unité dépend dezookeeper.service. Cela garantira quezookeeper démarre automatiquement lorsque le servicekafa démarre.

La section[Service] spécifie que systemd doit utiliser les fichiers shellkafka-server-start.sh etkafka-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.

Enregistrez et fermez le fichier une fois l’édition terminée.

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 démarré correctement, vérifiez les journaux de journal pour l'unitékafka:

journalctl -u kafka

Vous devriez voir une sortie similaire à celle-ci:

OutputJul 17 18:38:59 kafka-centos systemd[1]: Started kafka.service.

Vous avez maintenant un serveur Kafka à l'écoute sur le port9092.

Bien que nous ayons démarré le servicekafka, si nous devions redémarrer notre serveur, il ne le serait pas automatiquement. Pour activerkafka 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.

[[step-5 -—- testing-the-installation]] == Étape 5 - Test de l'installation

Publions et consommons un message“Hello World” pour nous assurer que le serveur Kafka se comporte correctement. La publication de messages dans Kafka nécessite:

  • Unproducer, qui permet la publication d'enregistrements et de données dans des rubriques.

  • Unconsumer, qui lit les messages et les données des rubriques.

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

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

Vous verrez la sortie suivante:

OutputCreated topic "TutorialTopic".

Vous pouvez créer un producteur à partir de la ligne de commande en utilisant le scriptkafka-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 rubriqueTutorialTopic 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 à l'aide du scriptkafka-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 les messages deTutorialTopic. Notez l'utilisation de l'indicateur--from-beginning, 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 voirHello, World dans 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 surCTRL+C pour arrêter le script consommateur. Maintenant que nous avons testé l’installation, passons à l’installation de KafkaT.

[[step-6 -—- Installing-kafkat-optional]] == Étape 6 - Installation de KafkaT (en option)

KafkaT est un outil d'Airbnb qui vous permet d'afficher plus facilement les détails de votre cluster Kafka et d'effectuer 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 deruby-devel et des packages liés à la construction tels quemake etgcc pour pouvoir construire les autres gemmes dont il dépend. Installez-les en utilisantyum:

sudo yum install ruby ruby-devel make gcc patch

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 appelé.kafkatcfg:

vi ~/.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"
}

Enregistrez et fermez le fichier une fois l’édition terminée.

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 verrezTutorialTopic, ainsi que__consumer_offsets, une rubrique interne utilisée 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 à sesGitHub repository.

[[step-7 -—- setting-up-a-multi-node-cluster-optional]] == Étape 7 - Configuration d'un cluster à multi-nœuds (facultatif)

Si vous souhaitez créer un cluster multi-courtiers utilisant plus de machines CentOS 7, vous devez répéter les étapes 1, 4 et 5 sur chacune des nouvelles machines. En outre, vous devez apporter les modifications suivantes dans le fichierserver.properties pour chacun:

  • La valeur de la propriétébroker.id doit être modifiée de manière à ê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 de Zookeeper et suit le format<HOSTNAME/IP_ADDRESS>:<PORT>. Par exemple,"203.0.113.0:2181","203.0.113.1: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 ZooKeeper.

[[step-8 -—- restricting-the-kafka-user]] == Étape 8 - Restreindre l'utilisateur Kafka

Maintenant que toutes les installations sont terminées, vous pouvez supprimer les privilèges d’administrateur de l’utilisateurkafka. 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 démarré ce didacticiel, tapez simplementexit.

Supprimez l'utilisateurkafka du groupe sudo:

sudo gpasswd -d kafka wheel

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

sudo passwd kafka -l

À ce stade, seulroot ou un utilisateur desudo peut se connecter en tant quekafka en tapant la commande suivante:

sudo su - kafka

À l'avenir, si vous souhaitez le déverrouiller, utilisezpasswd avec l'option-u:

sudo passwd kafka -u

Vous avez maintenant réussi à restreindre les privilèges d'administrateur de l'utilisateurkafka.

Conclusion

Apache Kafka s'exécute maintenant de manière sécurisée sur votre serveur CentOS. Vous pouvez l'utiliser dans vos projets en créant des producteurs et des consommateurs Kafka à l'aide deKafka clients, qui sont disponibles pour la plupart des langages de programmation. Pour en savoir plus sur Kafka, vous pouvez également consulter sesdocumentation.