BreizhCamp 2015 #BzhCmp
MongoDB et Elastic,
meilleurs ennemis ?
Sébastien Prunier
Chris Woodrow
#MongoElastic
A propos de nous
Sébastien Prunier
Développeur@Serli
Craftman
MongoAddict
Chris Woodrow
Développeur@Serli
DataCurious
Elas...
Serli
Société de conseil et d’ingénierie
Développement, expertise, R&D, formation
70 personnes
Contribution à des projets ...
Petit sondage ...
MongoDB
Base de données NoSQL
2007 par 10gen
C++
Orientée documents
Open Source (2009)
Licence AGPL
Elastic{Search}
Moteur de recherche distribué
2010 par Shay Banon
Java - Basé sur Lucene
Orientée documents
Open Source
Li...
Projets types Mongo et Elastic
● Applications satellites
○ Vision 360°
● Business Intelligence
● Open data
● Moteur de rec...
Beaucoup de points communs
● Orientées documents (JSON)
● Distribuées
● Schemaless
● Indexes secondaires
● Aggrégations
● ...
Mongo ou Elastic ?
La tronçonneuse ...
... ou la batte ?
Comment choisir ?
Popularité ?
db-engines.com
Méthode pas très fiable ...
Démarrage
rapide
Developer friendly
Download,
Unzip,
Run,
Play !
Vers le Minimum Viable Product
Installation d’un cluster Elastic
2 minutes
cluster.name: my_cluster
$ ./elasticsearch
$ ./elasticsearch
config/elasticsea...
Installation d’un replicaset Mongo
$ mongod --dbpath=~/mongo-data/0 --replSet rs0
$ mongod --dbpath=~/mongo-data/1 --replS...
Noeud pour les tests en Java
Settings settings = ImmutableSettings. builder()
.put("http.port", "9200")
.put("network.host...
Indexation
Indexation dans Elastic
Basé sur un index inversé
mapping → analyse des données
Near Real-Time
Index Inversé
ElasticSearch (Lucene) : index inversé.
Doc #1 “La Vie de Brian”
Doc #2 “Le Sens de la vie”
● Stop words
● M...
Vous avez bien dit Near real-time?
Flush périodiques (1s) -> optimiser Lucene
Est-ce vraiment important ?
Near real-time?
Indexation dans MongoDB
Requête possible sur un attribut même s’il n’est
pas indexé (attention cependant aux perfs !)
Mise à jour dans Elastic
Réindexation totale du document
(même avec _update!)
Suppression du document puis recréation
Mise à jour dans MongoDB
db.collection.update()
Remplacement d’un document, ou modification
partielle via un opérateur ($s...
Relations
Disclaimer
Attention
Si vous devez faire des jointures :
● Soit vous avez mal modélisé vos documents
● Soit c’est légitime...
Relations dans MongoDB
Deux possibilités :
● Référence à un _id d’un autre document
● Utilisation d’un objet DBRef
Dans le...
Relations dans MongoDB
Annonce pour la version 3.2 : $lookup (!?!)
Parent/Child
Un document est lié à son parent
Une solution au problème des updates
Impact sur les perfs
Contraintes techni...
Full text
search
Je veu fair du fotbal
MongoDB Full Text Search
Agrégations
Pour compter, grouper, ... les données
Les agrégations
MongoDB aggregation pipeline
json
json
json
json
$match $unwind $group
$sum $avg $min $max
$addToSet$year $month$week
Deux types d’aggrégations : Bucket ou Metrics
Combiné à la recherche (queries + filters)
Les agrégations dans Elastic
2015...
Stockage de
fichiers
GridFS
Limite de BSON à 16 MB
Fichiers stockés en morceaux (chunks)
Attention à la façon dont le fichier est
reconstitué (...
Elastic : Attachment Type
Les fichiers sont stockés encodés en Base 64
Pas de streaming
Analyse avec Apache Tika
Par défau...
GridFS / Attachment Type
Pour stocker des fichiers...
Plusieurs solutions pour stocker beaucoup de
fichiers
● HDFS, Ceph, ...
● Amazon S3, Google C...
Modèle
distribué
Réplication & Sharding
Réplication
duplication des données (redondance)
→ haute disponibilité
Sharding
répartition des don...
Master
MongoDB et Elastic : Master Node
Si le master tombe, les noeuds restants élisent
un nouveau master
Quorum de noeuds...
Sharding
Dans MongoDB : Configurable
Dans Elastic : By design mais limitant
Immuable
nbNoeudsMax = nbShards x nbRépliques
Jepsen : outil de test des systèmes distribués
En cas de partionnement
Call me maybe : Kyle Kingsbury
https://aphyr.com/ta...
Problèmes de durabilité
Mettez les chances de votre côté !
Work In Quick Progress : http://bit.ly/1FWvOr2
Call me maybe - ...
Problèmes de cohérence
(Stale Read / Dirty Read)
Certains bugs fixés, d’autres en cours (3.2)
Call me maybe - MongoDB
Performances
Benchmark
Un article sur Quarkslab's blog l’affirme, Elastic
est bien plus performant que MongoDB
Benchmark
Une étude de l’Université de Zaria est sans
appel, MongoDB est nettement plus performant
que Elastic
Benchmarks sucks !
Production
Objectif : Séduire les développeurs
Pas mal d’”ajustements” pour passer en prod
Systèmes vivants !
Configuration
Sécurisation
Monitoring
Tuning
Automatisation
Ecosystème
Ecosystème MongoDB
Drivers dans beaucoup de langages
Tooling en Go (v3)
Mongo-Hacker (shell extension)
Beaucoup de GUI (ma...
Ecosystème MongoDB
MMS / OpsManager
Client Elastic
Client natif pour Java (protocole binaire)
API REST
Simple à mettre en oeuvre
Des clients pour tous les lan...
Un écosystème très dense :
Kibana : Data Viz
Logstash : ETL
Shield : Sécurité
Marvel : Supervision
...
Ecosystème Elastic
Cloud
Des offres SaaS pour les deux :
MongoDB
MongoLab, MongoSoup, MongoHQ
Elastic
Found, Bonsai, Search
Faire un choix
Alors? MongoDB ou ElasticSearch?
Tronçonneuse? Batte?
Oui Oui
Non Updates
Fréquents?
Full Text?
Problèmes très
Complexes?
...
Pour résumer
MongoDB
Update
Temps réél
Elastic
Fonctionnalités
Ecosystème
Bénéficier des avantages des deux.
Minimiser les inconvénients de chacun.
Les deux ?
Même paradigme
Deux bases orientées documents.
Pas besoin de remodéliser (généralement)
Architecture
Une solution
Ecrire dans MongoDB
Lire et rechercher dans Elastic
read/write read
Mais ...
read
?
Comment synchroniser ?
read/write
MongoRiver
read
polling
oplog river
read/write
Ecrire dans les deux
read
write
read/write
Batch maison
readread/write
Message Queue
read
write
consumer
push
write
read/write
Conclusion
Le bon outil pour le bon
usage !
Merci !
Prochain SlideShare
Chargement dans…5
×

[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

1 201 vues

Publié le

MongoDB ? Elastic ? Ces technologies sont elles faites pour être concurrentes ?

C'est l'histoire d'une rencontre entre deux technologies. A l'occasion de cette conférence vous apprendrez comment MongoDB et Elastic peuvent se compléter, comment tirer partie du meilleur de chaque monde : "le bon outil pour le bon usage".

Enfin, nous vous présenterons les principaux patterns d'architecture permettant d'intégrer ces deux technologies.

Publié dans : Technologie
0 commentaire
7 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 201
Sur SlideShare
0
Issues des intégrations
0
Intégrations
46
Actions
Partages
0
Téléchargements
61
Commentaires
0
J’aime
7
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

  1. 1. BreizhCamp 2015 #BzhCmp MongoDB et Elastic, meilleurs ennemis ? Sébastien Prunier Chris Woodrow #MongoElastic
  2. 2. A propos de nous Sébastien Prunier Développeur@Serli Craftman MongoAddict Chris Woodrow Développeur@Serli DataCurious ElasticJunkie
  3. 3. Serli Société de conseil et d’ingénierie Développement, expertise, R&D, formation 70 personnes Contribution à des projets OSS Membre du JCP
  4. 4. Petit sondage ...
  5. 5. MongoDB Base de données NoSQL 2007 par 10gen C++ Orientée documents Open Source (2009) Licence AGPL
  6. 6. Elastic{Search} Moteur de recherche distribué 2010 par Shay Banon Java - Basé sur Lucene Orientée documents Open Source Licence Apache
  7. 7. Projets types Mongo et Elastic ● Applications satellites ○ Vision 360° ● Business Intelligence ● Open data ● Moteur de recherche ● Backend mobile ● Objets connectés
  8. 8. Beaucoup de points communs ● Orientées documents (JSON) ● Distribuées ● Schemaless ● Indexes secondaires ● Aggrégations ● Recherche géographique
  9. 9. Mongo ou Elastic ? La tronçonneuse ... ... ou la batte ?
  10. 10. Comment choisir ?
  11. 11. Popularité ?
  12. 12. db-engines.com
  13. 13. Méthode pas très fiable ...
  14. 14. Démarrage rapide
  15. 15. Developer friendly Download, Unzip, Run, Play !
  16. 16. Vers le Minimum Viable Product
  17. 17. Installation d’un cluster Elastic 2 minutes cluster.name: my_cluster $ ./elasticsearch $ ./elasticsearch config/elasticsearch.yml
  18. 18. Installation d’un replicaset Mongo $ mongod --dbpath=~/mongo-data/0 --replSet rs0 $ mongod --dbpath=~/mongo-data/1 --replSet rs0 --port 27018 $ mongod --dbpath=~/mongo-data/2 --replSet rs0 --port 27019 Le sharding est une autre histoire ... rs.initiate() rs.add("<hostname>:27018") rs.add("<hostname>:27019") mongo shell
  19. 19. Noeud pour les tests en Java Settings settings = ImmutableSettings. builder() .put("http.port", "9200") .put("network.host" , "localhost") .put("path.data", "/tmp/es-local-data" ) .build(); Node node = NodeBuilder. nodeBuilder() .local( true) .data(true) .clusterName( "elasticSearch" ) .settings(settings) .build(); node.start();
  20. 20. Indexation
  21. 21. Indexation dans Elastic Basé sur un index inversé mapping → analyse des données Near Real-Time
  22. 22. Index Inversé ElasticSearch (Lucene) : index inversé. Doc #1 “La Vie de Brian” Doc #2 “Le Sens de la vie” ● Stop words ● Minification ● ASCII folding ● Langages ● ... Terme Documents brian #1 sens #2 vie #2, #1 Sans full-text : not_analyzed
  23. 23. Vous avez bien dit Near real-time? Flush périodiques (1s) -> optimiser Lucene Est-ce vraiment important ? Near real-time?
  24. 24. Indexation dans MongoDB Requête possible sur un attribut même s’il n’est pas indexé (attention cependant aux perfs !)
  25. 25. Mise à jour dans Elastic Réindexation totale du document (même avec _update!) Suppression du document puis recréation
  26. 26. Mise à jour dans MongoDB db.collection.update() Remplacement d’un document, ou modification partielle via un opérateur ($set, $pull, $push …) Options : multi (false par défaut), upsert
  27. 27. Relations
  28. 28. Disclaimer Attention Si vous devez faire des jointures : ● Soit vous avez mal modélisé vos documents ● Soit c’est légitime … et vous avez choisi la mauvaise base !
  29. 29. Relations dans MongoDB Deux possibilités : ● Référence à un _id d’un autre document ● Utilisation d’un objet DBRef Dans les deux cas → plusieurs requêtes !
  30. 30. Relations dans MongoDB Annonce pour la version 3.2 : $lookup (!?!)
  31. 31. Parent/Child Un document est lié à son parent Une solution au problème des updates Impact sur les perfs Contraintes techniques Relations dans Elastic
  32. 32. Full text search
  33. 33. Je veu fair du fotbal
  34. 34. MongoDB Full Text Search
  35. 35. Agrégations
  36. 36. Pour compter, grouper, ... les données Les agrégations
  37. 37. MongoDB aggregation pipeline json json json json $match $unwind $group $sum $avg $min $max $addToSet$year $month$week
  38. 38. Deux types d’aggrégations : Bucket ou Metrics Combiné à la recherche (queries + filters) Les agrégations dans Elastic 2015 Date Bucket Term Bucket “weapon” avg “budget” Query type = “nanard” 1974json json jsonjson jsonjson 2015 batte sabre 1974 gun sabre 2015 sabre 145.3 1974 pistolet 2.4 sabre 0.34 batte 245.3
  39. 39. Stockage de fichiers
  40. 40. GridFS Limite de BSON à 16 MB Fichiers stockés en morceaux (chunks) Attention à la façon dont le fichier est reconstitué (streaming ?) Pas de lien direct vers le fichier
  41. 41. Elastic : Attachment Type Les fichiers sont stockés encodés en Base 64 Pas de streaming Analyse avec Apache Tika Par défaut 100000 charactères Pas de lien direct vers le fichier Limite théorique : 2Go
  42. 42. GridFS / Attachment Type
  43. 43. Pour stocker des fichiers... Plusieurs solutions pour stocker beaucoup de fichiers ● HDFS, Ceph, ... ● Amazon S3, Google Cloud Storage, ...
  44. 44. Modèle distribué
  45. 45. Réplication & Sharding Réplication duplication des données (redondance) → haute disponibilité Sharding répartition des données sur plusieurs shards → scalabilité horizontale
  46. 46. Master MongoDB et Elastic : Master Node Si le master tombe, les noeuds restants élisent un nouveau master Quorum de noeuds : Eviter le split-brain En cas de partitionnement perte de Disponibilité
  47. 47. Sharding Dans MongoDB : Configurable Dans Elastic : By design mais limitant Immuable nbNoeudsMax = nbShards x nbRépliques
  48. 48. Jepsen : outil de test des systèmes distribués En cas de partionnement Call me maybe : Kyle Kingsbury https://aphyr.com/tags/jepsen
  49. 49. Problèmes de durabilité Mettez les chances de votre côté ! Work In Quick Progress : http://bit.ly/1FWvOr2 Call me maybe - Elastic
  50. 50. Problèmes de cohérence (Stale Read / Dirty Read) Certains bugs fixés, d’autres en cours (3.2) Call me maybe - MongoDB
  51. 51. Performances
  52. 52. Benchmark Un article sur Quarkslab's blog l’affirme, Elastic est bien plus performant que MongoDB
  53. 53. Benchmark Une étude de l’Université de Zaria est sans appel, MongoDB est nettement plus performant que Elastic
  54. 54. Benchmarks sucks !
  55. 55. Production
  56. 56. Objectif : Séduire les développeurs Pas mal d’”ajustements” pour passer en prod
  57. 57. Systèmes vivants ! Configuration Sécurisation Monitoring Tuning Automatisation
  58. 58. Ecosystème
  59. 59. Ecosystème MongoDB Drivers dans beaucoup de langages Tooling en Go (v3) Mongo-Hacker (shell extension) Beaucoup de GUI (mais pas forcément top)
  60. 60. Ecosystème MongoDB MMS / OpsManager
  61. 61. Client Elastic Client natif pour Java (protocole binaire) API REST Simple à mettre en oeuvre Des clients pour tous les langages Parfois les réponses sont un peu “verbeuses”
  62. 62. Un écosystème très dense : Kibana : Data Viz Logstash : ETL Shield : Sécurité Marvel : Supervision ... Ecosystème Elastic
  63. 63. Cloud Des offres SaaS pour les deux : MongoDB MongoLab, MongoSoup, MongoHQ Elastic Found, Bonsai, Search
  64. 64. Faire un choix
  65. 65. Alors? MongoDB ou ElasticSearch? Tronçonneuse? Batte? Oui Oui Non Updates Fréquents? Full Text? Problèmes très Complexes? Non Oui Non Oui Non Oui Un peu tout ça ? Non Oui (les deux) Performances? Oui Performances? Non Oui Oui Non ...
  66. 66. Pour résumer MongoDB Update Temps réél Elastic Fonctionnalités Ecosystème
  67. 67. Bénéficier des avantages des deux. Minimiser les inconvénients de chacun. Les deux ?
  68. 68. Même paradigme Deux bases orientées documents. Pas besoin de remodéliser (généralement)
  69. 69. Architecture
  70. 70. Une solution Ecrire dans MongoDB Lire et rechercher dans Elastic read/write read
  71. 71. Mais ... read ? Comment synchroniser ? read/write
  72. 72. MongoRiver read polling oplog river read/write
  73. 73. Ecrire dans les deux read write read/write
  74. 74. Batch maison readread/write
  75. 75. Message Queue read write consumer push write read/write
  76. 76. Conclusion Le bon outil pour le bon usage !
  77. 77. Merci !

×