Mise en place d'un cluster Kafka

Introduction

Apache Kafka est un système de messagerie distribué à haute performence, réplicable et extensible. Il est conçu pour gérer d'importants flux de données en temps réel, garantissant la cohérence et la persistance des messages. Kafka trouve des applications dans le traitement de données volumétriques, la transmission d'événements en temps réel et l'architecture de systèmes distribués. Ce guide détaille la procédure de déploiement d'un cluster Kafka.

Présentation de Kafka

Kafka est une plateforme de streaming distribuée qui fonctionne comme un système de messagerique. Sa caractéristique principale réside dans sa capacité à traiter efficacement d'énormes volumes de données en temps réel, en se basant sur une coordination assurée par Apache ZooKeeper.

Cas d'utilisation typiques

Traitement de données en temps réel

Dans les environnements web, Kafka est employé pour ingérer et traiter instantanément les actions des utilisateurs (navigation, clics, recherches). Ces données alimentent ensuite des systèmes d'analyse ou de recommandation en temps réel.

Agrégation et analyse de logs

Les serveurs d'entreprise génèrent d'importants fichiers journaux. Kafka sert de ppieline centralisé pour collecter ces logs depuis diverses sources, avant de les distribuer à des outils d'analyse dédiés comme Elasticsearch, facilitant ainsi le diagnostic de pannes et la surveillance des performances.

Architectures pilotées par les événements

Dans des domaines tels que l'IoT ou la finance, Kafka agit comme bus d'événements. Lorsqu'un événement significatif se produit, il est publié danns un topic Kafka, puis consommé par les applications concernées pour déclencher des actions correspondantes (alertes, mises à jour de données).

Procédure d'installation du cluster

1. Vérification de l'environnement système

# Vérification du système d'exploitation
$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

# Vérification de la version de Java
$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

2. Planification de l'infrastructure

No. Adresse IP Nom d'hôte Services à déployer
1 192.168.40.129 nœud-principal Kafka, ZooKeeper, JDK
2 192.168.40.130 nœud-secondaire-1 Kafka, ZooKeeper, JDK
3 192.168.40.131 nœud-secondaire-2 Kafka, ZooKeeper, JDK

3. Choix des versions des composants

Composant Version
JDK 1.8.0_161
ZooKeeper Intégré à la distribution Kafka
Kafka kafka_2.11-0.10.2.1

4. Installation préalable de JDK

Veuillez vous référer à la procédure standard d'installation de Java 8 sur votre distribution Linux.

5. Déploiement de Kafka

Téléchargez l'archive d'installation de Kafka et transférez-la sur tous les nœuds du cluster.

5.1 Configuration sur le nœud principal

Décompressez l'archive et créez un lien symbolique pour faciliter la gestion des versions.

# Création d'un lien symbolique vers l'installation
$ ln -sfn /data/soft/kafka_2.11-0.10.2.1 ./kafka-active

# Édition du fichier server.properties
$ vim /data/soft/kafka-active/config/server.properties
# Contenu modifié:
broker.id=0
log.dirs=/var/data/kafka-journaux
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://192.168.40.129:9092
zookeeper.connect=192.168.40.129:2181,192.168.40.130:2181,192.168.40.131:2181

# Configuration de ZooKeeper
$ vim /data/soft/kafka-active/config/zookeeper.properties
dataDir=/var/data/zookeeper-donnees

# Création des répertoires de données
$ mkdir -p /var/data/zookeeper-donnees /var/data/kafka-journaux

# Distribution des fichiers vers les autres nœuds
$ scp -r /data/soft/kafka_2.11-0.10.2.1 root@nœud-secondaire-1:/data/soft/
$ scp -r /data/soft/kafka_2.11-0.10.2.1 root@nœud-secondaire-2:/data/soft/

5.2 Configuration sur le premier nœud secondaire

# Création du lien symbolique
$ ln -sfn /data/soft/kafka_2.11-0.10.2.1 ./kafka-active

# Modification de la configuration Kafka
$ vim /data/soft/kafka-active/config/server.properties
# Paramètres spécifiques:
broker.id=1
advertised.listeners=PLAINTEXT://192.168.40.130:9092

# Création des répertoires nécessaires
$ mkdir -p /var/data/zookeeper-donnees /var/data/kafka-journaux

5.3 Configuration sur le second nœud secondaire

# Création du lien symbolique
$ ln -sfn /data/soft/kafka_2.11-0.10.2.1 ./kafka-active

# Modification de la configuration Kafka
$ vim /data/soft/kafka-active/config/server.properties
# Paramètres spécifiques:
broker.id=2
advertised.listeners=PLAINTEXT://192.168.40.131:9092

# Création des répertoires nécessaires
$ mkdir -p /var/data/zookeeper-donnees /var/data/kafka-journaux

5.4 Configuration des variables d'environnement

À exécuter sur chaque nœud du cluster :

$ cat >> /etc/profile <<eof eof="" export="" kafka_root="/data/soft/kafka-active" path="\$PATH:\$KAFKA_ROOT/bin" source=""></eof>

5.5 Démarrage du cluster

Ordre de démarrage : Lancer ZooKeeper avant Kafka.
Ordre d'arrêt : Arrêter Kafka avant ZooKeeper.

# Démarrage des instances ZooKeeper (sur chaque nœud)
$ zookeeper-server-start.sh -daemon /data/soft/kafka-active/config/zookeeper.properties

# Démarrage des brokers Kafka (sur chaque nœud)
$ kafka-server-start.sh -daemon /data/soft/kafka-active/config/server.properties

# Vérification des ports en écoute
$ netstat -tlnp | grep -E '9092|2181'

# Création d'un topic de test
$ kafka-topics.sh --zookeeper 192.168.40.129:2181 --create \
  --topic test_stream --partitions 2 --replication-factor 2

# Inspection des détails du topic
$ kafka-topics.sh --describe --zookeeper 192.168.40.129:2181 --topic test_stream

5.6 Script de gestion du cluster

#!/bin/bash
# Fichier: cluster_manager.sh

NODES=("nœud-principal" "nœud-secondaire-1" "nœud-secondaire-2")
KAFKA_HOME="/data/soft/kafka-active"

start_cluster() {
    for node in "${NODES[@]}"; do
        echo "Démarrage de ZooKeeper sur $node"
        ssh "$node" "$KAFKA_HOME/bin/zookeeper-server-start.sh -daemon $KAFKA_HOME/config/zookeeper.properties"
        sleep 2
    done
    sleep 10
    for node in "${NODES[@]}"; do
        echo "Démarrage de Kafka sur $node"
        ssh "$node" "$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties"
        sleep 2
    done
}

stop_cluster() {
    for node in "${NODES[@]}"; do
        echo "Arrêt de Kafka sur $node"
        ssh "$node" "$KAFKA_HOME/bin/kafka-server-stop.sh"
        sleep 5
    done
    sleep 10
    for node in "${NODES[@]}"; do
        echo "Arrêt de ZooKeeper sur $node"
        ssh "$node" "$KAFKA_HOME/bin/zookeeper-server-stop.sh"
        sleep 2
    done
}

case "$1" in
    start)   start_cluster ;;
    stop)    stop_cluster ;;
    restart) stop_cluster; start_cluster ;;
    *)       echo "Usage: $0 {start|stop|restart}" ;;
esac

Après avoir rendu le script exécutable (chmod +x cluster_manager.sh), vous pouvez lancer :

$ ./cluster_manager.sh start
$ netstat -tlnp | grep -E '9092|2181'

Étiquettes: Kafka ZooKeeper Cluster messaging-system distributed-computing

Publié le 17 juin à 00h12