• Home
  • About
    • Ahmed DAMMAK photo

      Ahmed DAMMAK

      Full Stack Developer

    • Learn More
    • Twitter
    • LinkedIn
    • Github
  • All Posts
  • All Tags
  • Projects

Kafka: carte des pièges à l’usage des développeurs et des ops

22 Apr 2022

Reading time ~5 minutes

Kafka: carte des pièges à l’usage des développeurs et des ops

Présentation

Talk de Emmanuel Bernard @emmanuelbernard et @clementplop

Notes

La présentation est orientée dev & OPS. Les différents aspets sont à chaque fois présenté d’un point de vue de dev + mise en production, et de point de vue process de bug-investigation.

Records :

  • clé/valuer simple (Il est possible d’avoir des clé / valuer nulle)
  • Topic
  • écrit sur des partitions.

Les partitions sont des logs append-only et c’est répliqué.

Un record aura 2 nouveau champs une fois enregistré

  • Partition
  • Offset

On ne laisse pas la main pour créer des topics en prod.

Les records sont accumulés dans des buffers. On écrit a chaque fois un buffer de record

La méthode send est bloquante

Le partitionneur :

  • Si on ne met pas, on met un hash
  • On n’a pas le meme partitionneur en fonction du langage
  • La clé est sérialisée avant d’aller au partitionneur

Si on ne connais pas le leader, le provider sera bloqué

Il y a le sticky partionning si on met des clés nulles

Le partionneur sur se base sur la clé (plain & serialisée) et la valeur (valeur & valeur serialisé)

Il faut arriver à balancer les partitions.

Installation :

Kafka broker Meta donné : Zookeeper / or Kafka controller

Une fois installé; il faut

  • maj les versions
  • Monté en charge (scale)
  • Sécure (Secure
  • Blancer (Balance)

Déploiemnt de Kafka sur K8S + strimzi

KubeOps / GitOps : L’intetion est exprimée via du YML et cette intention est par la suite déployé

L’opérateur fait en sorte que les fichiers d’intention & les yml sont synchronisés.

Les autres notions :

  • Kafka connector
  • Kafka miroir maker
  • Kafka bridge
  • Kafka rebalance (Cruise control)
  • Kafka topics
  • Kafka users

Kafka exporter = expose des métriques supplémentaires pour Promoteus

Ecriture du record

Send -> batching -> await sent -> retries

ACKS :

Le leader de la partition confirme : 3 format son proposés :

  • « 0 » : Fire & Forget (rarement utulisé)
  • « 1 » leader seulement
  • « ALL » Ecrire sur le leader & les replicats

Le delivery.timout.ms est le timeout max pour toute l’opération

On peut mettre des toxics pour simuler des contraintes de prod avec le fwk Strimzi

Kafka producers fait des retry si on a des erreurs réseaux

Ordering :

Les reducers peuvent écrire en concurrence sur des partitions séparées. Si on a des retry, on peut casser l’ordre.

Il faut avoir le broker & Kafka à des versions cohérentes.

Kafka stocke les donnée et garantie la durabilité Minsync = réplication factor - 1

Kafka is stateful : la synchronisation peut mettre du temps

Node drain : enlever tous les process qui tournent sur ce node

La facon propre :

  • on prend un repli factor 3
  • Min sync = 2
  • Pour enlever un noeud, on coordonne les noeuds

Les consumers

Le consumer poll pour récupérer les records : Il récupère les batch de record (500 record à la fois) Un consumer appartient à un consumer group

Les records seront poll 1 seule fois par consumer group

1 partition ne peut pas être consommée par des consumers du meme groupe

Il faut informer le broker : commit la dernière positions qu’on a process correctement + 1

Il existe des topics compactés avec les dernières versions de chaque topic qui ont été lues (pour savoir a partir de quelle position il faut lire)

La méthode poll fait tout

Il faut appelé poll fréquemment, sinon le coordinateur risque de virer le noeud

Le process de poll est bloquant

Si le process prend bq de temps, il faut réduire la taille des batchs

Rule 1 : faire des poll fréquemment

On peut faire des auto-commit pour le synchrone, sinon on peut perdre des choses

Rule 2 : Faire des commit synchrone

Rule 1 & 2 ne sont pas compatibles !

Si on ne fait pas les commits, on risque de tout refaire en cas de pet

Préférer la gestion des commit que les auto-commit

Rule : ne pas faire un commit après chaque poll

What is a working Kafka ?

Les clients peuvent envoyer/lire des messages. Penser au service level objective : la limite du cluster Objectif de l’équipe qui maintient Kafka

SLO : application canary (Strimzi canary)

  • Utilisent le réseau externes
  • Utilisent le meme cluster en tapant les différents broker / partition
  • Envoie les élément d’information dans les éléments de mesure (pour le suivi)

L’offset management

3 manières de commit : Dans le Kafka pulled thread (Topic __cosumer_offset) On met une rétention de 1D ou 1 W

Reset Strategy : earliest (position 0) vs Latest (LAtest est le défaut)

On peut aussi gérer mes commit dans des BDD

Reactive messaging

FWK de Quarkus pour l’event driven micro service qui vont poll /ecrire dans Kafka

Méthode pour bridge HTTP & Kafka

Poison pill

Le problème des application Kafka est la poison pill : Le message qui ne peut pas être process

Failure management

Appliquer une NACK strategy

  • Fail
  • Ignore
  • DLQ : Dead Letter Queue

On peut faire un retry de processus

Alerts

  • Les métriques les plus utiles :
  • est ce que je suis alerté
  • Les mesures du SLO
  • Le Kafka est up ?

Actions : composant prometheus Les composants Les logs des pods …

Alerting : XOR 1 => des qu’on arrête de recevoir les alertes(motif), alors, on lève une alerte

Il faut construire des alertes pour éviter d’avoir Kafka down.

Rebalance

Il y a 3 protocole de rebalance La partition est l’unité de parallélisme

Le rebalance est un protocole qui permet de réassigner les partitions quand un noeud arrive/part du groupe

2 protocoles

  • group member ship broker
  • Clients

Join group : find coordinator / join group C’est le leader du groupe qui va décider qui prend quoi .

La command sync group avec les assignments

Freeze : entre joinGroup & SynchGroup pas de poll

Tradeoff entre disponibilité & tolérance aux fautes

Incremental cooperative rebalancing

Alerts not enough copies

Il ne faut pas avoir un disque plein.

Voir blog : stremzi.io

Si besoin de fix broker mal balancé, on peut utiliser l’outil CruiseControl.

Pour la sécurité, les tokens sont gérés par identity openshift

Conclusion

Il est intéressant de gérer son Kafka Il faut prendre le control de ses données Interface user par RedHat

Check : <red-hat.com/kafka>



Devoxx2022