tag:linuxfr.org,2005:/tags/fuse_kafka/publicLinuxFr.org : les contenus étiquetés avec « fuse_kafka »2014-12-05T10:24:05+01:00/favicon.pngtag:linuxfr.org,2005:Diary/354412014-12-02T21:19:02+01:002014-12-02T21:19:02+01:00présentation de fuse_kafka, un agent de logging pour kafka fondé sur FUSELicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Cher journal,</p>
<p>Je voudrais te présenter le logiciel que je développe en ce moment, à savoir <a href="https://github.com/yazgoo/fuse_kafka">fuse_kafka</a>.<br>
Il s'agit d'un agent de logging: il a pour but de permettre la centralisation de logs hétérogènes.<br>
Il se fonde sur FUSE pour récupérer les écritures dans des fichiers dans des répertoires surveillés<br>
et envoyer ces dernières dans la file de message kafka, dans un format fondé sur celui du système de gestion de log logstash.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f79617a676f6f2f667573655f6b61666b612f6d61737465722f67726170686963732f667573655f6b61666b615f6c6f676f5f736d616c6c2e706e67/fuse_kafka_logo_small.png" alt="fuse kafka" title="Source : https://raw.githubusercontent.com/yazgoo/fuse_kafka/master/graphics/fuse_kafka_logo_small.png"></p>
<h2 id="démo">Démo</h2>
<p>Voici une session terminal (<a href="http://0xcc.net/ttyrec/index.html.en">ttyrec</a>) montrant le système en fonctionnement:</p>
<ul>
<li>
<a href="http://abdessel.iiens.net/fuse_kafka/ttyrecord">Télécharger la session</a> (à lire avec <a href="http://man.cx/ttyplay">ttyplay</a> dans un terminal de 24 lignes et 70 colonnes).</li>
<li>
<a href="http://playterm.org/r/fusekafka-quickstart-1416935569">Lire la session dans un player web</a> (playterm.org).</li>
</ul><h2 id="les-dépendances">Les dépendances</h2>
<h3 id="kafka">Kafka</h3>
<p><a href="https://kafka.apache.org/">Kafka</a> permet de mettre en place des files de messages distribuées à fort débit.<br>
Il écrit les messages de manière séquentielle sur disque et profite donc des optimisations du pagecache de l'OS.<br>
Il utilise aussi <a href="http://man.cx/sendfile%282%29">sendfile</a> pour copier directement le contenu du pagecache vers des sockets<br>
(évitant ainsi des copies et commutations espace utilisateur / espace noyau inutiles).</p>
<h3 id="fuse">FUSE</h3>
<p><a href="http://fuse.sourceforge.net/">FUSE</a> permet d'écrire ses propres systèmes de fichiers pour Linux, et ce dans un processus en espace utilisateur.<br><a href="http://yazgoo.github.io/fuse/#/driver_process">Voici le détail de son fonctionnement</a>.</p>
<h3 id="logstash">Logstash</h3>
<p><a href="http://logstash.net/">Logstash</a> permet de centraliser et de traiter des logs.<br>
Il est facilement installable et extensible grace à jruby.<br>
Ce n'est pas une dépendance directe de fuse_kafka,<br>
mais ce dernier enregistre dans kafka les logs dans un format proche de celui de logstash.</p>
<h2 id="fonctionnement">Fonctionnement</h2>
<p>Voici un graphique qui résume le fonctionnement global:</p>
<p><img src="//img.linuxfr.org/img/687474703a2f2f616264657373656c2e6969656e732e6e65742f667573655f6b61666b612f667573655f6b61666b612e737667/fuse_kafka.svg" alt="fuse kafka" title="Source : http://abdessel.iiens.net/fuse_kafka/fuse_kafka.svg"></p>
<p>Grâce à FUSE, le logiciel écoute les appels au système de fichier sur des répertoires bien définis.<br>
fuse_kafka fonctionne en overlay, c'est à dire que le driver FUSE retransmet les appels au <br>
système de fichier sous-jacent: quand vous accédez à des fichiers dans un répertoire géré,<br>
vous accédez aussi vraiment au disque.<br>
Les appels systèmes d'écriture, quand à eux sont transmis à kafka, avec des méta-données.</p>
<h3 id="exemple-dévénement-écrit-dans-kafka">Exemple d'événement écrit dans kafka</h3>
<p>Le événements sont écrits dans kafka sous format JSON/logstash, par exemple:</p>
<pre><code class="javascript"> <span class="p">{</span> <span class="cm">/* chemin du fichier où l'écriture a eu lieu */</span>
<span class="s2">"path"</span><span class="o">:</span> <span class="s2">"/var/log/redis_6380.log"</span><span class="p">,</span>
<span class="cm">/* identifiant du processus ayant fait l'écriture */</span>
<span class="s2">"pid"</span><span class="o">:</span> <span class="mi">1262</span><span class="p">,</span>
<span class="cm">/* identifiants utilisateurs et groupes effectifs ayant fait l'écriture */</span>
<span class="s2">"uid"</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"gid"</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="cm">/* contenu de l'écriture en base64, ici "hello world" */</span>
<span class="s2">"@message"</span><span class="o">:</span> <span class="s2">"aGVsbG8gd29ybGQ="</span><span class="p">,</span>
<span class="cm">/* date de l'écriture */</span>
<span class="s2">"@timestamp"</span><span class="o">:</span> <span class="s2">"2014-09-11T14:19:09.000+0000"</span><span class="p">,</span>
<span class="cm">/* utilisateurs et groupes effectifs ayant fait l'écriture */</span>
<span class="s2">"user"</span><span class="o">:</span> <span class="s2">"root"</span><span class="p">,</span> <span class="s2">"group"</span><span class="o">:</span> <span class="s2">"root"</span><span class="p">,</span>
<span class="cm">/* commande ayant fait l'écriture */</span>
<span class="s2">"command"</span><span class="o">:</span> <span class="s2">"L3Vzci9sb2NhbC9iaW4vcmVkaXMtc2VydmVyIC"</span><span class="p">,</span>
<span class="cm">/* version de l'agent de logging */</span>
<span class="s2">"@version"</span><span class="o">:</span> <span class="s2">"0.1.3"</span><span class="p">,</span>
<span class="cm">/* champs définis lors du lancement de fuse kafka permettant</span>
<span class="cm"> de rajouter des meta données */</span>
<span class="s2">"@fields"</span><span class="o">:</span> <span class="p">{</span>
<span class="s2">"first_field"</span><span class="o">:</span> <span class="s2">"first_value"</span><span class="p">,</span>
<span class="s2">"second_field"</span><span class="o">:</span> <span class="s2">"second_value"</span> <span class="p">},</span>
<span class="cm">/* tags définis au lancement de fuse kafka permettant</span>
<span class="cm"> de rajouter des méta données */</span>
<span class="s2">"@tags"</span><span class="o">:</span> <span class="p">[</span><span class="s2">"mytag"</span><span class="p">]</span>
<span class="p">}</span></code></pre>
<h3 id="système-de-quota">Système de quota</h3>
<p>Il est possible de définir un quota (nombre d'octet par seconde) tel que si ce dernier est dépassé par un fichier,<br>
L'écriture n'est pas transmise à kafka.<br>
Cela permet de ne pas transférer des grosses écritures telles que faites sur <br>
des fichiers comme des core dumps ou des rotations de logs.</p>
<h3 id="performances">Performances</h3>
<p>L'écriture dans kafka est faite de manière asynchrone grace à <a href="https://github.com/edenhill/librdkafka">librdkafka</a>.<br>
Néanmoins, FUSE ajoute nombre de commutations entre espace utilisateur et espace kernel,<br>
ce qui ralenti les appels systèmes d'accès disques,<br>
voilà pourquoi ce système ne devrait pas être utilisé pour les applications nécessitant un fort débit.<br>
Des benchmarks sont disponibles <a href="http://htmlpreview.github.io/?https://raw.githubusercontent.com/yazgoo/fuse_kafka/master/benchs/benchmarks.html">ici</a>.</p>
<h2 id="intérêts">Intérêts</h2>
<p>Je vois plusieurs intérêts à cette approche:</p>
<ul>
<li>Ce système permet de récupérer les traces de logiciels différents, n'utilisant pas le même système de logging,
(tant que leurs logs se retrouvent dans des fichiers).</li>
<li>Il permet de récupérer des métadonnées intéressantes, telles que l'utilisateur, la ligne de commande ayant produit la trace.</li>
<li> les événements générés contiennent la date d'écriture effective, le système de centralisation de logs
n'a donc pas à <a href="http://logstash.net/docs/1.4.2/filters/grok">parser les logs</a> à la recherche de cette information. </li>
<li>Le fait d'utiliser un format de type logstash permet de pouvoir profiter des nombreuses fonctionnalités de ce dernier.</li>
</ul><div><a href="https://linuxfr.org/users/yazgoo/journaux/presentation-de-fuse_kafka-un-agent-de-logging-pour-kafka-fonde-sur-fuse.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/104140/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/yazgoo/journaux/presentation-de-fuse_kafka-un-agent-de-logging-pour-kafka-fonde-sur-fuse#comments">ouvrir dans le navigateur</a>
</p>
yazgoohttps://linuxfr.org/nodes/104140/comments.atom