77
BreizhCamp 2015 #BzhCmp MongoDB et Elastic, meilleurs ennemis ? Sébastien Prunier Chris Woodrow #MongoElastic

[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Embed Size (px)

Citation preview

Page 1: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

BreizhCamp 2015 #BzhCmp

MongoDB et Elastic,meilleurs ennemis ?

Sébastien PrunierChris Woodrow

#MongoElastic

Page 2: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

A propos de nous

Sébastien PrunierDéveloppeur@Serli

CraftmanMongoAddict

Chris WoodrowDéveloppeur@Serli

DataCuriousElasticJunkie

Page 3: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Serli

Société de conseil et d’ingénierieDéveloppement, expertise, R&D, formation

70 personnes

Contribution à des projets OSS

Membre du JCP

Page 4: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Petit sondage ...

Page 5: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

MongoDB

Base de données NoSQL2007 par 10genC++Orientée documentsOpen Source (2009)Licence AGPL

Page 6: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Elastic{Search}

Moteur de recherche distribué2010 par Shay BanonJava - Basé sur LuceneOrientée documentsOpen SourceLicence Apache

Page 7: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Projets types Mongo et Elastic

● Applications satellites○ Vision 360°

● Business Intelligence● Open data● Moteur de recherche● Backend mobile● Objets connectés

Page 8: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Beaucoup de points communs

● Orientées documents (JSON)● Distribuées● Schemaless● Indexes secondaires● Aggrégations● Recherche géographique

Page 9: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Mongo ou Elastic ?

La tronçonneuse ...

... ou la batte ?

Page 10: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Comment choisir ?

Page 11: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Popularité ?

Page 12: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

db-engines.com

Page 13: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Méthode pas très fiable ...

Page 14: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Démarrage rapide

Page 15: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Developer friendly

Download,Unzip,Run,Play !

Page 16: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Vers le Minimum Viable Product

Page 17: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Installation d’un cluster Elastic

2 minutescluster.name: my_cluster

$ ./elasticsearch$ ./elasticsearch

config/elasticsearch.yml

Page 18: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

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

Page 19: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Noeud pour les tests en JavaSettings 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();

Page 20: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Indexation

Page 21: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Indexation dans Elastic

Basé sur un index inversémapping → analyse des données

Near Real-Time

Page 22: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

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

Page 23: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Vous avez bien dit Near real-time?Flush périodiques (1s) -> optimiser Lucene

Est-ce vraiment important ?

Near real-time?

Page 24: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Indexation dans MongoDB

Requête possible sur un attribut même s’il n’est pas indexé (attention cependant aux perfs !)

Page 25: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Mise à jour dans Elastic

Réindexation totale du document (même avec _update!)

Suppression du document puis recréation

Page 26: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

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

Page 27: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Relations

Page 28: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Disclaimer

AttentionSi 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 !

Page 29: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

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 !

Page 30: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Relations dans MongoDB

Annonce pour la version 3.2 : $lookup (!?!)

Page 31: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Parent/ChildUn document est lié à son parentUne solution au problème des updates

Impact sur les perfsContraintes techniques

Relations dans Elastic

Page 32: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Full text search

Page 33: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Je veu fair du fotbal

Page 34: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

MongoDB Full Text Search

Page 35: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Agrégations

Page 36: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Pour compter, grouper, ... les donnéesLes agrégations

Page 38: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

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”

1974jsonjson jsonjson

jsonjson

2015

batte sabre

1974

gun sabre

2015

sabre145.3

1974

pistolet2.4

sabre0.34

batte245.3

Page 39: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Stockage de fichiers

Page 40: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

GridFS

Limite de BSON à 16 MBFichiers stockés en morceaux (chunks)Attention à la façon dont le fichier est reconstitué (streaming ?)Pas de lien direct vers le fichier

Page 41: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Elastic : Attachment Type

Les fichiers sont stockés encodés en Base 64Pas de streamingAnalyse avec Apache Tika

Par défaut 100000 charactèresPas de lien direct vers le fichierLimite théorique : 2Go

Page 42: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

GridFS / Attachment Type

Page 43: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Pour stocker des fichiers...

Plusieurs solutions pour stocker beaucoup de fichiers● HDFS, Ceph, ...● Amazon S3, Google Cloud Storage, ...

Page 44: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Modèle distribué

Page 45: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Réplication & Sharding

Réplicationduplication des données (redondance) → haute disponibilité

Shardingrépartition des données sur plusieurs shards → scalabilité horizontale

Page 46: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Master

MongoDB et Elastic : Master Node

Si le master tombe, les noeuds restants élisent un nouveau masterQuorum de noeuds : Eviter le split-brainEn cas de partitionnement perte de Disponibilité

Page 47: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Sharding

Dans MongoDB : Configurable

Dans Elastic : By design mais limitantImmuablenbNoeudsMax = nbShards x nbRépliques

Page 48: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Jepsen : outil de test des systèmes distribuésEn cas de partionnement

Call me maybe : Kyle Kingsbury

https://aphyr.com/tags/jepsen

Page 49: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Problèmes de durabilitéMettez les chances de votre côté !

Work In Quick Progress : http://bit.ly/1FWvOr2

Call me maybe - Elastic

Page 50: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Problèmes de cohérence (Stale Read / Dirty Read)

Certains bugs fixés, d’autres en cours (3.2)

Call me maybe - MongoDB

Page 51: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Performances

Page 52: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Benchmark

Un article sur Quarkslab's blog l’affirme, Elastic est bien plus performant que MongoDB

Page 53: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Benchmark

Une étude de l’Université de Zaria est sans appel, MongoDB est nettement plus performant que Elastic

Page 54: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Benchmarks sucks !

Page 55: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Production

Page 56: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Objectif : Séduire les développeursPas mal d’”ajustements” pour passer en prod

Page 57: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Systèmes vivants !

ConfigurationSécurisationMonitoring

TuningAutomatisation

Page 58: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Ecosystème

Page 59: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Ecosystème MongoDB

Drivers dans beaucoup de langagesTooling en Go (v3)Mongo-Hacker (shell extension)Beaucoup de GUI (mais pas forcément top)

Page 60: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Ecosystème MongoDB

MMS / OpsManager

Page 61: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Client Elastic

Client natif pour Java (protocole binaire)API REST

Simple à mettre en oeuvreDes clients pour tous les langages

Parfois les réponses sont un peu “verbeuses”

Page 62: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Un écosystème très dense : Kibana : Data VizLogstash : ETLShield : SécuritéMarvel : Supervision...

Ecosystème Elastic

Page 63: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Cloud

Des offres SaaS pour les deux : MongoDB

MongoLab, MongoSoup, MongoHQ

ElasticFound, Bonsai, Search

Page 64: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Faire un choix

Page 65: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Alors? MongoDB ou ElasticSearch?Tronçonneuse? Batte?

Oui Oui

Non Updates Fréquents?

Full Text?

Problèmes très Complexes?

Non

Oui

Non

OuiNon

Oui

Un peu tout ça ? Non

Oui (les deux)Performances?

Oui

Performances?Non

Oui

Oui

Non

...

Page 66: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Pour résumer

MongoDBUpdateTemps réél

ElasticFonctionnalitésEcosystème

Page 67: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Bénéficier des avantages des deux.Minimiser les inconvénients de chacun.

Les deux ?

Page 68: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Même paradigme

Deux bases orientées documents.Pas besoin de remodéliser (généralement)

Page 69: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Architecture

Page 70: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Une solutionEcrire dans MongoDB

Lire et rechercher dans Elastic

read/write read

Page 71: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Mais ...

read

?Comment synchroniser ?

read/write

Page 72: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

MongoRiver

read

polling

oplog river

read/write

Page 73: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Ecrire dans les deux

read

write

read/write

Page 74: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Batch maison

readread/write

Page 75: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Message Queue

read

write

consumer

push

writeread/write

Page 76: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Conclusion

Le bon outil pour le bon usage !

Page 77: [Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?

Merci !