Bonnes pratiques pour gérer les problèmes de déséquilibre des partitions Kafka
Diagnostiquer le déséquilibre des partitions Kafka, corriger les clés asymétriques, rééquilibrer les réplicas et surveiller le retard et la charge des courtiers.
Bonnes pratiques pour gérer les problèmes de déséquilibre des partitions Kafka
La force d'Apache Kafka réside dans sa nature distribuée, obtenue grâce au partitionnement des sujets. Les partitions permettent de distribuer les données sur plusieurs courtiers, permettant une consommation parallèle et un débit élevé. Cependant, si ces partitions ne sont pas réparties uniformément ou si des modèles de charge inégaux apparaissent au fil du temps, cela conduit à un déséquilibre des partitions. Ce déséquilibre est un problème opérationnel critique qui peut gravement dégrader les performances, augmenter le retard des consommateurs sur les partitions surchargées et compromettre les avantages de la mise à l'échelle de Kafka.
Ce guide explique les deux types de déséquilibre que vous devez distinguer : le placement inégal des partitions entre les courtiers et le trafic inégal entre les partitions. Les correctifs sont différents, donc le diagnostic est important.
Comprendre le déséquilibre des partitions Kafka
Le déséquilibre des partitions se produit lorsque la charge de travail (volume de données, taux de messages ou charge des consommateurs) n'est pas répartie uniformément sur toutes les partitions disponibles d'un sujet, ou lorsque les partitions elles-mêmes ne sont pas physiquement réparties uniformément sur le cluster de courtiers.
Causes du déséquilibre
Plusieurs facteurs peuvent entraîner ou aggraver le déséquilibre des partitions :
- Mauvaise configuration initiale de la création du sujet : Créer un sujet avec un nombre de partitions inadéquat par rapport au parallélisme souhaité ou aux courtiers disponibles.
- Distribution inégale des clés (producteurs asymétriques) : Lorsque les producteurs utilisent une clé qui entraîne un nombre disproportionné de messages mappés sur une seule partition (asymétrie de clé). Par exemple, si un identifiant client ou un identifiant spécifique est beaucoup plus actif que les autres.
- Comportement du groupe de consommateurs : Dans un groupe de consommateurs, si un consommateur tombe en panne ou est redémarré, les partitions qui lui étaient précédemment attribuées sont redistribuées. Si la réaffectation est lente ou si le nombre de partitions est élevé, un consommateur peut temporairement gérer beaucoup plus de partitions que les autres.
- Pannes et récupération des courtiers : Lors de pannes ou de redémarrages de courtiers, les partitions hébergées sur ces courtiers doivent être déplacées ou réaffectées, ce qui fausse temporairement la charge jusqu'à ce que le cluster se rétablisse complètement.
Impact sur les performances du système
Les conséquences d'un déséquilibre sévère des partitions sont importantes :
- Goulot d'étranglement du débit : Le courtier hébergeant les partitions lourdement chargées devient le goulot d'étranglement, limitant le débit global de l'ensemble du sujet, quel que soit le niveau d'inactivité des autres courtiers.
- Augmentation du retard des consommateurs : Les consommateurs affectés aux partitions surchargées auront du mal à suivre le rythme, ce qui entraînera une latence de bout en bout inacceptable.
- Saturation des ressources : Utilisation élevée des E/S, du processeur ou du réseau sur des courtiers spécifiques, augmentant le risque d'instabilité.
Bonnes pratiques pour la configuration initiale du sujet
La meilleure défense contre le déséquilibre est une configuration initiale proactive et éclairée.
1. Choisir le nombre optimal de partitions
Le nombre de partitions est sans doute la décision la plus cruciale. Il dicte directement le parallélisme maximal pour les consommateurs et la distribution entre les courtiers.
- Règle empirique : Choisissez un nombre de partitions au moins aussi élevé que le nombre maximal de consommateurs que vous prévoyez dans un groupe de consommateurs. Les multiples des nombres de consommateurs courants peuvent aider à maintenir des affectations équitables, mais chaque groupe de consommateurs est équilibré indépendamment.
- Capacité du courtier : Le nombre de partitions ne doit pas submerger le cluster. Chaque partition consomme des ressources (mémoire et espace disque) sur le courtier qui lui est attribué. Visez moins de partitions par courtier si la capacité d'E/S est une contrainte.
- Croissance future : Il est nettement plus facile de passer à l'échelle horizontale (ajouter des courtiers) que de modifier le nombre de partitions en cours de route pour les sujets à haut débit. Bien que l'augmentation du nombre de partitions soit prise en charge (via
kafka-topics.sh --alter), elle ne rééquilibre pas automatiquement les partitions existantes.
2. Sélection stratégique des clés pour les producteurs
Pour éviter l'asymétrie des clés, les producteurs doivent sélectionner des clés qui génèrent une distribution uniforme des messages sur toutes les partitions.
- Évitez les clés chaudes : Identifiez les clés qui produisent une part disproportionnée de messages. Une clé à haute cardinalité telle que
user_idse distribue généralement bien, mais un utilisateur ou un locataire extrêmement actif peut toujours créer une partition chaude. - Utilisez le caractère aléatoire lorsque cela est approprié : Si un ordre strict dans l'ensemble du jeu de données n'est pas requis, utilisez une clé randomisée ou hachée pour forcer une meilleure distribution entre les partitions.
# Exemple : L'utilisation d'un ID cohérent et à haute cardinalité garantit une distribution uniforme
# Mauvais : Clé de tout par 'SYSTEM_WIDE_CONFIG'
# Bon : Clé par 'user_id' ou 'session_id' si ceux-ci sont répartis uniformément en volume
Stratégies concrètes pour rééquilibrer les sujets existants
Une fois le déséquilibre survenu, des actions administratives spécifiques sont nécessaires pour rétablir l'équilibre.
3. Tirer parti du rééquilibrage de l'affectation des partitions (niveau consommateur)
Lorsque les groupes de consommateurs se rééquilibrent (en raison de l'arrivée/départ d'un consommateur), Kafka tente de répartir les partitions uniformément entre les membres actifs au sein de ce groupe de consommateurs.
- Ajustement de la configuration : Assurez-vous que les consommateurs sont correctement configurés, en particulier en ce qui concerne les délais d'expiration de session et les pulsations, afin d'éviter les rééquilibrages inutiles et perturbateurs.
- Affectation sticky des partitions : Envisagez l'assignateur sticky ou coopératif sticky lorsque votre version client le prend en charge. Ces assignateurs tentent de maintenir la propriété des partitions stable lorsque les consommateurs rejoignent ou quittent le groupe, réduisant ainsi les mouvements inutiles.
4. Réaffectation des courtiers pour l'équilibrage physique
Si le problème est que les partitions sont physiquement situées de manière inégale entre les courtiers (par exemple, après avoir ajouté ou supprimé un courtier), vous devez utiliser l'outil kafka-reassign-partitions.sh.
Ce processus déplace l'ensemble des réplicas de données du courtier actuel vers un nouveau courtier, rééquilibrant ainsi la charge de stockage physique.
Étapes pour une réaffectation manuelle (exemple conceptuel) :
- Générer le plan actuel : Déterminez les affectations de partition actuelles pour le sujet.
- Créer la liste de réplicas préférée : Définissez l'affectation équilibrée souhaitée (par exemple, déplacer les partitions du courtier A surchargé vers le courtier B sous-utilisé).
- Exécuter le déplacement : Exécutez l'outil de réaffectation avec le plan JSON généré.
- Vérifier l'achèvement : Surveillez l'outil de réaffectation jusqu'à ce que tous les réplicas soient déplacés avec succès vers les courtiers cibles.
Avertissement : La réaffectation des partitions est une opération intensive en E/S et en réseau. Effectuez ces actions pendant les fenêtres de maintenance ou les périodes de faible trafic, car le trafic de réplication peut temporairement impacter les performances des clients.
5. Augmenter le nombre de partitions (passage à l'échelle)
Si le nombre de partitions est vraiment trop faible pour gérer la charge actuelle (entraînant un retard élevé des consommateurs même avec une distribution parfaite), vous devez augmenter le nombre de partitions.
Étapes pour augmenter les partitions en toute sécurité :
- Déterminer le nouveau nombre : Décidez du nouveau nombre total de partitions (par exemple, de 12 à 24).
- Modifier le sujet : Utilisez l'outil
kafka-topics.shpour augmenter le nombre. Les partitions nouvellement créées seront attribuées aux courtiers en fonction de la liste actuelle des courtiers.
kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic my_topic --partitions 24
Rééquilibrer les groupes de consommateurs : Pour que le changement prenne effet dans les groupes de consommateurs, le groupe doit déclencher un rééquilibrage (généralement en redémarrant les consommateurs ou en attendant les délais d'expiration). Les nouvelles partitions seront attribuées aux consommateurs existants, répartissant ainsi mieux la charge.
Réaffectation des courtiers (étape cruciale de suivi) : L'augmentation des partitions ne fait que répartir la nouvelle charge. Pour équilibrer la charge existante sur les nouveaux emplacements de courtiers disponibles, vous devez suivre avec un plan de réaffectation des courtiers (étape 4) pour déplacer les partitions d'origine vers la nouvelle topologie de courtiers.
Surveillance et prévention
Une surveillance continue est essentielle pour détecter le déséquilibre avant qu'il n'entraîne une dégradation du service.
Métriques clés à suivre
Utilisez des outils de surveillance (comme Prometheus/Grafana, ou les outils Kafka intégrés) pour suivre ces métriques :
- Retard du consommateur par partition : L'indicateur le plus direct. Si le retard varie considérablement entre les partitions du même groupe de consommateurs, un déséquilibre est présent.
- Utilisation des E/S et du réseau du courtier : Une variance élevée de l'utilisation entre les courtiers hébergeant le même sujet indique une charge de partition asymétrique.
- Nombre de partitions au niveau du courtier : Assurez-vous que le nombre de partitions hébergées sur chaque courtier reste relativement similaire au fil du temps, en particulier après avoir augmenté ou diminué le nombre de courtiers.
Bonne pratique : vérifications régulières de l'état
Examinez la distribution des partitions après avoir ajouté des courtiers, retiré des courtiers ou modifié les clés des producteurs. Si un locataire, un appareil ou un client commence à dominer un sujet, corrigez la stratégie de clé ou divisez cette charge de travail avant que la partition surchargée ne devienne votre plafond de débit.