nantes jug - traçabilité dans une architecture distribuée avec node.js et mongodb

Post on 21-Jun-2015

1.037 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

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

top related