Apache Kafka Un système distribué de messagerie hautement performant Charly CLAIRMONT CTO ALTIC http://altic.org [email protected] @egwada Petite bio Co-fondateur Altic 10 ans maintenant Un des mes premiers jobs : « mettre de l'open source à tous les étages » dans l'entreprise ! Mes technos (orientées décisionnelles mais pas que) Altic @Altic_Buzz Métier Informatique Décisionnelle Intégration de données Valeurs – Innovations – Open Source Une maîtrise de toute la chaîne de valeur du Big Data Apache Kafka Un système distribué de messagerie hautement performant tolérant aux panes Agenda Introduction Apache Kafka, qu'est ce que c'est ? Concepts élémentaires Topics, partitions, replicas, offsets Producteurs, brokers, consommateurs Écosystème Agenda Introduction Apache Kafka, qu'est ce que c'est ? Introduction Apache Kafka, qu'est-ce que c'est ? ● Distribué, très haut débit, système de messagerie publication / abonnement (pub-sub) – ● Rapide, Robuste, Scalable, Durable Principaux cas d'utilisation – Agrégation de logs, traitement temps réel, monitoring, files d'attente ● Développé à l'origine chez LinkedIn ● Écrit en Scala (un peu de Java) ● TLP Apache depuis 2012 ● 9 core commiteurs, en eviron 20 contributeurs ● http://kafka.apache.org Introduction Comparaison avec d'autres brokers Traditionnels: JMS, xxxMQ/AMQP Nouvelle génération: Kestrel, Scribe, Flume, Kafka Messagerie file d'attente Débit faible, faible latence RabbitMQ JMS ActiveMQ Qpid 8 Agrégateur de logs Débit très fort, forte latence Flume Kafka Hedwig Scribe Batch jobs Kestrel Introduction Performance chez LinkedIn ● Statistiques sur l'un des importants clusters Apache Kafka (aux heures de pointe): – 15 brokers – 15 500 partitions (réplication facteur 2) – En entrée – 400 000 msg / sec. ● 70 Mo / sec. En sortie ● ● 400 Mo / sec. Introduction Adoption de Kafka & Cas d'utilisation ● LinkedIn – flux d'activité, suivi indicateurs opérationnels, bus de données – 400 nodes, 18k topics, 220 milliards msg/day (pic 3.2 millions msg/s), Mai 2014 ● OVH : Anti-DDOS ● Netflix : Suivi temps réel, traitement temps réel ● Twitter : Composant de leur architecture temps réel, couplée à Storm ● Spotify : Traitement de log (de 4h à 10s), Hadoop ● Loggly : Collecte et traitement de log ● Mozilla : Gestion de métrique ● Airbnb, Cisco, Gnip, InfoChimps, Ooyala, Square, Uber, … Introduction Pourquoi Apache Kafka ? On va imaginer que vous collectez vos logs! Introduction Pourquoi Apache Kafka ? Jusqu'ici tout va bien ! Introduction Pourquoi Apache Kafka ? Là ça va encore ! Introduction Pourquoi Apache Kafka ? Mais là ? Diriez-vous la même chose ? Introduction Pourquoi Apache Kafka ? Je n'en suis pas si sûr ! Introduction Pourquoi Apache Kafka ? Un bel exemple celui de Spotify. https://www.jfokus.se/jfokus14/preso/Reliable­real­time­processing­with­Kafka­and­Storm.pdf (Feb 2014) Introduction Pourquoi Apache Kafka est-il si rapide ? ● Écritures rapides: – ● Bien que Kafka persiste toutes les données sur le disque, toutes les écritures vont essentiellement « page cache » de l'OS, soit la RAM. Lectures rapides: – Très efficace pour transférer des données à partir du « page cache » vers une socket réseau – Linux: sendfile() appel système ● « Zéro-copy » ● Combinaison des deux = rapide Kafka! ● Compression de bout en bout Agenda Introduction c'est quoi Apache Kafka Concepts élémentaires Topics, partitions, offsets, réplicas producteur, brokers ,consommateurs, Ecosystème Concepts élémentaires Vue Globale ● ● Les producteurs publient des données vers les brockers. Les consommateurs s'abonnent et récupèrent les données depuis les brockers. ● Tous les services sont distribués ● Les données – Les données sont stockées dans des topics. – Les topics sont divisés en partitions, et sont répliqués. Concepts élémentaires Vue Globale « broker » = serveur Partitions : distribuées et répliquées sur les brokers (donc les serveurs) topic = « zerg.hydra » Concepts élémentaires Topics Topic: correspond au nom du flux sur lequel les messages vont être publiés • Par exemple : “zerg.hydra” Kafka élague depuis la “tête” en se basant sur l'âge ou la taille maximale or la « clé » Producteur A1 Kafka topic … anciens messages Nouv. Producteur A2 … Producteur An Nouveaux messages Les producteurs ajoutent toujours à la fin du de la file (penser à l'ajout dans un fichier) Broker(s) Concepts élémentaires Topics Consommateur groupe C1 Les consommateurs emploient un « pointeur de lecture » ( “offset pointer”) pour tracer et contrôler là où il en est (et décide du rythme de consommation) Consommateur groupe C2 Producteur A1 Kafka topic … anciens messages Nouv. Nouveaux messages Broker(s) Producteur A2 … Producteur An Concepts élémentaires Message Protocole léger Traitement des messages par lot (Producteur & Consommateur) Compression de bout en bout Message lle rsion ksum ad i a t Ve ec Paylo h C Concepts élémentaires Partitions Les partitions – Ordonnées – Séquence immuable – Le nombre de partitions détermine le nombre maximum de (groupes de) consommateurs Concepts élémentaires partition offsets ● A chaque message est attribué un « id » unique et trié appelé « offset ». Les consommateurs déplacent leur pointeur via la combinaison (offset, partition, topic) Consommateur groupe 1 Concepts élémentaires réplicas ● Uniformément distribués ● « sauvegarde » des partitions ● ● Existent uniquement pour éviter les pertes de données Si numReplicas == 3 alors 2 brokers peuvent tomber logs logs logs logs topic1-part1 topic1-part2 topic2-part1 topic2-part2 topic2-part2 topic1-part1 topic1-part2 topic2-part1 topic2-part1 topic2-part2 topic1-part1 topic1-part2 broker 1 broker 2 broker 3 broker 4 Concepts élémentaires réplicas Flux de réplication Producteur 2 1 Accusé de réception 2 leader follower follower 3 4 Consommateur commit topic1-part1 topic1-part1 topic1-part1 broker 1 broker 2 broker 3 Type de « Récepton Accusé » par le Producteur ? Latence Durabilité en cas de faille Pas d'accusé de récepton Pas de retard réseau qlq données perdues Attente de l'électon du leader 1 aller-retour du réseau Peu de données perdues Attente de validaton (commit) 2 allers-retours du réseau Pas de perte de données Seules les donnés validées sont présentées au consommateur Concepts élémentaires réplicas Flux de réplication Producteur leader follower topic1-part1 Producteur topic1-part1 leader topic1-part1 follower topic2-part1 follower broker 1 follower follower topic2-part1 follower Producteur topic2-part1 leader topic3-part1 topic3-part1 topic3-part1 broker 2 broker 3 broker 4 http://kafka.apache.org/documentation.html#replication Concepts élémentaires Producteurs Publier des messages dans Kafka – C'est assez simple – Vous pouvez aussi directement agréger vos traces Log4J – Liste complète des exemples https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+Produce r+Example Concepts élémentaires Producteurs API – ProducerType (sync/async) – CompressionCodec (none/snappy/gzip) – BatchSize – EnqueueSize/Time – Encoder/Serializer – Partitioner – #Retries – MaxMessageSize – … Concepts élémentaires Consommateurs Possibilité d'utiliser un consommateur pour publier dans Kafka Les consommateurs sont responsables de vérifier où ils en sont dans leur lecture Il y a une API simple, et une autre bien plus performante – High-level (consumer group, auto-commit) – Low-level (simple consumer, manual commit) Concepts élémentaires Consommateurs API Agenda Introduction Apache Kafka, qu'est-ce que c'est ? Concepts élémentaires Topics, partitions, replicas, offsets Producteurs, brokers, consommateurs Écosystème Écosystème Intégration Producteurs Consommateur • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • Java (in standard dist) Scala (in standard dist) Log4j (in standard dist) Logback: logback-kafka Udp-kafka-bridge Python: kafka-python Python: pykafka Python: samsa Python: pykafkap Python: brod Go: Sarama Go: kafka.go C: librdkafka C/C++: libkafka Clojure: clj-kafka Clojure: kafka-clj Ruby: Poseidon Ruby: kafka-rb Ruby: em-kafka PHP: kafka-php(1) PHP: kafka-php(2) PHP: log4php Node.js: Prozess Node.js: node-kafka Node.js: franz-kafka Erlang: erlkafka Java (in standard dist) Scala (in standard dist) Python: kafka-python Python: samsa Python: brod Go: Sarama Go: nuance Go: kafka.go C/C++: libkafka Clojure: clj-kafka Clojure: kafka-clj Ruby: Poseidon Ruby: kafka-rb Ruby: Kafkaesque Jruby::Kafka PHP: kafka-php(1) PHP: kafka-php(2) Node.js: Prozess Node.js: node-kafka Node.js: franz-kafka Erlang: erlkafka Erlang: kafka-erlang Écosystème Intégration Intégratons connues Stream Processing Storm - A stream-processing framework. Samza - A YARN-based stream processing framework Spark Metrics Mozilla Metrics Service - A Kafka and Protocol Bufers based metrics and logging system Ganglia Integration Hadoop Integraton Camus - LinkedIn's Kafka=>HDFS pipeline. This one is used for all data at LinkedIn, and works great. Kafka Hadoop Loader A diferent take on Hadoop loading functionality from what is included in the main distribution. Packing and Deployment RPM packaging Debian packaginghtps://github.com/tomdz/kafka-deb-packagi ng Puppet integration Dropwizard packaging AWS Integraton Automated AWS deployment Kafka->S3 Mirroring Logging klogd - A python syslog publisher klogd2 - A java syslog publisher Tail2Kafka - A simple log tailing utility Fluentd plugin - Integration with Fluentd Flume Kafka Plugin - Integration with Flume Remote log viewer LogStash integration - Integration with LogStash and Fluentd Official logstash integration Misc. Kafka Mirror - An alternative to the built-in mirroring tool Ruby Demo App Apache Camel Integration Infobright integration Écosystème Intégration Kafka + X pour le traitement des données – Storm, Spark, Samza – Akka Actors, Java multi-thread – Camus : de Kafka à Hadoop Producer Producer Producer Process1 Kafka topic1 Process1 Process2 Kafka topic2 Process1 Process2 Process2 System1 System2 Écosystème Architecture Matérielle ● ● ● ● Machines uniquement dédiées à Kafka, rien d'autre – 1 instance d'un broker Kafka par machine – 2 x 4-core Intel Xeon (ou plus) – 64 GB RAM (up from 24 GB) Seuls 4 GB sont utilisés par le broker Kafka, les 60 GB restants pour page cache Disques – RAID10 avec 14 spindles – Plus il y a de spindles, plus le débit du disque est important – 8x SATA drives (7200rpm) JBOD Réseau – 1 GigE de préférence A défaut d'un bon livre, une très bonne ressource pour débuter Apache Kafka 0.8 basic training http://www.slideshare.net/miguno/apache­kafka­08­basic­training­verisign Questons Merci ! Charly CLAIRMONT CTO ALTIC http://altic.org [email protected] @egwada @ALtic_Buzz