toursjug mongodb

73
Cedric Gatay - [email protected] MongoDB What’s up doc ?

Upload: cedric-gatay

Post on 25-May-2015

532 views

Category:

Software


0 download

DESCRIPTION

Talk donné au ToursJUG le 11/06/2014 à propos de MongoDB et contenant un retour d'expérience de l'utilisation chez SRMvision pour construire un système de statistiques

TRANSCRIPT

Page 1: ToursJUG mongoDB

Cedric Gatay - [email protected]

MongoDBWhat’s up doc ?

Page 2: ToursJUG mongoDB

Cedric Gatay - [email protected]

Cedric Gatay

• Code-Troopers

• Packt

• github.com/CedricGatay

• @Cedric_Gatay

2

Page 3: ToursJUG mongoDB

Cedric Gatay - [email protected]

NoSQL

3

Clef / Valeur Colonne Graphe Document

Page 4: ToursJUG mongoDB

Cedric Gatay - [email protected]

Clef / Valeur

• Énormes volumes

• Stockage basique

• Pas de types de données

• Opérations simples

4

Page 5: ToursJUG mongoDB

Cedric Gatay - [email protected]

Colonne

• Stockage inverse du relationnel

• Index pour retrouver une donnée

• Opérations simples

5

Page 6: ToursJUG mongoDB

Cedric Gatay - [email protected]

Graphe

• Stocke les noeuds et arcs

• Requêtes évoluées

• Opérations simples

6

Page 7: ToursJUG mongoDB

Cedric Gatay - [email protected]

Document

• Ensemble de champs nommés

• typage optionnel

• Requêtes évoluées

• Opérations plus complètes

7

Page 8: ToursJUG mongoDB

Cedric Gatay - [email protected]

MongoDB

8

Page 9: ToursJUG mongoDB

Cedric Gatay - [email protected]

MongoDB

9

Page 10: ToursJUG mongoDB

Cedric Gatay - [email protected]

Caractéristiques

• Pas de schéma

• Pas de transactions "longues"

• Pas de jointures

10

Page 11: ToursJUG mongoDB

Cedric Gatay - [email protected]

Caractéristiques

• Stockage en BSON

• JSON

• Typage

• Compressé

11

Page 12: ToursJUG mongoDB

Cedric Gatay - [email protected]

Caractéristiques

• Hautes performances

• C++

• Grosse utilisation mémoire

• Lectures / Écritures rapides

12

Page 13: ToursJUG mongoDB

Cedric Gatay - [email protected]

Caractéristiques

• Scalable

• failover automatique

• distribution des lectures

• distribution des données

13

Page 14: ToursJUG mongoDB

Cedric Gatay - [email protected]

Populaire

14

Page 15: ToursJUG mongoDB

Cedric Gatay - [email protected]

Document

15

> cg = {name : 'Cedric Gatay', age : 30} > db.troopers.save(cg)

• Enregistrer une entrée

Page 16: ToursJUG mongoDB

Cedric Gatay - [email protected]

Requêtes

16

> db.troopers.find() { _id : ObjectId("ef43a2c954236e2d65a81c5e"), name : 'Cedric Gatay', age : 30 }

Page 17: ToursJUG mongoDB

Cedric Gatay - [email protected]

Requêtes

17

> db.troopers.find({name: 'Darth Vader'}) { _id : ObjectId("133713371337133713371337"), name : 'Darth Vader', age : 42 }

Page 18: ToursJUG mongoDB

Cedric Gatay - [email protected]

Opérateurs

18

# $all, $exists, $mod, $ne, $in, $nin, $nor, # $or, $size, $type, $lt, $lte, $gt, $gte > db.troopers.find({age: {$gte : 30}}).count() 1

• Opérateurs

Page 19: ToursJUG mongoDB

Cedric Gatay - [email protected]

Documents imbriqués

19

{ _id : ObjectId("ef43a2c954236e2d65a81c5e"), name : 'Cedric Gatay', age : 30, projects : [{ name : 'Aucard de Tours', stack : 'Android', status : 'Done' },{ name : 'Nowly', stack : 'Android' }] }

Page 20: ToursJUG mongoDB

Cedric Gatay - [email protected]

Map / Reduce

• Répartition de calcul

• Permet la fusion de données

• Fonctions JavaScript

20

Page 21: ToursJUG mongoDB

Cedric Gatay - [email protected]

Utilisation depuis Java

• Morphia

• mapping pseudo JPA

• POJO pour collections

• API pour les queries

21

Page 22: ToursJUG mongoDB

Cedric Gatay - [email protected]

Morphia POJO

22

