SlideShare a Scribd company logo
1 of 107
Download to read offline
BreizhCamp 2015 #BzhCmp
#MongoDB #bzhcmp
BreizhCamp 2016 #BzhCmp
Tout ce que le getting started
MongoDB ne vous dira pas
Bruno BONNIN - @_bruno_b_
Pierre-Alban DEWITTE - @padewitte
Bruno BONNIN
Architecte logiciel
https://about.me/brunobonnin
Pierre-Alban DEWITTE
Responsable équipe cloud
Getting started with MongoDB
# Installation de Mongodb
> sudo apt-get install mongodb
# Lancement du serveur
> sudo service mongod start
# Import de données
> mongoimport --db test --collection restaurants --drop --file primer-dataset.
json
# Lancement du shell
> mongo
// On s’amuse avec quelques commandes CRUD
>>> db.restaurants.insert(...)
>>> db.restaurants.find(...)
>>> db.restaurants.delete(...)
Disclaimer
● Cette présentation est truffée de mauvaise
foi
● Ne prenez pas tout, adaptez vous à votre
contexte
● Notre but est de vous donner envie d’aller
chercher la bonne information
1. Développer efficacement
2. Préparer la production
3. Exploiter
4. Avant de se quitter
Développer efficacement
Schema design
Des documents !
● MongoDB stocke des documents
○ Structure de données hiérarchique
○ Un champ peut être un type de base (entier, string,
booléen), une liste, un objet (on parle de sous-
document)
Comparaison
RDBMS MongoDB
Database Database
Table Collection
Enregistrement Document
Colonne Champ
Index Index
Jointure $lookup, sous-document, lien
Modèle relationnel et normalisation
● Data rangées dans les bonnes cases, pas de
redondance de l’information
○ C’est beau, c’est carré !
● Mais, attention aux performances lors des
recherches sur les disques de l’info dans les
différentes tables
La réponse de MongoDB
Pensez...
Dénormalisation
Documents
Usages
Personne
nom adresseId
... ...
Adresse
id code_postal ville
... ... ...
Personne
{
nom: “...”,
code_postal: “...”,
ville: “...”
}
Personne
{
nom: “...”,
adresse: {
code_postal: “...”,
ville: “...”
}
}
Document, sous-document, ...
Pourquoi tout mettre dans un seul doc ?
● locality : stockage de toute l’info au même
endroit sur le disque
● consistency : comme il n’y pas de
transaction, MongoDB assure que l’update
d’un doc est atomique
Document, sous-document, ...
Pourquoi ne pas tout mettre dans un seul
doc ?
● On peut récupérer plus d’info qu’on n’en a
réellement besoin
○ on peut utiliser les projections dans les
queries (ok d’un point de vue réseau),
○ mais cela n’empêche le document d’
être entirèrement présent en mémoire
avant d’être retourné au client
Références entre docs
Pourquoi séparer dans plusieurs docs ?
● Flexibilité
● Cardinalité forte / gros document:
○ Attention à la place mémoire (document
déserialisé en mémoire)
○ Taille max des docs: 16Mo
Références entre docs
Pourquoi ne pas séparer dans plusieurs docs ?
● On risque d’avoir à gérer des jointures dans
l’application, compliqué !
● Ou utilisation de $lookup : a des contraintes
fortes !
Modélisation: quelques règles simples
1..1
1 seule collection Personne
- Avec un sous-document
“carte_vitale”
Collection “Personne”
{
nom: “...”,
carte_vitale: {
date_emission: “...”,
cnam: “...”
}
}
Personne Carte Vitale
Modélisation: quelques règles simples
1 seule collection Personne
- Avec une liste de sous-
documents “adresse”
1..peu
Collection “Personne”
{
nom: “Séraphin Lampion”,
adresses: [
{
rue: “rue de la Roquette”,
ville: “Paris”
},
{
rue: “chemin du chateau”,
ville: “Moulinsart”
}
]
}
Personne Adresse
Modélisation: quelques règles simples
2 collections Voiture et Composant
- C’est Voiture qui référence les composants
1..beaucoup
Collection “Voiture”
{
marque: “...”,
modele: “...”,
composants: [
“Id_101”,
“Id_22”,
“Id_345”,
…
]
}
Voiture Composant
Collection “Composant”
{
id: “...”,
type: “...”,
prix: ...
}
Modélisation: quelques règles simples
2 collections Systeme et Log
- C’est Log qui référence le parent !
1..énormément
Collection “Système”
{
id: “...”,
host: “...”,
...
}
Système Log
Collection “Log”
{
date: “...”,
level: “...”,
id_systeme: “...”
}
Et concernant l’usage...
Ne pas oubliez d’en tenir compte !
● “J’ai besoin de l’ensemble des données à
chaque requête”
○ Mettez tout dans une seule collection
● “J’ai besoin d’en avoir seulement une partie”
○ Faites plusieurs collections et des références
○ Ex: les posts d’un blog et leurs commentaires :
■ 2 besoins : affichage liste des posts + affichage post avec
commentaires
■ Modélisation avec 2 collections (posts, comments)
$lookup
Des jointures ! c’est un début…
● Left outer join
● Uniquement avec des collections non shardées
Collection Conference
{
“title”: “Plein de mots-clefs hyper cools...”,
“description”: “Refaites votre SI avec
tout ça, sinon vous êtes mort!”,
“speaker_id”: “techno_maniac”
}
Collection Speaker
{
“_id”: “techno_maniac”,
“name”: “Jean-Marcel Le Maniac”,
“email”: “le_maniac@breizhcamp.org”
}
Exemple $lookup
db.Conference.aggregate( [ {
“$lookup”: {
“from”: “Speaker”,
“localField”: “speaker_id”,
“foreignField”: “_id”,
“as”: “speaker_infos”
} }
] )
[ {
“title”: “Plein de mots-clefs hyper cools...”,
“description”: “Refaites votre SI avec…”,
“speaker_id”: “techno_maniac”,
“speaker_infos”: [ {
“_id”: “techno_maniac”,
“name”: “Jean-Marcel Le Maniac”,
“email”: “le_maniac@breizhcamp.org”
} ]
}, … ]
$lookup
Collection Conference
{
“title”: “Plein de mots-clefs hyper cools...”,
“description”: “Refaites votre SI avec ça”,
“speaker_ids”: [ “miss_techno”, “techno_maniac” ]
}
Exemple $lookup
db.Conference.aggregate( [ {
$unwind: “$speaker_ids”
}, {
$lookup: {
from: “Speaker”,
localField: “speaker_ids”,
foreignField: “_id”,
as: “speakers_infos”
}
}, {
$group: {
_id: “$_id”,
title: { $first: “$title” },
speakers: { $push: “$speakers_infos” }
}
}
] )
{
“title”: “Plein de mots-clefs hyper cools...”,
“speakers”: [{
“_id”: “miss_techno”,
“name”: “Jeanne-Irene La Maniac”,
“email”: “miss_techno@breizhcamp.org”
}, {
“_id”: “techno_maniac”,
“name”: “Jean-Marcel Le Maniac”,
“email”: “le_maniac@breizhcamp.org”
} ]
},
{
...
},
…
Avec des listes, jouez avec
$unwind et $group
“C’est un art plus qu’une science!”
Usages !
Usages !
Usages !
Usages !
Usages !
Usages !
Questions ?
Outillage
● La GUI n’est pas une priorité pour MongoDB
● Les meilleurs outils gratuits sont maintenus
par des personnes de MongoDB
Choisir une interface graphique
Robot Mongo
● C’est codé avec un vrai langage (C++)
● Est globalement à la traine sur le support de
fonctionnalités
● Pensez à utiliser les beta
● Plutot complet
● Robuste et stable
Mongo Chef
● La seule GUI de niveau professionnel
● A été mis à jours très rapidement les deux
dernières années
● Très complet pour du développement
comme de l'administration
● Le top coute 149 $ par an
MongoDB Compass
Mongo-hacker
● Le shell MongoDB vitaminé
○ Colorisation
○ Alias pour compter collections, documents et
indexes
○ Alias pour aggrégations gcount, gavg, gsum
● Toujours nécessaire notamment quand la
base n’est pas accessible directement
https://github.com/TylerBrock/mongo-hacker
M
● Equivalent pour mongodb de n pour node
● Simplification du téléchargement
● Changement en une commande de version
mongodb
https://github.com/aheckmann/m
Démo
Frameworks et API
ORM ou plutôt ODM
Avant-propos: eh oui, on est mono-maniaque et
on ne développe qu’en Java !
● Driver Java
○ Évolue bien, mais bas niveau
● Morphia
○ Intéressant
● Spring Data MongoDB
○ C’est Spring...
● Hibernate OGM
○ Heu...
● Jongo
○ Fun !
Driver Java 3.0
Nouvelles classes (les anciennes sont toujours là, hélas…)
// A OUBLIER !!!!
DB db = mongoClient.getDB("breizhcamp2016");
DBCollection dbCollection = db.getCollection("conferences");
Iterator<DBObject> confIter = dbCollection.find().iterator();
// Utilisation d’un mapper pour convertir les DBObjects en objets métier
MongoDatabase db = mongoClient.getDatabase("breizhcamp2016");
MongoCollection<Document> dbCollection = db.getCollection("conferences");
// Ou en utilisation directe de la classe métier
MongoCollection<Conference> dbCollection = db.getCollection("conferences",
Conference.class);
MongoCursor<Conference> conferences = confCollection.find().iterator();
// Il ne faut pas oublier de déclarer un codec pour la classe Conference
Driver Java 3.0
Codec: permet de gérer finement le codage en
BSON (est-ce bien utile ? bof...)
public class ConferenceCodec implements Codec<Conference> {
@Override
public void encode(BsonWriter writer, Conference conf,
EncoderContext ctx) {
}
@Override
public Class<Conference> getEncoderClass() {
return Conference.class;
}
@Override
public Conference decode(BsonReader reader,
DecoderContext ctx) {
}
}
public class ConferenceCodecProvider implements
CodecProvider {
@Override
public <T> Codec<T> get(Class<T> clazz,
CodecRegistry registry) {
if (clazz == Conference.class) {
return (Codec<T>) new
ConferenceCodec();
}
return null;
}
}
Utilisation d’un codec générique (projet à suivre!):
➔ https://github.com/ylemoigne/mongo-jackson-codec
Driver Java 3.0
Async API (mêmes noms de classes, pas le même package)
// Async Database et Collection
//
MongoDatabase db = client.getDatabase("breizhcamp2016");
MongoCollection<Conference> collection = db.getCollection("conferences",
Conference.class);
Conference conference = new Conference(
"Framework TrucMachinChoseJS et Dockerification de mes microservices",
"C'est trop cool !",
new Speaker("JsAndDockerAndMicroServicesManiac"));
// Insertion d’un élément => il faut fournir une callback
//
collection.insertOne(conference,
(final Void result, final Throwable t) -> {
System.out.println("Conference inserée");
});
Morphia
Nécessaire et suffisant
Morphia morphia = new Morphia();
morphia.map(Conference.class, Speaker.class);
Datastore datastore = morphia.createDatastore(client, "breizhcamp2016");
Conference conf = new Conference("Have fun With MongoDB", "@padewitte", "@_bruno_b_");
datastore.save(conf);
List<Conference> confWithPAD = datastore.find(Conference.class)
.filter("speakers", "@padewitte")
.field("speakers").sizeEq(1)
.asList();
datastore.createAggregation(Conference.class)
.unwind("speakers")
.project(projection("twitterHandle", "speakers"), projection("title"))
.group("twitterHandle", grouping("conferences", addToSet("title")))
.out(Speaker.class);
Pas de transaction, mais...
Ne pas oublier qu’il existe des méthodes
findAndXXX permettant d’exécuter des actions
de manière atomique
FindOneAndUpdateOptions options = new
FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER);
// UpdatedConf contient les données de la conférence suite à la modif
Conference updatedConf = confCollection.findOneAndUpdate(
new Document(), // Query
new Document("$push", new Document("speakerIds", "pad")), // Update
options);
Questions ?
Préparer la production
Estimer la volumétrie
Estimer la volumétrie
1. Prototyper et concevoir une première
version du schéma
2. Extraire les statistiques de taille de chaque
collection pour les datas et les index
a. taille moyenne des datas
b. taille moyenne des indexes
3. Pour chaque collection, estimer un nombre
de documents
4. Appliquer un coefficient multiplicateur
(un conseil, à cacher le dans une formule d’excel)
Extraire les statistiques
> show collections
> count docs
> count index
> db.macollection.count()
> db.macollection.stats(1024*1024)
Le working set
● Portion des données utilisée fréquemment
● Attention aux batchs réalisant une lecture
complète d’une collection
● Idéalement la taille du working set doit
correspondre à la taille de la RAM
Taille sur disque d’une collection
Taille moyenne
d’un document
Taille data=*
Nb de
doc.
Taille moyenne
des indexes
Taille
indexes=*
Nb de
doc.
=
Taille sur
disque
+
Taille du working-set d’une collection
Taille moyenne
d’un document
Taille data=*
Nb de
doc.
Taille moyenne
des indexes
Taille
indexes=*
Nb de
doc.
=
Taille
working-set
+
Proportion
data utile
*
Migrer ses données
Chemins de migration
Peu d’outillage disponible
mongo-connector
● Ecrit et maintenu par MongoDB en python
● Permet de copier depuis MongoDB vers :
○ ElasticSearch
○ Solr
○ Mongodb
○ Postgresql
● Peut permettre de synchroniser une base de
préproduction avec la production simplement
● Idéal pour des duplications sans
transformation
https://github.com/mongodb-labs/mongo-connector
Apache Camel & Groovy
def ds = new OracleDataSource(... )
SimpleRegistry registry = new SimpleRegistry();
registry.put("myDataSource", ds);
def camelContext = new DefaultCamelContext(registry)
camelContext.addRoutes(new RouteBuilder() {
def void configure() {
from("direct:EXTRACT_SQL")
.setHeader("table", constant("CONFERENCES"))
.setBody().constant("select * where (CONFERENCES.DATMAJ > sysdate -
2 )")
.to("jdbc:myDataSource?
outputType=StreamList&useHeadersAsParameters=true")
.split(body()).streaming().process(confProcessor) .to("mongodb:
myDb?database=mymongo_databse&collection=conferences&operation=save")
.end()
}
})
camelContext.start()
// send a message to the route
ProducerTemplate template = camelContext.createProducerTemplate();
template.sendBody("direct:EXTRACT_SQL", "Starting migration");
camelContext.stop()
Questions ?
Exploiter
Replica-set
Configurer un replica-set
Rien de plus simple !
● Sur chacun de vos serveurs:
● Connexion sur un des nodes:
$ mongod --dbpath /data/mongo --replSet breizhcamp_rs
$ mongo --host mongod-node1
MongoDB shell version: 3.2.4
connecting to: mongod-node1:27017/test
>
> rs.initiate({_id:"breizhcamp_rs", members:[
{_id:0,host:"mongod-node1:27017"},
{_id:1,host:"mongod-node2:27017"}]})
{"ok":1}
breizhcamp_rs:PRIMARY>
Attention au chainage
https://docs.mongodb.org/manual/reference/replica-
configuration/#rsconf.settings.chainingAllowed
PRIMARY
SECONDARY
SECONDARY SECONDARY
Adapter le write et read concern
https://docs.mongodb.org/manual/core/replica-set-write-concern/
https://docs.mongodb.org/manual/core/read-preference/
WRITE
READ (≥ 3.2)
Questions ?
Storage
Storage engine
MongoDB s’adapte aux différents use cases en
fournissant plusieurs moteurs de stockage
● MMAPv1: présent depuis le début
● WiredTiger : depuis la 3.0 et par défaut à partir de la 3.2
● In memory (beta)
● Autres futurs moteurs
Pour un noeud donné, on ne peut pas changer de
type, mais on peut avoir des nodes avec diff.
engines
Mettez un tigre dans votre moteur
Super performant en écriture !
➔ Lock au niveau du document (et plus au niveau de la
collection)
Gain de place:
➔ Support de la compression pour les collections, les
index, les journaux
○ Snappy: par défaut pour les docs et les journaux
■ 70% de taux de compression, peu de surcoût en CPU
○ Zlib: meilleure compression (mais surcoût de CPU)
Sécurité:
➔ Support du chiffrement au niveau du stockage
(uniquement pour MongoDB enterprise)
Les performances
Stockage : dans la vraie vie...
30 millions de docs (10 ko chaque), 20 index
Et pour finir, soyons joueur !
● Plusieurs types peuvent co-exister au sein d’
un même replica set
● On peut imaginer:
○ Un node pour les lectures => MMAPv1
○ Un node pour les écritures => WiredTiger
Node 1 avec
WiredTiger
Node 2 avec
MMAPv1
Data
ingestion
Data Read
Replica set
Questions ?
Sharding
Range Based Sharding
Hash Based Sharding
Tag Aware Sharding
Tag Aware Sharding
Il existe certainement d’autres bases de
données adaptées à de tels besoins
Topologie minimale
Testez en environnement cible
● Update et remove doivent inclure la clé de
sharding
● La lecture sur les secondaires est à éviter
tant que possible (orphans)
● Limites sur l’aggrégation
○ pas de join depuis une collection shardée
○ optimisation largement dépendante des données
Si jamais vous êtes encore motivés
● Sans réseau correct point de salut
● Colocaliser les MongoS avec vos
applications
● N’oubliez pas de sauvegarder les MongoS
(pas de reconstruction possible
simplement)
● Faites vérifier votre architecture par un ami
Quand sharder ?
● Quand ce n’est pas votre premier projet
MongoDB en production
● Quand vous pouvez acheter quelques
machines de plus (à minima triplement du
nombre de machine)
● Quand il n’est pas possible de faire
autrement
○ Envisager d’abord la scalabilité verticale
○ Monitorer la taille de votre working set pour
anticiper le plus possible cette opération
Les points d’attention
● Privilegier autant que possible le sharding
haché
● Surveiller les plages de lancement du
balancer
● Nettoyer régulièrement les orphans
● Ne jamais lire sur un secondary si l’
exactitude de la donnée est critique
https://docs.mongodb.
org/manual/reference/command/cleanupOrphaned/
Questions ?
Analyser les performances
Mongo tools
● Log avec requêtes lentes et cursor.
explain()
● mongotop : stats (temps) lecture/ecriture
par collection
● mongostat : stats système de l’instance
○ insert, query, update, delete (nombre de requêtes/s)
○ getmore command flushes
○ mapped (MMAPv1), vsize, res
○ faults (MMAPv1)
○ qr|qw (queue)
○ ar|aw (active clients)
Mtools
● La boite à outils indispensable pour analyser
les logs
https://github.com/rueckstiess/mtools
Supervision et métrologie
Les points de supervision système
● Espace libre
● Nombre de connexions réseau
● Nombre de fichiers ouverts
● Mémoire utilisée
Dans le cas d’un replica-set :
● Statut dans le replica-set
● Présence de fichiers dans le répertoire
rollbacks
https://docs.mongodb.org/manual/core/replica-set-rollbacks/
Les solutions
Pas de plugin permettant la découverte
automatique
● Zabbix
○ Set de graph et d’alarmes préconfigurées
○ Il faudra mettre les mains dans PHP
● Nagios
○ Nombreux check à ajouter
○ Accompagné du plugin CACTI il est aisé de se
construire une métrologie
○ Il faudra mettre les mains dans Python
● Votre script dans votre langage de
prédiletion
https://github.com/nightw/mikoomi-zabbix-mongodb-monitoring
https://github.com/mzupan/nagios-plugin-mongodb
Métrologie
● Définir des alertes sur événements ou seuil
est important
● En cas de problème de performance
complexe avoir grapher les métriques clefs
auparavant est encore plus important
Backup
MongoDump / MongoRestore
● Tool de Mongo permettant la sauvegarde
● Dans le cas d’un replica set utiliser l’option --
oplog à la sauvegarde et la restauration
pour backuper un maximum d’
enregistrement
● Il est nécessaire d’avoir la place disponible
et peut prendre beaucoup de temps
Copie des fichiers
● Il est possible de backuper par copie des
fichiers
● Dans le cas de NMAP il est indispensable d’
activer le journal et que celui ci soit présent
sur le même volume que les données
● Dans le cas d’un replica set préférer la
sauvegarde sur le primary ou alors s’assurer
que le secondary source de la sauvegarde n’
est pas en retard
● Si vous pouvez vous le permettre préférer
stopper l’instance
Faire son propre “Point in time …”
● Si jamais vous avez un oplog couvrant
l'intervalle de temps entre une sauvegarde
et le moment auquel vous pouvez restaurer
il est possible de ne pas perdre de données
● Commencer par isoler un membre puis
sauvegarder l’oplog
● http://www.codepimp.org/2014/08/replay-
the-oplog-in-mongodb/
● A tester absolument dans un environnement
non cible la première fois
MongoDB Cloud Manager Backup
● De loin la solution la plus simple mais
nécessite une souscription
● Fonctionne par lecture de l’oplog en
continue
● Permet le point in time recovery
● Disponible dans le cloud ou dans votre
réseau
● Si auo-herbergé la machine de backup doit
être aussi puissante avec encore plus de
stockage que vos autres machines
Solution idéale
● Un backup idéal est un backup testé
● Pour des petits volumes MongoDump est
suffisant
● Les outils de MongoDB corp sont clairement
plus simple à utiliser
Questions ?
Avant de se quitter
Gestion de projet
Gérer son projet
Concevoir Développer
QualifierEvaluer les
performances
● Un bon schéma doit répondre :
○ Aux besoins métier
○ Aux exigences de performance
● Pour bien connaitre le besoin, il faut le
développer et le tester
● Pour savoir si l’application répond aux
exigences de performance, il faut la tester
● Les tests doivent commencer avec le
développement
● Pour tester rapidement, il faut déployer
rapidement
En résumé
Agilité
Continuous
testing
DevOps
Ingénierie des
exigences
Pour continuer
Les liens à connaitre
https://docs.mongodb.
org/manual/administration/production-
checklist/
https://docs.mongodb.
org/manual/faq/diagnostics/
Se former
https://university.mongodb.com/
Se tenir informer
https://www.mongodb.com/presentations/all
https://www.mongodb.com/community
#mongodb
#bzhcmp
@_bruno_b_
@padewitte
Pour compléter
http://dba.stackexchange.
com/questions/121160/mongodb-mmapv1-vs-
wiredtiger-storage-engines
https://objectrocket.
com/blog/company/mongodb-wiredtiger
http://zanon.io/posts/mongodb-storage-
engine-mmap-or-wiredtiger

More Related Content

What's hot

Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGDavid Pilato
 
Toutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBToutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBContent Square
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?Sébastien Prunier
 
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...MongoDB
 
Nantes JUG - Elasticsearch
Nantes JUG - ElasticsearchNantes JUG - Elasticsearch
Nantes JUG - ElasticsearchDavid Pilato
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchAudrey Neveu
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
Paris data geek - Elasticsearch
Paris data geek - ElasticsearchParis data geek - Elasticsearch
Paris data geek - ElasticsearchDavid Pilato
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudriaDavid Pilato
 
Lausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchLausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchDavid Pilato
 
Poitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchPoitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchDavid Pilato
 
Normandy JUG - Elasticsearch
Normandy JUG - ElasticsearchNormandy JUG - Elasticsearch
Normandy JUG - ElasticsearchDavid Pilato
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...MongoDB
 
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQL
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQLWebinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQL
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQLMongoDB
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementMohamed hedi Abidi
 

What's hot (20)

Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUG
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Toutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBToutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDB
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Zenika MongoDB Tour - REX Amadeus
Zenika MongoDB Tour - REX AmadeusZenika MongoDB Tour - REX Amadeus
Zenika MongoDB Tour - REX Amadeus
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
 
Nantes JUG - Elasticsearch
Nantes JUG - ElasticsearchNantes JUG - Elasticsearch
Nantes JUG - Elasticsearch
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic Search
 
ToursJUG mongoDB
ToursJUG mongoDBToursJUG mongoDB
ToursJUG mongoDB
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Paris data geek - Elasticsearch
Paris data geek - ElasticsearchParis data geek - Elasticsearch
Paris data geek - Elasticsearch
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudria
 
L'avenir de LAMP
L'avenir de LAMPL'avenir de LAMP
L'avenir de LAMP
 
Lausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchLausanne JUG - Elasticsearch
Lausanne JUG - Elasticsearch
 
Poitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchPoitou charentes JUG - Elasticsearch
Poitou charentes JUG - Elasticsearch
 
Normandy JUG - Elasticsearch
Normandy JUG - ElasticsearchNormandy JUG - Elasticsearch
Normandy JUG - Elasticsearch
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
 
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQL
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQLWebinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQL
Webinaire 1 de la série Retour aux fondamentaux : Introduction à NoSQL
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 

Viewers also liked

Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDB
Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDBTrading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDB
Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDBMongoDB
 
[Codeur en seine] Les Pipelines Jenkins dans la vraie vie
[Codeur en seine] Les Pipelines Jenkins dans la vraie vie[Codeur en seine] Les Pipelines Jenkins dans la vraie vie
[Codeur en seine] Les Pipelines Jenkins dans la vraie vieJean-Philippe Briend
 
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...Kai Wähner
 
Explorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinExplorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinBruno Bonnin
 
Centrifuge 2014
Centrifuge 2014Centrifuge 2014
Centrifuge 2014kels_147
 
Grand Canyon in Less than 100 Photos
Grand Canyon in Less than 100 PhotosGrand Canyon in Less than 100 Photos
Grand Canyon in Less than 100 PhotosRyn Gargulinski
 
MongoDB NoSQL - Developer Guide
MongoDB NoSQL - Developer GuideMongoDB NoSQL - Developer Guide
MongoDB NoSQL - Developer GuideShiv K Sah
 
El problema de la setmana andrea
El problema de la setmana andreaEl problema de la setmana andrea
El problema de la setmana andreaSerradePrades
 
Tecnologias para la educación
Tecnologias para la educaciónTecnologias para la educación
Tecnologias para la educaciónIarozeth Piquero
 
Universidad tecnologica equinoccial solis villalta doris remache bunci manu...
Universidad tecnologica equinoccial  solis villalta doris  remache bunci manu...Universidad tecnologica equinoccial  solis villalta doris  remache bunci manu...
Universidad tecnologica equinoccial solis villalta doris remache bunci manu...1986-06-26
 
Novas Tecnologias
Novas TecnologiasNovas Tecnologias
Novas TecnologiasLigimaca
 
Presentación del sistema genesis y portal institucional j a
Presentación del sistema genesis y portal institucional j aPresentación del sistema genesis y portal institucional j a
Presentación del sistema genesis y portal institucional j afelipegomezg
 
OTS-US Staffing Services
OTS-US Staffing ServicesOTS-US Staffing Services
OTS-US Staffing ServicesShweta Madaan
 
Automatisez votre gestion de MongoDB avec MMS
Automatisez votre gestion de MongoDB avec MMSAutomatisez votre gestion de MongoDB avec MMS
Automatisez votre gestion de MongoDB avec MMSMongoDB
 
MongoDB WiredTiger Internals
MongoDB WiredTiger InternalsMongoDB WiredTiger Internals
MongoDB WiredTiger InternalsNorberto Leite
 

Viewers also liked (20)

Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDB
Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDBTrading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDB
Trading up: Adding Flexibility and Scalability to Bouygues Telecom with MongoDB
 
[Codeur en seine] Les Pipelines Jenkins dans la vraie vie
[Codeur en seine] Les Pipelines Jenkins dans la vraie vie[Codeur en seine] Les Pipelines Jenkins dans la vraie vie
[Codeur en seine] Les Pipelines Jenkins dans la vraie vie
 
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...
JBoss OneDayTalk 2013: "NoSQL Integration with Apache Camel - MongoDB, CouchD...
 
Explorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinExplorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelin
 
Centrifuge 2014
Centrifuge 2014Centrifuge 2014
Centrifuge 2014
 
Prueba
PruebaPrueba
Prueba
 
Grand Canyon in Less than 100 Photos
Grand Canyon in Less than 100 PhotosGrand Canyon in Less than 100 Photos
Grand Canyon in Less than 100 Photos
 
MongoDB NoSQL - Developer Guide
MongoDB NoSQL - Developer GuideMongoDB NoSQL - Developer Guide
MongoDB NoSQL - Developer Guide
 
Matt hunter
Matt hunterMatt hunter
Matt hunter
 
El problema de la setmana andrea
El problema de la setmana andreaEl problema de la setmana andrea
El problema de la setmana andrea
 
Tecnologias para la educación
Tecnologias para la educaciónTecnologias para la educación
Tecnologias para la educación
 
Universidad tecnologica equinoccial solis villalta doris remache bunci manu...
Universidad tecnologica equinoccial  solis villalta doris  remache bunci manu...Universidad tecnologica equinoccial  solis villalta doris  remache bunci manu...
Universidad tecnologica equinoccial solis villalta doris remache bunci manu...
 
Novas Tecnologias
Novas TecnologiasNovas Tecnologias
Novas Tecnologias
 
Presentación del sistema genesis y portal institucional j a
Presentación del sistema genesis y portal institucional j aPresentación del sistema genesis y portal institucional j a
Presentación del sistema genesis y portal institucional j a
 
Chuyen de ban_chinh
Chuyen de ban_chinhChuyen de ban_chinh
Chuyen de ban_chinh
 
OTS-US Staffing Services
OTS-US Staffing ServicesOTS-US Staffing Services
OTS-US Staffing Services
 
Automatisez votre gestion de MongoDB avec MMS
Automatisez votre gestion de MongoDB avec MMSAutomatisez votre gestion de MongoDB avec MMS
Automatisez votre gestion de MongoDB avec MMS
 
Biochemistry sample
Biochemistry sampleBiochemistry sample
Biochemistry sample
 
Tecnologia 3 d
Tecnologia 3 dTecnologia 3 d
Tecnologia 3 d
 
MongoDB WiredTiger Internals
MongoDB WiredTiger InternalsMongoDB WiredTiger Internals
MongoDB WiredTiger Internals
 

Similar to Tout ce que le getting started MongoDB ne vous dira pas

2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp012014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01MongoDB
 
Support Formation vidéo: MongoDB pour débutant
Support Formation vidéo: MongoDB pour débutantSupport Formation vidéo: MongoDB pour débutant
Support Formation vidéo: MongoDB pour débutantSmartnSkilled
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB MongoDB
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDBMongoDB
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Jean Gabès
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - ElasticsearchDavid Pilato
 
Installation de mongo_db_sur_windows_xp
Installation de mongo_db_sur_windows_xpInstallation de mongo_db_sur_windows_xp
Installation de mongo_db_sur_windows_xpsaidelfazni
 
Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)Alexandre Marie
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielleDavid Buros
 
MongoDB_presentation_p.pptx
MongoDB_presentation_p.pptxMongoDB_presentation_p.pptx
MongoDB_presentation_p.pptxZALIMAZA
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.MongoDB
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinLudovic Piot
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide
 

Similar to Tout ce que le getting started MongoDB ne vous dira pas (20)

2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp012014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
 
Support Formation vidéo: MongoDB pour débutant
Support Formation vidéo: MongoDB pour débutantSupport Formation vidéo: MongoDB pour débutant
Support Formation vidéo: MongoDB pour débutant
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDB
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
 
Hello mongo
Hello mongoHello mongo
Hello mongo
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - Elasticsearch
 
Installation de mongo_db_sur_windows_xp
Installation de mongo_db_sur_windows_xpInstallation de mongo_db_sur_windows_xp
Installation de mongo_db_sur_windows_xp
 
Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
 
MongoDB_presentation_p.pptx
MongoDB_presentation_p.pptxMongoDB_presentation_p.pptx
MongoDB_presentation_p.pptx
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 

More from Bruno Bonnin

[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)Bruno Bonnin
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache PulsarBruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Bruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Bruno Bonnin
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.jsBruno Bonnin
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Bruno Bonnin
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !Bruno Bonnin
 
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Bruno Bonnin
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBruno Bonnin
 

More from Bruno Bonnin (13)

[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !
 
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 

Tout ce que le getting started MongoDB ne vous dira pas

  • 1. BreizhCamp 2015 #BzhCmp #MongoDB #bzhcmp BreizhCamp 2016 #BzhCmp Tout ce que le getting started MongoDB ne vous dira pas Bruno BONNIN - @_bruno_b_ Pierre-Alban DEWITTE - @padewitte
  • 4.
  • 5. Getting started with MongoDB # Installation de Mongodb > sudo apt-get install mongodb # Lancement du serveur > sudo service mongod start # Import de données > mongoimport --db test --collection restaurants --drop --file primer-dataset. json # Lancement du shell > mongo // On s’amuse avec quelques commandes CRUD >>> db.restaurants.insert(...) >>> db.restaurants.find(...) >>> db.restaurants.delete(...)
  • 7. ● Cette présentation est truffée de mauvaise foi ● Ne prenez pas tout, adaptez vous à votre contexte ● Notre but est de vous donner envie d’aller chercher la bonne information
  • 8. 1. Développer efficacement 2. Préparer la production 3. Exploiter 4. Avant de se quitter
  • 11. Des documents ! ● MongoDB stocke des documents ○ Structure de données hiérarchique ○ Un champ peut être un type de base (entier, string, booléen), une liste, un objet (on parle de sous- document)
  • 12. Comparaison RDBMS MongoDB Database Database Table Collection Enregistrement Document Colonne Champ Index Index Jointure $lookup, sous-document, lien
  • 13. Modèle relationnel et normalisation ● Data rangées dans les bonnes cases, pas de redondance de l’information ○ C’est beau, c’est carré ! ● Mais, attention aux performances lors des recherches sur les disques de l’info dans les différentes tables
  • 14. La réponse de MongoDB Pensez... Dénormalisation Documents Usages Personne nom adresseId ... ... Adresse id code_postal ville ... ... ... Personne { nom: “...”, code_postal: “...”, ville: “...” } Personne { nom: “...”, adresse: { code_postal: “...”, ville: “...” } }
  • 15. Document, sous-document, ... Pourquoi tout mettre dans un seul doc ? ● locality : stockage de toute l’info au même endroit sur le disque ● consistency : comme il n’y pas de transaction, MongoDB assure que l’update d’un doc est atomique
  • 16. Document, sous-document, ... Pourquoi ne pas tout mettre dans un seul doc ? ● On peut récupérer plus d’info qu’on n’en a réellement besoin ○ on peut utiliser les projections dans les queries (ok d’un point de vue réseau), ○ mais cela n’empêche le document d’ être entirèrement présent en mémoire avant d’être retourné au client
  • 17. Références entre docs Pourquoi séparer dans plusieurs docs ? ● Flexibilité ● Cardinalité forte / gros document: ○ Attention à la place mémoire (document déserialisé en mémoire) ○ Taille max des docs: 16Mo
  • 18. Références entre docs Pourquoi ne pas séparer dans plusieurs docs ? ● On risque d’avoir à gérer des jointures dans l’application, compliqué ! ● Ou utilisation de $lookup : a des contraintes fortes !
  • 19. Modélisation: quelques règles simples 1..1 1 seule collection Personne - Avec un sous-document “carte_vitale” Collection “Personne” { nom: “...”, carte_vitale: { date_emission: “...”, cnam: “...” } } Personne Carte Vitale
  • 20. Modélisation: quelques règles simples 1 seule collection Personne - Avec une liste de sous- documents “adresse” 1..peu Collection “Personne” { nom: “Séraphin Lampion”, adresses: [ { rue: “rue de la Roquette”, ville: “Paris” }, { rue: “chemin du chateau”, ville: “Moulinsart” } ] } Personne Adresse
  • 21. Modélisation: quelques règles simples 2 collections Voiture et Composant - C’est Voiture qui référence les composants 1..beaucoup Collection “Voiture” { marque: “...”, modele: “...”, composants: [ “Id_101”, “Id_22”, “Id_345”, … ] } Voiture Composant Collection “Composant” { id: “...”, type: “...”, prix: ... }
  • 22. Modélisation: quelques règles simples 2 collections Systeme et Log - C’est Log qui référence le parent ! 1..énormément Collection “Système” { id: “...”, host: “...”, ... } Système Log Collection “Log” { date: “...”, level: “...”, id_systeme: “...” }
  • 23. Et concernant l’usage... Ne pas oubliez d’en tenir compte ! ● “J’ai besoin de l’ensemble des données à chaque requête” ○ Mettez tout dans une seule collection ● “J’ai besoin d’en avoir seulement une partie” ○ Faites plusieurs collections et des références ○ Ex: les posts d’un blog et leurs commentaires : ■ 2 besoins : affichage liste des posts + affichage post avec commentaires ■ Modélisation avec 2 collections (posts, comments)
  • 24. $lookup Des jointures ! c’est un début… ● Left outer join ● Uniquement avec des collections non shardées Collection Conference { “title”: “Plein de mots-clefs hyper cools...”, “description”: “Refaites votre SI avec tout ça, sinon vous êtes mort!”, “speaker_id”: “techno_maniac” } Collection Speaker { “_id”: “techno_maniac”, “name”: “Jean-Marcel Le Maniac”, “email”: “le_maniac@breizhcamp.org” } Exemple $lookup db.Conference.aggregate( [ { “$lookup”: { “from”: “Speaker”, “localField”: “speaker_id”, “foreignField”: “_id”, “as”: “speaker_infos” } } ] ) [ { “title”: “Plein de mots-clefs hyper cools...”, “description”: “Refaites votre SI avec…”, “speaker_id”: “techno_maniac”, “speaker_infos”: [ { “_id”: “techno_maniac”, “name”: “Jean-Marcel Le Maniac”, “email”: “le_maniac@breizhcamp.org” } ] }, … ]
  • 25. $lookup Collection Conference { “title”: “Plein de mots-clefs hyper cools...”, “description”: “Refaites votre SI avec ça”, “speaker_ids”: [ “miss_techno”, “techno_maniac” ] } Exemple $lookup db.Conference.aggregate( [ { $unwind: “$speaker_ids” }, { $lookup: { from: “Speaker”, localField: “speaker_ids”, foreignField: “_id”, as: “speakers_infos” } }, { $group: { _id: “$_id”, title: { $first: “$title” }, speakers: { $push: “$speakers_infos” } } } ] ) { “title”: “Plein de mots-clefs hyper cools...”, “speakers”: [{ “_id”: “miss_techno”, “name”: “Jeanne-Irene La Maniac”, “email”: “miss_techno@breizhcamp.org” }, { “_id”: “techno_maniac”, “name”: “Jean-Marcel Le Maniac”, “email”: “le_maniac@breizhcamp.org” } ] }, { ... }, … Avec des listes, jouez avec $unwind et $group
  • 26. “C’est un art plus qu’une science!”
  • 27. Usages ! Usages ! Usages ! Usages ! Usages ! Usages !
  • 30. ● La GUI n’est pas une priorité pour MongoDB ● Les meilleurs outils gratuits sont maintenus par des personnes de MongoDB Choisir une interface graphique
  • 31.
  • 32. Robot Mongo ● C’est codé avec un vrai langage (C++) ● Est globalement à la traine sur le support de fonctionnalités ● Pensez à utiliser les beta ● Plutot complet ● Robuste et stable
  • 33.
  • 34. Mongo Chef ● La seule GUI de niveau professionnel ● A été mis à jours très rapidement les deux dernières années ● Très complet pour du développement comme de l'administration ● Le top coute 149 $ par an
  • 36. Mongo-hacker ● Le shell MongoDB vitaminé ○ Colorisation ○ Alias pour compter collections, documents et indexes ○ Alias pour aggrégations gcount, gavg, gsum ● Toujours nécessaire notamment quand la base n’est pas accessible directement https://github.com/TylerBrock/mongo-hacker
  • 37. M ● Equivalent pour mongodb de n pour node ● Simplification du téléchargement ● Changement en une commande de version mongodb https://github.com/aheckmann/m
  • 38. Démo
  • 40. ORM ou plutôt ODM Avant-propos: eh oui, on est mono-maniaque et on ne développe qu’en Java ! ● Driver Java ○ Évolue bien, mais bas niveau ● Morphia ○ Intéressant ● Spring Data MongoDB ○ C’est Spring... ● Hibernate OGM ○ Heu... ● Jongo ○ Fun !
  • 41. Driver Java 3.0 Nouvelles classes (les anciennes sont toujours là, hélas…) // A OUBLIER !!!! DB db = mongoClient.getDB("breizhcamp2016"); DBCollection dbCollection = db.getCollection("conferences"); Iterator<DBObject> confIter = dbCollection.find().iterator(); // Utilisation d’un mapper pour convertir les DBObjects en objets métier MongoDatabase db = mongoClient.getDatabase("breizhcamp2016"); MongoCollection<Document> dbCollection = db.getCollection("conferences"); // Ou en utilisation directe de la classe métier MongoCollection<Conference> dbCollection = db.getCollection("conferences", Conference.class); MongoCursor<Conference> conferences = confCollection.find().iterator(); // Il ne faut pas oublier de déclarer un codec pour la classe Conference
  • 42. Driver Java 3.0 Codec: permet de gérer finement le codage en BSON (est-ce bien utile ? bof...) public class ConferenceCodec implements Codec<Conference> { @Override public void encode(BsonWriter writer, Conference conf, EncoderContext ctx) { } @Override public Class<Conference> getEncoderClass() { return Conference.class; } @Override public Conference decode(BsonReader reader, DecoderContext ctx) { } } public class ConferenceCodecProvider implements CodecProvider { @Override public <T> Codec<T> get(Class<T> clazz, CodecRegistry registry) { if (clazz == Conference.class) { return (Codec<T>) new ConferenceCodec(); } return null; } } Utilisation d’un codec générique (projet à suivre!): ➔ https://github.com/ylemoigne/mongo-jackson-codec
  • 43. Driver Java 3.0 Async API (mêmes noms de classes, pas le même package) // Async Database et Collection // MongoDatabase db = client.getDatabase("breizhcamp2016"); MongoCollection<Conference> collection = db.getCollection("conferences", Conference.class); Conference conference = new Conference( "Framework TrucMachinChoseJS et Dockerification de mes microservices", "C'est trop cool !", new Speaker("JsAndDockerAndMicroServicesManiac")); // Insertion d’un élément => il faut fournir une callback // collection.insertOne(conference, (final Void result, final Throwable t) -> { System.out.println("Conference inserée"); });
  • 44. Morphia Nécessaire et suffisant Morphia morphia = new Morphia(); morphia.map(Conference.class, Speaker.class); Datastore datastore = morphia.createDatastore(client, "breizhcamp2016"); Conference conf = new Conference("Have fun With MongoDB", "@padewitte", "@_bruno_b_"); datastore.save(conf); List<Conference> confWithPAD = datastore.find(Conference.class) .filter("speakers", "@padewitte") .field("speakers").sizeEq(1) .asList(); datastore.createAggregation(Conference.class) .unwind("speakers") .project(projection("twitterHandle", "speakers"), projection("title")) .group("twitterHandle", grouping("conferences", addToSet("title"))) .out(Speaker.class);
  • 45. Pas de transaction, mais... Ne pas oublier qu’il existe des méthodes findAndXXX permettant d’exécuter des actions de manière atomique FindOneAndUpdateOptions options = new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER); // UpdatedConf contient les données de la conférence suite à la modif Conference updatedConf = confCollection.findOneAndUpdate( new Document(), // Query new Document("$push", new Document("speakerIds", "pad")), // Update options);
  • 49. Estimer la volumétrie 1. Prototyper et concevoir une première version du schéma 2. Extraire les statistiques de taille de chaque collection pour les datas et les index a. taille moyenne des datas b. taille moyenne des indexes 3. Pour chaque collection, estimer un nombre de documents 4. Appliquer un coefficient multiplicateur (un conseil, à cacher le dans une formule d’excel)
  • 50. Extraire les statistiques > show collections > count docs > count index > db.macollection.count() > db.macollection.stats(1024*1024)
  • 51. Le working set ● Portion des données utilisée fréquemment ● Attention aux batchs réalisant une lecture complète d’une collection ● Idéalement la taille du working set doit correspondre à la taille de la RAM
  • 52. Taille sur disque d’une collection Taille moyenne d’un document Taille data=* Nb de doc. Taille moyenne des indexes Taille indexes=* Nb de doc. = Taille sur disque +
  • 53. Taille du working-set d’une collection Taille moyenne d’un document Taille data=* Nb de doc. Taille moyenne des indexes Taille indexes=* Nb de doc. = Taille working-set + Proportion data utile *
  • 55. Chemins de migration Peu d’outillage disponible
  • 56. mongo-connector ● Ecrit et maintenu par MongoDB en python ● Permet de copier depuis MongoDB vers : ○ ElasticSearch ○ Solr ○ Mongodb ○ Postgresql ● Peut permettre de synchroniser une base de préproduction avec la production simplement ● Idéal pour des duplications sans transformation https://github.com/mongodb-labs/mongo-connector
  • 57. Apache Camel & Groovy def ds = new OracleDataSource(... ) SimpleRegistry registry = new SimpleRegistry(); registry.put("myDataSource", ds); def camelContext = new DefaultCamelContext(registry) camelContext.addRoutes(new RouteBuilder() { def void configure() { from("direct:EXTRACT_SQL") .setHeader("table", constant("CONFERENCES")) .setBody().constant("select * where (CONFERENCES.DATMAJ > sysdate - 2 )") .to("jdbc:myDataSource? outputType=StreamList&useHeadersAsParameters=true") .split(body()).streaming().process(confProcessor) .to("mongodb: myDb?database=mymongo_databse&collection=conferences&operation=save") .end() } }) camelContext.start() // send a message to the route ProducerTemplate template = camelContext.createProducerTemplate(); template.sendBody("direct:EXTRACT_SQL", "Starting migration"); camelContext.stop()
  • 61. Configurer un replica-set Rien de plus simple ! ● Sur chacun de vos serveurs: ● Connexion sur un des nodes: $ mongod --dbpath /data/mongo --replSet breizhcamp_rs $ mongo --host mongod-node1 MongoDB shell version: 3.2.4 connecting to: mongod-node1:27017/test > > rs.initiate({_id:"breizhcamp_rs", members:[ {_id:0,host:"mongod-node1:27017"}, {_id:1,host:"mongod-node2:27017"}]}) {"ok":1} breizhcamp_rs:PRIMARY>
  • 63. Adapter le write et read concern https://docs.mongodb.org/manual/core/replica-set-write-concern/ https://docs.mongodb.org/manual/core/read-preference/ WRITE READ (≥ 3.2)
  • 66. Storage engine MongoDB s’adapte aux différents use cases en fournissant plusieurs moteurs de stockage ● MMAPv1: présent depuis le début ● WiredTiger : depuis la 3.0 et par défaut à partir de la 3.2 ● In memory (beta) ● Autres futurs moteurs Pour un noeud donné, on ne peut pas changer de type, mais on peut avoir des nodes avec diff. engines
  • 67. Mettez un tigre dans votre moteur Super performant en écriture ! ➔ Lock au niveau du document (et plus au niveau de la collection) Gain de place: ➔ Support de la compression pour les collections, les index, les journaux ○ Snappy: par défaut pour les docs et les journaux ■ 70% de taux de compression, peu de surcoût en CPU ○ Zlib: meilleure compression (mais surcoût de CPU) Sécurité: ➔ Support du chiffrement au niveau du stockage (uniquement pour MongoDB enterprise)
  • 69. Stockage : dans la vraie vie... 30 millions de docs (10 ko chaque), 20 index
  • 70. Et pour finir, soyons joueur ! ● Plusieurs types peuvent co-exister au sein d’ un même replica set ● On peut imaginer: ○ Un node pour les lectures => MMAPv1 ○ Un node pour les écritures => WiredTiger Node 1 avec WiredTiger Node 2 avec MMAPv1 Data ingestion Data Read Replica set
  • 76. Tag Aware Sharding Il existe certainement d’autres bases de données adaptées à de tels besoins
  • 78. Testez en environnement cible ● Update et remove doivent inclure la clé de sharding ● La lecture sur les secondaires est à éviter tant que possible (orphans) ● Limites sur l’aggrégation ○ pas de join depuis une collection shardée ○ optimisation largement dépendante des données
  • 79. Si jamais vous êtes encore motivés ● Sans réseau correct point de salut ● Colocaliser les MongoS avec vos applications ● N’oubliez pas de sauvegarder les MongoS (pas de reconstruction possible simplement) ● Faites vérifier votre architecture par un ami
  • 80. Quand sharder ? ● Quand ce n’est pas votre premier projet MongoDB en production ● Quand vous pouvez acheter quelques machines de plus (à minima triplement du nombre de machine) ● Quand il n’est pas possible de faire autrement ○ Envisager d’abord la scalabilité verticale ○ Monitorer la taille de votre working set pour anticiper le plus possible cette opération
  • 81. Les points d’attention ● Privilegier autant que possible le sharding haché ● Surveiller les plages de lancement du balancer ● Nettoyer régulièrement les orphans ● Ne jamais lire sur un secondary si l’ exactitude de la donnée est critique https://docs.mongodb. org/manual/reference/command/cleanupOrphaned/
  • 84. Mongo tools ● Log avec requêtes lentes et cursor. explain() ● mongotop : stats (temps) lecture/ecriture par collection ● mongostat : stats système de l’instance ○ insert, query, update, delete (nombre de requêtes/s) ○ getmore command flushes ○ mapped (MMAPv1), vsize, res ○ faults (MMAPv1) ○ qr|qw (queue) ○ ar|aw (active clients)
  • 85. Mtools ● La boite à outils indispensable pour analyser les logs https://github.com/rueckstiess/mtools
  • 87. Les points de supervision système ● Espace libre ● Nombre de connexions réseau ● Nombre de fichiers ouverts ● Mémoire utilisée Dans le cas d’un replica-set : ● Statut dans le replica-set ● Présence de fichiers dans le répertoire rollbacks https://docs.mongodb.org/manual/core/replica-set-rollbacks/
  • 88. Les solutions Pas de plugin permettant la découverte automatique ● Zabbix ○ Set de graph et d’alarmes préconfigurées ○ Il faudra mettre les mains dans PHP ● Nagios ○ Nombreux check à ajouter ○ Accompagné du plugin CACTI il est aisé de se construire une métrologie ○ Il faudra mettre les mains dans Python ● Votre script dans votre langage de prédiletion https://github.com/nightw/mikoomi-zabbix-mongodb-monitoring https://github.com/mzupan/nagios-plugin-mongodb
  • 89. Métrologie ● Définir des alertes sur événements ou seuil est important ● En cas de problème de performance complexe avoir grapher les métriques clefs auparavant est encore plus important
  • 91. MongoDump / MongoRestore ● Tool de Mongo permettant la sauvegarde ● Dans le cas d’un replica set utiliser l’option -- oplog à la sauvegarde et la restauration pour backuper un maximum d’ enregistrement ● Il est nécessaire d’avoir la place disponible et peut prendre beaucoup de temps
  • 92. Copie des fichiers ● Il est possible de backuper par copie des fichiers ● Dans le cas de NMAP il est indispensable d’ activer le journal et que celui ci soit présent sur le même volume que les données ● Dans le cas d’un replica set préférer la sauvegarde sur le primary ou alors s’assurer que le secondary source de la sauvegarde n’ est pas en retard ● Si vous pouvez vous le permettre préférer stopper l’instance
  • 93. Faire son propre “Point in time …” ● Si jamais vous avez un oplog couvrant l'intervalle de temps entre une sauvegarde et le moment auquel vous pouvez restaurer il est possible de ne pas perdre de données ● Commencer par isoler un membre puis sauvegarder l’oplog ● http://www.codepimp.org/2014/08/replay- the-oplog-in-mongodb/ ● A tester absolument dans un environnement non cible la première fois
  • 94. MongoDB Cloud Manager Backup ● De loin la solution la plus simple mais nécessite une souscription ● Fonctionne par lecture de l’oplog en continue ● Permet le point in time recovery ● Disponible dans le cloud ou dans votre réseau ● Si auo-herbergé la machine de backup doit être aussi puissante avec encore plus de stockage que vos autres machines
  • 95. Solution idéale ● Un backup idéal est un backup testé ● Pour des petits volumes MongoDump est suffisant ● Les outils de MongoDB corp sont clairement plus simple à utiliser
  • 97. Avant de se quitter
  • 99. Gérer son projet Concevoir Développer QualifierEvaluer les performances
  • 100. ● Un bon schéma doit répondre : ○ Aux besoins métier ○ Aux exigences de performance ● Pour bien connaitre le besoin, il faut le développer et le tester ● Pour savoir si l’application répond aux exigences de performance, il faut la tester ● Les tests doivent commencer avec le développement ● Pour tester rapidement, il faut déployer rapidement En résumé
  • 103. Les liens à connaitre https://docs.mongodb. org/manual/administration/production- checklist/ https://docs.mongodb. org/manual/faq/diagnostics/