Upload
sebastien-prunier
View
1.037
Download
1
Embed Size (px)
DESCRIPTION
Les architectures distribuées soulèvent un certains nombre de problématiques en terme de traçabilité : détection des anomalies, suivi des utilisateurs, mesure des performances des différents services … Durant cette session, nous vous montrerons - démonstration à l'appui - comment nous avons apporté une solution simple à ces problématiques, en mettant en place un système de consolidation de logs avec Node.js et MongoDb. Nantes JUG - mars 2013 - http://www.nantesjug.org
Citation preview
Traçabilité dans une architecture distribuée
avec Node.js et MongoDB
Jérôme Creignou - @jcreignouSébastien Prunier - @sebprunier
Architecture
Application
Application Applicati
on
ESB
ESB ESBESB
Service [R]
SGBDR
Rules Controler
Service [W]
Service [R] Service
[W]
Legacy
Mainframe
Controler
Infrastructure
Service A
Service A
Service AService A
Service A
Service A
Load Balancer
Cluster 1 Cluster 2
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
Ce qu’on aurait aimé …
Mais malheureusement …
La (dure) réalité !
Toute
ressemblance avec
une architecture
existante est
purement fortuite
Objectif 1
Traçabilité !
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
Objectif 2
Détection d’anomalies !
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
Objectif 3
Mesure des performances !
Architecture vs. Infrastructure
SGBDR
Application
ESB
load bal.
load bal.
ESB ESB ESB
Serv.
Serv.
Serv.
Serv.
cluster
cluster
cluster
cluster
Vous avez 15 jours !
KISS
Advice (Xebia Essentials)
FBI (Fausse Bonne Idée)
org.apache.log4j.jdbc.JDBCAppender
SGBDR
CREATE TABLE ALL_LOGS (DATA BLOB)
FBI (Fausse Bonne Idée)
« On va abstraire la notion de log, créer un schéma pivot, des convertisseurs et … »
inexploitable !
pas évolutif !
Notre solution
* Log Logarithme John Neper NepR
NepR*
NepR
Outil permettant de consolider un ensemble de traces (logs) techniques
et applicatives et de les restituer selon plusieurs axes d’analyse.
Bonnes pratiques
org.apache.log4j.FileAppender
LogFile
1
Loguer dans des fichiers
Données brutes
Bonnes pratiques 1
Que logue-t-on ?◦ Horodatage◦ Id unique de requête (RequestID)◦ User◦ Service et opération exécutée◦ Machine, nœud du cluster◦ Couche applicative◦ Environnement (dev, re7, prod …)◦ Temps d’exécution◦ En cas d’erreur
Code d’erreur Message Stacktrace
Bonnes pratiques 1
RequestID◦ ID unique généré pour chaque action utilisateur◦ Transporté de couche en couche◦ Permet de reconstruire l’enchaînement des
services
-Xrequestid=123456789
<soap:Header> <traces> <requestid>123456789</requestid> </traces></soap:Header>
HTTP
SOAP
Bonnes pratiques 2
LogFile
LogFile
LogFile
Loguer au plus proche de l’environnement d’exécution
La perte d’informations est limitée
Bonnes pratiques 3
Consolider de manière asynchrone
Les performances ne sont pas impactées
LogFile
LogFile
Bonnes pratiques 4
Stocker de l’information structurée
L’exploitation des informations est facilitée
LogFile
{ ts : "2013-03-18…" , user : "johndoe", service : "xxxxx", op : "abcdef", elapsed : "154"}
Bonnes pratiques 5
Ne pas oublier de purger !
Les données brutes & les données consolidées
Solution techniqueLogFile
File
LogFile
LogFile
nepragent
nepragent
nepragent
nepragent
neprserver
neprdb
Objet « trace »
Objet « perf »
Objet « anomalie »
neprconsole
LogFile
Nepr agent & server : NodeJS◦ Processus légers◦ Simplicité de mise en œuvre◦ Données structurées JSON
Nepr db : MongoDB◦ Stockage de données hétérogènes (schema less)◦ Gros volumes de données en écriture◦ L’ « eventual consistency » n’est pas un problème◦ Stockage JSON
Choix technologiques
REST API◦ POST
/data/:env/:couche/:machine◦ GET
/perfs/:env/:service/:operation /errors/:env/:service/:operation /traces/:env/:requestid /stats/:env/:service/:operation
nepr-server
Map Reduce
nepr-server
var mapFn = function () { emit({ service: this.service, operation: this.operation, couche: this.couche }, { count: 1, elapsed: this.elapsed });}; var reduceFn = function (key, values) {
var result = { count: 0, elapsed: 0 }; values.forEach(function (val) { result.count += val.count; result.elapsed += val.elapsed; }); return result;};
Extraction de logs significatifs via des regexp
Envoi de données structurées au serveur
nepr-agent
^ INFO\\|([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})\\|([^|]*)\\|([^|]*)\\|([^|]*)\\|([^|]*)\\|([^|]*) TIME-USED;(\\d*);0;0;
{ type:'perf', date:todate(m[1]), userid:m[2], sessionid:m[3], requestid:m[4], service:m[5], operation:m[6], elapsed:parseInt(m[7])}
Configurations centralisées sur le serveur
Mise à jour via « svn update » / « git pull »
nepr-agent
nepragent
neprserver
GET /conf/:env/
Démonstration !
nepr-console