@Entity("employees") class Employee { @Id ObjectId id; String firstName, lastName; }

Page 23: ToursJUG mongoDB

Cedric Gatay - [email protected]

Morphia Query

23

Datastore ds = new Morphia(/*...*/); !ds.save(new Employee("John", "Doe")); !Employee john = ds.find(Employee.class) .field("firstName") .equal("John") .get();

Page 24: ToursJUG mongoDB

Cedric Gatay - [email protected]

Morphia : résumé

• JPA est adapté au relationnel

• Le modèle document est assez éloigné

• Certains concepts ne sont pas traduits

24

Page 25: ToursJUG mongoDB

Cedric Gatay - [email protected]

Utilisation depuis Java

• Jongo

• Jackson pour le marshalling

• Driver Java attaqué directement

25

Page 26: ToursJUG mongoDB

Cedric Gatay - [email protected]

Jongo POJO

26

class Employee { ObjectId id; String firstName, lastName; }

Page 27: ToursJUG mongoDB

Cedric Gatay - [email protected]

Jongo Query

27

MongoCollection employees = jongo.getCollection("employees"); !employees.insert("{firstName:’John’, lastName:’Doe’}")); !Employee john = employees .findOne("{firstName:’John’}") .as(Employee.class);

Page 28: ToursJUG mongoDB

Cedric Gatay - [email protected]

Jongo : résumé

• Attention aux refactors

• Utilise directement le Driver Java

• Le plus rapide !

28

Page 29: ToursJUG mongoDB

Cedric Gatay - [email protected]

MongoDBRetour d’expérience

Page 30: ToursJUG mongoDB

Cedric Gatay - [email protected]

SRMvision

30

• 10/2008

• 2 développeurs

!

• 01/2014

• 7 développeurs

Page 31: ToursJUG mongoDB

Cedric Gatay - [email protected]

Gestion d’incidents

Page 32: ToursJUG mongoDB

Cedric Gatay - [email protected]

Gestion de projets

Page 33: ToursJUG mongoDB

Cedric Gatay - [email protected]

Gestion de parc

Page 34: ToursJUG mongoDB

Cedric Gatay - [email protected]

Technos

34

Page 35: ToursJUG mongoDB

Cedric Gatay - [email protected]

Retour aux sources

Page 36: ToursJUG mongoDB

Cedric Gatay - [email protected]

Besoin initial

• Restitution statistiques décideurs

• Analyse de la qualité de prestations

• Résolution incidents

• Complétude parc

36

Page 37: ToursJUG mongoDB

Cedric Gatay - [email protected]

Stats v1

• État de l'art

• Business intelligence

• Intégration Mondrian

37

Page 38: ToursJUG mongoDB

Cedric Gatay - [email protected]

Architecture

• Mondrian rempli par un cron

• Activité SQL lourde

• Construction cube CPU bound

• Schéma OLAP dans un XML

• Requêtes SQL en base

• Requêtes MDX en base

38

Page 39: ToursJUG mongoDB

Cedric Gatay - [email protected]

Avantages

• Fonctionne bien

• Mise en place rapide

• OLAP est connu

39

Page 40: ToursJUG mongoDB

Cedric Gatay - [email protected]

Inconvénients

!

• Complexe à comprendre et à maintenir

• Apprentissage du MDX

• Mises à jour difficiles

• Synchronisation SQL > OLAP

40

Page 41: ToursJUG mongoDB

Cedric Gatay - [email protected]

Pendant ce temps…

Page 42: ToursJUG mongoDB

Cedric Gatay - [email protected]

Analyse utilisation plateforme

• Google Analytics like

• Collecte info browser / user

• Prétexte d'essai NoSQL

42

Page 43: ToursJUG mongoDB

Cedric Gatay - [email protected]

État de l'art NoSQL

!

• Etudes différents paradigmes

• MongoDB

• approche document évolutive

• communauté active

• le plus proche de notre besoin

43

Page 44: ToursJUG mongoDB

Cedric Gatay - [email protected]

Réalisation

• Collecte en JS vers un web service

• Back-office de consultation

!

!

• En 2 mois de stage...

44

Page 45: ToursJUG mongoDB

Cedric Gatay - [email protected]

En temps réel

45

Page 46: ToursJUG mongoDB

Cedric Gatay - [email protected]

Statistiques

Page 47: ToursJUG mongoDB

Cedric Gatay - [email protected]

Évolution des stats

• Construire d’autres stats

• Permettre au client de construire ses stats

• Alléger le système

47

Page 48: ToursJUG mongoDB

Cedric Gatay - [email protected]

Une stat

• Un ensemble d'axes

• Documents adaptés

• Des mesures

