Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lyon elasticsearch meetup - centralisation de logs @erdf 2015/03

Vladislav Pernin
March 25, 2015
280

Lyon elasticsearch meetup - centralisation de logs @erdf 2015/03

Vladislav Pernin

March 25, 2015
Tweet

Transcript

  1. Pourquoi • Beaucoup de serveurs • Accès aux machines limité

    ou impossible • Ninja du | sed awk tail cat grep • Simplifier l'accès • Diagnostic • Statistiques / performance
  2. Cible • Système temps réel (1s) • Robuste • Scalable

    • Sans perte • Recherche facile • Complexité limitée
  3. Performance Vitesse de lecture d'un fichier par Logstash Vitesse de

    traitement par Logstash Vitesse d'indexation par elasticsearch sur un PC portable avec des access log Apache
  4. Quelques chiffres ERDF 7 projets, 45 environnements du DEV à

    la PROD, 600 serveurs clients Répartis entre 12 environnements 4 "PROD" : zones réseau différentes et environnements projets
  5. Quelques chiffres ERDF - Production 680M de documents 232Go (464Go

    avec la réplication) 40 index Index le plus gros : 126 560 706 documents pour 41.8Go 2 shards et 1 replica
  6. Quelques chiffres ERDF - Production Une dizaine de queue 230

    msg/s en moyenne 2.000 msg/s en pic consommés sans prendre de retard
  7. Quelques chiffres ERDF - Production IHM journée type : 10

    000 requêtes/j (moyenne 7 requêtes/m) dont 25% via une API REST 178 comptes utilisateurs
  8. Quelques chiffres ERDF - Projet elasticsearch : 121M de documents

    / 68 Go / 37 index rabbitmq : 100m/s, pic à 8000m/s consommés avec du retard … et des problèmes IHM : 15 000 requêtes/j 210 comptes utilisateurs
  9. Migration vers 1.2.x lourde à effectuer Codec Nouveau schéma JSON

    @fields.maprop -> maprop sélection par type -> conditional
  10. Tail intelligent : rotation multi-ligne avec regexp sur début &

    fin détection nouveaux fichiers wildcard et récursif exclusion start_position
  11. Découpage via grok Pattern custom WEBLOGIC_SERVER ####<%{WLSDATE:date}> <%{WORD:level}> <% {DATA:appender}>

    <%{DATA:hostname}> <%{DATA:servername}> <% {DATA:threadname}> <?(?:<)?%{DATA:subsystem}?(?:>)?> <% {DATA:new_data_1}> <> <%{DATA:datenouse}> <%{DATA:beacode}> <%{WLS_MESSAGE:wlsmessage}>
  12. Très puissant mais pas facilement débogable regex à optimiser pour

    la performance voir grokdebug.cloudfoundry.com
  13. Tests rspec #test case 4 sample({"type" => "log4erdf-fonctionnel", "message" =>

    "20121128-11:27:51.903|INFO|XXXXX|application|version|appender|XX-PERF- TX=perftx#UTI_T_LOGIN=loginid#DOR_ID=dorid#Id_correlation=idcorrelation#UTI_ID=loginname| class#method#arguments|stracktrace|"}) do #Test insist { subject["date"] } == "20121128-11:27:51.903" insist { subject["level"] } == "INFO" insist { subject["hostname"] } == "XXXXX" insist { subject["application"] } == "application" insist { subject["version"] } == "version" ... reject { subject["tags"] } == "_grokparsefailure" end
  14. input exec sur des scripts SQL/shell ex : statistiques détaillées

    sur les requêtes SQL Oracle capturées par le Grid
  15. Exemple de customisation : Retry sur la création de la

    river ES Gestion d'une liste de brokers
  16. if watchdog_timeout then; echo Probleme, sans doute sur les regex

    de Grok fi Process watcher (cron/supervisord) et redémarrage
  17. Le watchdog_timeout peut arriver sur le parsing d'une énorme log

    Exemple : avec un AOPLogger sur les arguments sans limite ! log en debug avec un gros XML
  18. Assez performant mais empreinte CPU importante en charge Rapport gain

    / coût : Ok pour 50-100 lignes/s < 1- 5% CPU 2000 lignes/s 150% CPU
  19. Shipper light, feature -, perf +, jeune, à surveiller Exemple

    : logstash-forwarder (anciennement Lumberjack)
  20. RabbitMQ pas conseillé par le fondateur car « complexité, standard

    mouvant et performance en mode persistant » Conseille redis ou zeromq … persistence, sécurité, installation ... Notre avis : marche très bien avec le lapin jusqu'à des volumétries moyennes (<5000/s)
  21. Sortie statsd / Graphite Retour arrière chez ERDF car trop

    de complexité, produit hors souche, pas automatisable facilement, api bizarre, besoin/périmètre ?
  22. Un fichier sincedb par type de logs Un filesystem dédié

    … sinon si le FS hôte est plein, Logstash, selon la configuration va relire l'input complet à chaque itération
  23. Problème si RabbitMQ a déclenché son disk watermark, le client

    Java RabbitMQ, à l'arrêt est bloqué dans un appel com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue Idem si le mot de passe est incorrect Egalement deadlock possible à l'arrêt des applis si des messages restent à envoyer à la destruction des appenders
  24. Écriture d'un listener configurable enrichissant une liste d'appender avec des

    appenders AMQP Configuration du framework de log reste indépendante de la solution de centralisation de logs
  25. Queue avec limite de taille / retry avec un offer

    timeout une fois plein … mais pas avec 200 ms d'attente
  26. Utilisation d'une surcouche à log4j « maison » hérité d'un

    autre projet du client, une sorte de MDC un peu évolué fait bien le travail … mais sur log4j A minima utilisation de la façade slf4j log4j 2 prévu (LMAX Disruptor)
  27. A partir de 8 000 messages/s, on tombe sur un

    vieux problème de contention très connu dans log4j ! On ne rencontre pas forcément ce débit là tous les jours
  28. Existe des équivalents Logback mais ne semblent pas packagé et

    plutôt spécifique Simple à faire à la main
  29. Erlang à compiler sur RHEL car pas de RPM nox

    récent Un paquet est sorti il y deux mois (à tester)
  30. Pas si évident à mettre en œuvre et à paramétrer

    pour un bon fonctionnement en production frame_max,hearbeat,tcp_listen_options inet_dist_listen... disk_free_limit,vm_memory_high_watermark cluster_partition_handling
  31. Cron forçant la fermeture des connexions si des queues ont

    des messages en attente et pas de consumer
  32. Intégration aux normes de sécurité de l'entreprise impeccable avec la

    federation pour transport des logs d'une zone réseau à une autre en respectant le sens des flux
  33. Attention à la problématique des nœuds non synchronisés, perte de

    messages possibles, ordre de redémarrage des nœuds et partitions failures Résolu en version 3.1 Mais très lent
  34. Performances limitées en mode persistant et répliqué … 3 000

    messages / s 6 000 / s sans la persistance Suffisant pour notre cas d'usage (il y a 2 ans)
  35. Récentes federated queues ou plugin de routage en consistent hashing

    sur différentes queues … au détriment de la complexité
  36. Assez performant (5000 stacktraces/s sans tuning) sur un SAN Recherche

    parmi 30 millions lignes de logs en quelques millisecondes
  37. River RabbitMQ très pratique Problèmes de robustesse reconnexion résolu OOM

    avec le queuing consumer Singleton cluster wide Scale pas
  38. … mais les rivers sont deprecated et supprimées en 1.5

    pas très compliqué à reproduire sous un autre forme elasticsearch-gatherer à surveiller
  39. Mapping à mettre au point (montée en compétence indispensable) De

    moins en moins de travail à faire avec les releases récentes à la fois de Logstash et d'elasticsearch
  40. Mapping custom : Compression (par défaut désormais) Élimination de la

    duplication Analyseur custom Élision Type précis Indexation multi field
  41. En cas de nouveau mapping : attendre prochaine rotation d'index

    (jour/semaine) réindexer, possible sans interruption avec des alias
  42. Pas possible de faire des recherches très complexes (join, group

    by multiple, …) Plus ouvert avec le récent module d'agrégation en remplacement des facets depuis la 1.0
  43. Facette : très puissant mais attention au scope, les OOM

    viennent vite Doc values pour stockage sur disque Circuit breaker (> 1.4)
  44. Message fourni à elasticsearch sans identifiant, génération par es Sauf

    pour certains cas où on peut déduire l'identifiant de la log (Grid Oracle) et updater le document dans es
  45. Exemple (extrait) de query de filtre !(iduser* "ISPN000042: Did not

    find queried attribute with name") AND !( (application:kafka AND "Connection reset by peer") "No data found" "caught end of stream" "from old client" ("in zookeeper" AND "doesn't exist yet") ((troncon OR branchement) AND "ne sera pas") (environment:rec AND NullPointerException AND MaterielServiceImpl:12) (environment:perf AND durationmillisec:) )
  46. Partitioning aisé via le nommage des index Un par semaine

    2 shards par index Volume de documents pas forcément prévisible / sharding par simple
  47. 3 nœuds obligatoires sinon : soit pas de HA soit

    split brain 1 nœud peut être simplement master-only
  48. Paramétrage gateway... et discovery.zen... obligatoire Unicast Attention à la version

    du JDK, 7 mais pas forcément la toute dernière version Pas de G1
  49. Pas plus de la moitié de la RAM pour la

    heap Fréquence et pause GC à surveiller Lock HEAP dans la RAM (mlockall) Pas swapper Nombre de CPUs important
  50. Kibana 3 (4 maintenant) inexistant au démarrage Intégration avec le

    framework utilisé sur le projet pour homogénéité
  51. Remarques diverses Fait ressortir tous les défauts des applications (visible

    dans les logs) de manière criante … et aussi ceux des logs eux-mêmes
  52. Multi lignes : plus simple avec délimiteur de début et

    de fin, comme Weblogic Lignes de logs auto porteuses
  53. Décision de : filtrer (groker) côté agent côté serveur logguer

    directement en json ou json_event (format Logstash)
  54. Autres pistes rsyslog (multiligne limité, AMQP beta, versions anciennes) syslog-ng

    (pas multiligne, ni wildcard, ni buffer persistant sauf dans version premium, AMPQ pas en premium, API ..., 1 fichier persist, buffer sortie …) flume / hadoop (pas de tail, Hadoop, intéractif ..., ops …) Piste intéressante : sink Flume avec un split sur elasticsearch et HDFS/HBase ou écoute de HDFS/HBase ou elasticsearch-hadoop Graylog2 (ruby gem …, Java dernière version, GELF spécifique, mongodb, mapping, 1 index)
  55. Autres pistes Heka (Mozilla, à surveiller) Spring XD avec des

    flux en | Morphlines de Cloudera / Zlogd de Zumba / Utiliser Solr (Logsene@sematext) Splunk (puissant, bien intégré, indexation brute, reporting, corrélation / alerte, C et python, plugin, pas extensible / intégrable, très cher) PAAS (Loggly, New Relic, Papertrail, Logentries / ok/nécessaire dans le cloud, RSSI pas content, coût assez obscur)
  56. Apache Kafka • transport des logs • pour les plateformes

    à très forte charge • throughput impressionnant • > 20 000/s en production et > 200 000/s en consommation sur un portable • scalabilité horizontale • nativement persistant • ok dans un écosystème bigdata • API consommation pas simple
  57. Pour finir Jeunesse relative des produits Problèmes d'intégration (contournés) Introduction

    de nouvelles technologies nécessaire (apprentissage, maîtrise, complexité) Overhead, très limité (Logstash et appender 10- 100ms) et rapport gain/perte OK RabbitMQ a montre ses limites
  58. Pour finir Automatisation d'installation multi environnements/projets/topologies réussie mais longue Des

    cookbooks chef, modules Puppet, Ansible, deb, RPM existent … si ils correspondent à votre environnement Architecture à scaler pour très grande volumétrie En plein mouvement
  59. Pour finir En plein mouvement Support éditeur désormais possible Beaucoup

    de ressources/documentation de qualité, pas le cas il y a deux ans
  60. Pour finir Centralisation des logs de plusieurs environnements et projets

    Temps de diagnostic des problèmes et des tests de performance réduit drastiquement Développeurs & SNx autonomes Devenu un des outils le plus utilisé chez ERDF
  61. Pour finir Visibilité sur le système, son état Transparence sur

    la qualité « visible depuis les logs » Corrélation à travers toute l'architecture, top 10 erreurs, ... Recherche de reproductibilité de bug facile Statistiques diverses ...