No sql, au-delà du buzz

1,827 views
1,764 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,827
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

No sql, au-delà du buzz

  1. 1. NoSQL Not only SQL
  2. 2. Un peu d'historique <ul><li>Carlo Strozzi, 1998 -> une BDD &quot;lightweight&quot; open source </li></ul><ul><li>&quot;No SQL&quot; ? -> Pas de SQL. </li></ul><ul><li>&quot;NoRel&quot; ? -> devrait être le vrai nom du mouvement NoSQL. </li></ul><ul><li>What else ? </li></ul><ul><ul><li>BDD orientée documents </li></ul></ul><ul><ul><li>BDD orientée objets </li></ul></ul><ul><ul><li>BDD orientée colonnes </li></ul></ul><ul><ul><li>... </li></ul></ul>
  3. 3. La vraie différence: A.C.I.D. <ul><li>Atomicité -> Transactions (un groupe d'opérations, une échoue, tout doit pouvoir être annulé). </li></ul><ul><li>Cohérence -> Pas d'état incohérent à la fin d'une transaction (contraintes). </li></ul><ul><li>Isolation -> Pas de dialogue entre les transactions. Gestion des conflits ? Lock :( </li></ul><ul><li>Durabilité -> À la fin d'une opération, les données sont persistées (coupure de courant = pas de perte de données). </li></ul><ul><li>http://en.wikipedia.org/wiki/ACID </li></ul>
  4. 4. Et alors ? <ul><li>A.C.I.D. c'est cool, mais... </li></ul><ul><li>-> L'atomicité et surtout l'isolation  </li></ul><ul><li>     sont des freins à la distribution des </li></ul><ul><li>     données. </li></ul><ul><li>-> Performances ? </li></ul><ul><li>http://dbmsmusings.blogspot.com/2010/08/problems-with-acid-and-how-to-fix-them.html </li></ul><ul><li>http://highscalability.com/drop-acid-and-think-about-data </li></ul>google &quot;pupples nosql&quot;. What ?
  5. 5. Théorie de la distribution des données <ul><li>NoSQL s'affranchit de la contrainte &quot;A.C.I.D.&quot;  </li></ul><ul><li>Le théorème &quot;C.A.P.&quot; d'Eric Brewer </li></ul><ul><li>http://www.julianbrowne.com/article/viewer/brewers-cap-theorem </li></ul><ul><li>http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP </li></ul><ul><li>On ne peut pas tout avoir :) </li></ul><ul><li>-> Consistency </li></ul><ul><li>-> Availability </li></ul><ul><li>-> Parition Tolerance </li></ul><ul><li>Seulement 2 à la fois peuvent être garantis au même instant. </li></ul>
  6. 6. Le deuil de la cohérence à tous prix <ul><li>Accepter que le système sera &quot;probablement cohérent&quot;. </li></ul><ul><li>-> Mais on n'est pas obligé de distribuer les données ! </li></ul><ul><li>http://davidmasclet.gisgraphy.com/post/2010/06/09/10-minutes-pour-comprendre...NoSQL </li></ul>
  7. 7. Performances: le nerf de la guerre ? <ul><li>-> On peut toujours optimiser une solution SQL. </li></ul><ul><li>-> MySQL & PostgreSQL & cie offrent de très bonnes solutions de réplication. </li></ul><ul><li>Alors pourquoi NoSQL ? </li></ul><ul><li>-> Meilleures performances &quot;out of the box&quot; ? À voir... </li></ul><ul><li>-> MAIS ÇA NE DOIT PAS ÊTRE LE SEUL CRITÈRE </li></ul><ul><li>        -> NoSQL = Un autre mode de pensée </li></ul>
  8. 8. Les différentes familles <ul><ul><li>Colonnes: Google's BigTable, HBase, Cassandra... Voir ça comme un gros fichier CSV. </li></ul></ul><ul><ul><li>Graphes (Euler): Neo4J Idéal pour représenter un réseau. </li></ul></ul><ul><ul><li>Clé-Valeur: Riak, Voldemort, Redis... Voir ça comme un gros tableau associatif. Basique, efficace. </li></ul></ul><ul><ul><li>Documents: CouchDB, MongoDB... Un entrepôt de &quot;documents&quot; (objets anonymes). </li></ul></ul><ul><li>Toutes sont schemaless </li></ul>
  9. 9. Et la vraie vie ? <ul><li>Twitter </li></ul><ul><li>-> MySQL pour le stockage des tweets </li></ul><ul><li>-> Pour tout le reste (logs, géolocalisation, tous les nouveaux services) c'est Cassandra </li></ul><ul><li>Facebook </li></ul><ul><li>Créateur de Cassandra (open-sourcé en 2008) </li></ul><ul><li>http://cassandra.apache.org/ </li></ul><ul><li>Diigo & Amazon </li></ul><ul><li>Cassandra aussi </li></ul><ul><li>Google App Engine </li></ul><ul><li>BigTable </li></ul>
  10. 10. MongoDB <ul><li>Orienté documents. Un bon exemple : une boutique hétéroclite. </li></ul><ul><li>Le panier : </li></ul><ul><ul><li>2 livres </li></ul></ul><ul><ul><li>1 t-shirt rouge XL </li></ul></ul><ul><ul><li>2 pneus en 255 55 R16 91V </li></ul></ul><ul><li>Super chiant à modéliser. Pas de schéma ? Cool ! </li></ul>
  11. 11. MongoDB : JSON powa <ul><li>> user = { name: &quot;johndoe&quot;, panier: null } </li></ul><ul><li>{ &quot;name&quot; : &quot;johndoe&quot;, &quot;panier&quot; : null } </li></ul><ul><li>> user.panier = []; </li></ul><ul><li>[ ] </li></ul><ul><li>> user.panier.push({ type: &quot;livre&quot;, titre: &quot;Élever des poneys avec amour&quot; }) </li></ul><ul><li>1 </li></ul><ul><li>> user.panier.push({ type: &quot;livre&quot;, titre: &quot;L'art tu tartare de cheval&quot; }) </li></ul><ul><li>2 </li></ul><ul><li>> user.panier.push({ type: &quot;t-shirt&quot;, taille: &quot;XL&quot;, couleur: &quot;rouge&quot; }) </li></ul><ul><li>3 </li></ul><ul><li>> user.panier.push({ type: &quot;pneu&quot;, dimension: { largeur: 255, diameter: 55, ratio: 16, charge: 91, vitesse: &quot;V&quot; } }) </li></ul><ul><li>4 </li></ul><ul><li>> user.panier[3].count = 2; </li></ul>
  12. 12. MongoDB : JSON powa <ul><li>> user </li></ul><ul><li>{ </li></ul><ul><ul><li>&quot;name&quot; : &quot;johndoe&quot;, </li></ul></ul><ul><ul><li>&quot;panier&quot; : [ </li></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><ul><li>&quot;type&quot; : &quot;livre&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;titre&quot; : &quot;Élever des poneys avec amour&quot; </li></ul></ul></ul></ul><ul><ul><ul><li>}, </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><ul><li>&quot;type&quot; : &quot;livre&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;titre&quot; : &quot;L'art tu tartare de cheval&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;count&quot; : 2 </li></ul></ul></ul></ul><ul><ul><ul><li>}, </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><ul><li>&quot;type&quot; : &quot;t-shirt&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;taille&quot; : &quot;XL&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;couleur&quot; : &quot;rouge&quot; </li></ul></ul></ul></ul><ul><ul><ul><li>}, </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><ul><li>&quot;type&quot; : &quot;pneu&quot;, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;dimension&quot; : { </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;largeur&quot; : 255, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;diameter&quot; : 55, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;ratio&quot; : 16, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;charge&quot; : 91, </li></ul></ul></ul></ul><ul><ul><ul><ul><li>&quot;vitesse&quot; : &quot;V&quot; </li></ul></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><li>] </li></ul></ul><ul><li>} </li></ul>
  13. 13. MongoDB : requêtage <ul><li>> db.users.save(user) </li></ul><ul><li>> db.users.findOne() </li></ul><ul><li>> db.users.find({&quot;name&quot;: &quot;johndoe&quot;}).limit(1) </li></ul><ul><li>  </li></ul><ul><li>http://www.mongodb.org/display/DOCS/Querying </li></ul>
  14. 14. MongoDB : edit-in-place <ul><li>> db.counters.save({ name: &quot;X&quot;, n: 0 }) </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>> c = db.counters.findOne({ name: &quot;X&quot; }) { &quot;_id&quot; : ObjectId(&quot;4d6eb03f089b38a5a40e543d&quot;), &quot;name&quot; : &quot;X&quot;, &quot;n&quot; : 0 } </li></ul><ul><li>> value = c.n++ // ancienne valeur + incrément </li></ul><ul><li>0 </li></ul><ul><li>> db.counters.save(c) // nouvelle valeur: 1 </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>> value = db.counters.findAndModify({ query: { name: &quot;X&quot; }, update: { $inc: { n: 1 } } }).n // nouvelle valeur: 2 </li></ul><ul><li>1 // ancienne valeur </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>http://www.mongodb.org/display/DOCS/findAndModify+Command </li></ul>
  15. 15. Redis <ul><li>INCR compteur </li></ul><ul><li>Du relationnel avec un système clé-valeur ? Why not ? </li></ul><ul><li>SET post:33:title &quot;Coucou gamin&quot; </li></ul><ul><li>SET author:1:name &quot;Toto Laptop&quot; </li></ul><ul><li>SET author:1:nickname &quot;toto42&quot; </li></ul><ul><li>RPUSH author:1:posts &quot;post:33&quot; </li></ul><ul><li>http://redis.io/ </li></ul><ul><li>Très simpl(ist)e, mais très puissant </li></ul>
  16. 16. Benchmark <ul><li>-> Insérer plein d'articles, avec des  </li></ul><ul><li>     commentaires. </li></ul><ul><li>-> Récupérer tous les articles d'un auteur </li></ul><ul><li>     donné, avec le nb de commentaires. </li></ul><ul><li>Pour changer -> Python :) </li></ul><ul><li>time mongo mongodb_insert_noindex.js </li></ul><ul><li>> 1.419s </li></ul><ul><li>time python mongodb_insert_noindex.py </li></ul><ul><li>> 0.580s </li></ul><ul><li>OK, ne nous fions pas au client par défaut pour les tests :) </li></ul>
  17. 17. Benchmark (à prendre avec des grosses pincettes) WTF ??? C'est pas magique alors ? MySQL InnoDB indexé MySQL MyIsam sans index MongoDB indexé MongoDB non indexé Redis Insertion 10'000 articles 30'000 commentaires 6200 ms 5200 ms 570 ms 590 ms 10500 ms Lecture Les 100 premiers posts d'un auteur avec le nombre de commentaires par post. 100 ms (puis ~45 ms avec cache de requête) 110 ms (puis ~45 ms avec cache de requête) 290 ms 380 ms 40 ms
  18. 18. Mais alors, si ça booste pas, ça pux ? <ul><li>Le clé-valeur reste IMBATTABLE en lecture. </li></ul><ul><li>    -> I18N ? Préférences utilisateur ? Listes, scores... </li></ul><ul><li>La comparaison doit se faire sur le fonctionnel </li></ul><ul><li>http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,+MySQL+Compare+Grid </li></ul><ul><li>Procédures stockées ? Map/Reduce est plus simple, plus souple, probablement plus puissant... </li></ul><ul><li>SQL reste à mon avis le meilleur langage de requêtage. </li></ul>
  19. 19. Open your mind, mec ! <ul><li>Oubliez un peu le relationnel ! </li></ul><ul><li>Ou alors... Oubliez NoSQL :) </li></ul><ul><li>Mais on a toujours de relations ! </li></ul><ul><li>             Ah bon ? Réfléchis encore... </li></ul><ul><li>Ouais mais tous ces trucs de données distribuées... </li></ul><ul><li>             YAGNI ? Oui, mais ça marche dans les deux sens... </li></ul>
  20. 20. NO QUESTION !

×