• Fonctions mathématiques d’agrégation

48

Page 49: ToursJUG mongoDB

Cedric Gatay - [email protected]

Architecture

• Morphia pour un mapping pseudo JPA

• QueryDSL pour des queries typesafe

49

Page 50: ToursJUG mongoDB

Cedric Gatay - [email protected]

Problèmes

• Passage SQL vers NoSQL

• Possibilité de resynchronisation

• Not Only NoSQL

50

Page 51: ToursJUG mongoDB

Cedric Gatay - [email protected]

Fonctionnement

• Écriture des documents

• Transformation d’entités vers documents

• Trigger JPA pour lancer la copie

51

Page 52: ToursJUG mongoDB

Cedric Gatay - [email protected]

Youpi les données sont dans MongoDB

Il ne reste "qu’à" les transformer

52

Page 53: ToursJUG mongoDB

Cedric Gatay - [email protected]

Sous le capotComment ça se passe pour les développeurs ?

Page 54: ToursJUG mongoDB

Cedric Gatay - [email protected]

Décrire les documents

• Un POJO par document

• Annotations

• pour les axes

• pour les mesures

54

Page 55: ToursJUG mongoDB

Cedric Gatay - [email protected]

Faire les calculs

• Écrire les fonctions de calcul

• Associer une annotation par fonction

55

Page 56: ToursJUG mongoDB

Cedric Gatay - [email protected]

Stocker les statsThe easy part…

56

Page 57: ToursJUG mongoDB

Cedric Gatay - [email protected]

Résumé

• Transformation des entités en documents

• Manipulation avec le Map/Reduce

57

Page 58: ToursJUG mongoDB

Cedric Gatay - [email protected]

IHM

• Complètement générique

• Basée sur les annotations

• Traductions à ajouter

58

Page 59: ToursJUG mongoDB

Cedric Gatay - [email protected]

Dynamique

Page 60: ToursJUG mongoDB

Cedric Gatay - [email protected]

Tableaux de bord

Page 61: ToursJUG mongoDB

Cedric Gatay - [email protected]

Stats v290 jh

61

Page 62: ToursJUG mongoDB

Cedric Gatay - [email protected]

Difficultés

Page 63: ToursJUG mongoDB

Cedric Gatay - [email protected]

MongoDB

• Appréhender le modèle document

• Comprendre le map/reduce

• Idempotence

• JavaScript

• Debug

63

Page 64: ToursJUG mongoDB

Cedric Gatay - [email protected]

Faiblesses du système

• JavaScript dans le Java

• tests importants (> 80% couverture)

• IntelliJ IDEA @Language

64

Page 65: ToursJUG mongoDB

Cedric Gatay - [email protected]

Faiblesses du système

• Another point of failure?

• dépendance non critique

• mongodump/mongorestore

65

Page 66: ToursJUG mongoDB

Cedric Gatay - [email protected]

Faiblesses du système

• Pré-requis supplémentaire

• Procédure de déploiement

• Tests d’intégration

66

Page 67: ToursJUG mongoDB

Cedric Gatay - [email protected]

Bilan

• Système compréhensible

• Liberté laissée aux clients

!

• On a mis en prod MongoDB !

67

Page 68: ToursJUG mongoDB

Cedric Gatay - [email protected]

Astuces

Page 69: ToursJUG mongoDB

Cedric Gatay - [email protected]

Astuces

• GUI

• MongoHub (Mac)

• RoboMongo

69

Page 70: ToursJUG mongoDB

Cedric Gatay - [email protected]

Astuces

• Montée en version

• lire le changelog

• tester dans une sandbox

70

Page 71: ToursJUG mongoDB

Cedric Gatay - [email protected]

Astuces

• Debug Map/Reduce

• substitution emit

• print

• tojson

71

Page 72: ToursJUG mongoDB

Cedric Gatay - [email protected]

Merci

72

Page 73: ToursJUG mongoDB

Cedric Gatay - [email protected]

Credits• https://www.flickr.com/photos/mongodb/7416213536/sizes/o/

• https://www.flickr.com/photos/jenny-pics/6110974997/sizes/o/

• https://www.flickr.com/photos/artbystevejohnson/8479160301/sizes/o/

• https://www.flickr.com/photos/wbaiv/6268300461/sizes/o/

• https://www.flickr.com/photos/st3f4n/4360212268/sizes/o/

• https://www.flickr.com/photos/afagen/8297146248/sizes/o

• https://www.flickr.com/photos/anubisabyss/9639217548/sizes/o

• https://www.flickr.com/photos/garrettheath/9371876094/sizes/o

• Trademarks belong to their respective owners

73