Cedric Gatay - [email protected]
MongoDBWhat’s up doc ?
Cedric Gatay - [email protected]
Cedric Gatay
• Code-Troopers
• Packt
• github.com/CedricGatay
• @Cedric_Gatay
2
Cedric Gatay - [email protected]
Clef / Valeur
• Énormes volumes
• Stockage basique
• Pas de types de données
• Opérations simples
4
Cedric Gatay - [email protected]
Colonne
• Stockage inverse du relationnel
• Index pour retrouver une donnée
• Opérations simples
5
Cedric Gatay - [email protected]
Graphe
• Stocke les noeuds et arcs
• Requêtes évoluées
• Opérations simples
6
Cedric Gatay - [email protected]
Document
• Ensemble de champs nommés
• typage optionnel
• Requêtes évoluées
• Opérations plus complètes
7
Cedric Gatay - [email protected]
Caractéristiques
• Pas de schéma
• Pas de transactions "longues"
• Pas de jointures
10
Cedric Gatay - [email protected]
Caractéristiques
• Hautes performances
• C++
• Grosse utilisation mémoire
• Lectures / Écritures rapides
12
Cedric Gatay - [email protected]
Caractéristiques
• Scalable
• failover automatique
• distribution des lectures
• distribution des données
13
Cedric Gatay - [email protected]
Document
15
> cg = {name : 'Cedric Gatay', age : 30} > db.troopers.save(cg)
• Enregistrer une entrée
Cedric Gatay - [email protected]
Requêtes
16
> db.troopers.find() { _id : ObjectId("ef43a2c954236e2d65a81c5e"), name : 'Cedric Gatay', age : 30 }
Cedric Gatay - [email protected]
Requêtes
17
> db.troopers.find({name: 'Darth Vader'}) { _id : ObjectId("133713371337133713371337"), name : 'Darth Vader', age : 42 }
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
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' }] }
Cedric Gatay - [email protected]
Map / Reduce
• Répartition de calcul
• Permet la fusion de données
• Fonctions JavaScript
20
Cedric Gatay - [email protected]
Utilisation depuis Java
• Morphia
• mapping pseudo JPA
• POJO pour collections
• API pour les queries
21
Cedric Gatay - [email protected]
Morphia POJO
22
@Entity("employees") class Employee { @Id ObjectId id; String firstName, lastName; }
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();
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
Cedric Gatay - [email protected]
Utilisation depuis Java
• Jongo
• Jackson pour le marshalling
• Driver Java attaqué directement
25
Cedric Gatay - [email protected]
Jongo POJO
26
class Employee { ObjectId id; String firstName, lastName; }
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);
Cedric Gatay - [email protected]
Jongo : résumé
• Attention aux refactors
• Utilise directement le Driver Java
• Le plus rapide !
28
Cedric Gatay - [email protected]
MongoDBRetour d’expérience
Cedric Gatay - [email protected]
SRMvision
30
• 10/2008
• 2 développeurs
!
• 01/2014
• 7 développeurs
Cedric Gatay - [email protected]
Gestion d’incidents
Cedric Gatay - [email protected]
Gestion de projets
Cedric Gatay - [email protected]
Gestion de parc
Cedric Gatay - [email protected]
Retour aux sources
Cedric Gatay - [email protected]
Besoin initial
• Restitution statistiques décideurs
• Analyse de la qualité de prestations
• Résolution incidents
• Complétude parc
36
Cedric Gatay - [email protected]
Stats v1
• État de l'art
• Business intelligence
• Intégration Mondrian
37
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
Cedric Gatay - [email protected]
Avantages
• Fonctionne bien
• Mise en place rapide
• OLAP est connu
39
Cedric Gatay - [email protected]
Inconvénients
!
• Complexe à comprendre et à maintenir
• Apprentissage du MDX
• Mises à jour difficiles
• Synchronisation SQL > OLAP
40
Cedric Gatay - [email protected]
Pendant ce temps…
Cedric Gatay - [email protected]
Analyse utilisation plateforme
• Google Analytics like
• Collecte info browser / user
• Prétexte d'essai NoSQL
42
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
Cedric Gatay - [email protected]
Réalisation
• Collecte en JS vers un web service
• Back-office de consultation
!
!
• En 2 mois de stage...
44
Cedric Gatay - [email protected]
Statistiques
Cedric Gatay - [email protected]
Évolution des stats
• Construire d’autres stats
• Permettre au client de construire ses stats
• Alléger le système
47
Cedric Gatay - [email protected]
Une stat
• Un ensemble d'axes
• Documents adaptés
• Des mesures
• Fonctions mathématiques d’agrégation
48
Cedric Gatay - [email protected]
Architecture
• Morphia pour un mapping pseudo JPA
• QueryDSL pour des queries typesafe
49
Cedric Gatay - [email protected]
Problèmes
• Passage SQL vers NoSQL
• Possibilité de resynchronisation
• Not Only NoSQL
50
Cedric Gatay - [email protected]
Fonctionnement
• Écriture des documents
• Transformation d’entités vers documents
• Trigger JPA pour lancer la copie
51
Cedric Gatay - [email protected]
Youpi les données sont dans MongoDB
Il ne reste "qu’à" les transformer
52
Cedric Gatay - [email protected]
Sous le capotComment ça se passe pour les développeurs ?
Cedric Gatay - [email protected]
Décrire les documents
• Un POJO par document
• Annotations
• pour les axes
• pour les mesures
54
Cedric Gatay - [email protected]
Faire les calculs
• Écrire les fonctions de calcul
• Associer une annotation par fonction
55
Cedric Gatay - [email protected]
Résumé
• Transformation des entités en documents
• Manipulation avec le Map/Reduce
57
Cedric Gatay - [email protected]
IHM
• Complètement générique
• Basée sur les annotations
• Traductions à ajouter
58
Cedric Gatay - [email protected]
Dynamique
Cedric Gatay - [email protected]
Tableaux de bord
Cedric Gatay - [email protected]
Difficultés
Cedric Gatay - [email protected]
MongoDB
• Appréhender le modèle document
• Comprendre le map/reduce
• Idempotence
• JavaScript
• Debug
63
Cedric Gatay - [email protected]
Faiblesses du système
• JavaScript dans le Java
• tests importants (> 80% couverture)
• IntelliJ IDEA @Language
64
Cedric Gatay - [email protected]
Faiblesses du système
• Another point of failure?
• dépendance non critique
• mongodump/mongorestore
65
Cedric Gatay - [email protected]
Faiblesses du système
• Pré-requis supplémentaire
• Procédure de déploiement
• Tests d’intégration
66
Cedric Gatay - [email protected]
Bilan
• Système compréhensible
• Liberté laissée aux clients
!
• On a mis en prod MongoDB !
67
Cedric Gatay - [email protected]
Astuces
Cedric Gatay - [email protected]
Astuces
• Montée en version
• lire le changelog
• tester dans une sandbox
70
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