NoSQL MongoDBkn/teaching/dcw/cours/pdf/dcw_07.pdf · 6 NoSQL/MongoDB 6.1 Propriétés et limites...

Click here to load reader

  • date post

    05-Jun-2020
  • Category

    Documents

  • view

    2
  • download

    0

Embed Size (px)

Transcript of NoSQL MongoDBkn/teaching/dcw/cours/pdf/dcw_07.pdf · 6 NoSQL/MongoDB 6.1 Propriétés et limites...

  • Données et connaissances pour le WebMaster 2 Miage

    NoSQLMongoDB

    [email protected]

  • 1 Introduction, UTF-8 et XML ✓2 XPath (1) ✓3 XPath (2) ✓4 XSLT ✓5 DOM & JAXP ✓6 NoSQL/MongoDB

    6.1 Propriétés et limites des bases SQL6.2 MongoDB6.3 MongoDB : langage de requêtes6.4 Modèle distribué

    Plan

  • Le standard SQL spécifie un grand nombre d'aspects des bases de donnéesrelationnelles :

    ◆ Un langage de requête (SELECT …)◆ Un langage de modification de données (CREATE …, UPDATE …)◆ Un langage de schéma et de contraintes◆ Un langage de programmation (SQL/PSM)◆ Un modèle de concurrence (transactions, BEGIN … END, COMMIT, ROLLBACK)

    3 / 34

    SQL

  • Le modèle relationnel et les bases de données SQL offrent des garanties très fortes :

    ◆ Atomicity (Atomicité) : chaque transaction est du « tout ou rien ». Il est impossible pourquelqu'un en dehors de la transaction d'observer une étape intermédiaire.◆ Consistency (Cohérence) : chaque transaction fait passer la base d'un état cohérent àun nouvel état cohérent. Toute donnée sauvegardée dans la base doit être valide vis à visd'un ensemble de règles (types, contraintes, triggers, …).◆ Isolation : l'exécution concurrente de deux transactions T1 et T2 doit être la même queleur exécution séquentielle.◆ Durability (Durabilité) : une transaction confirmée (COMMIT;) le reste même en cas deproblèmes (perte de courant, erreur interne, …).

    4 / 34

    Garanties

  • Maintenir un modèle ACID a un impact énorme sur les performances (création desnapshots, mise en place de verrous coûteux, attente de confirmation par le disque queles données sont sauvées, …).

    Comment augmenter les performances et le volume des données ?

    ◆ Prendre un serveur plus puissant (ex. Oracle Exadata de 40 000 à 1 300 000 USD +souscription mensuelle, entretien, …)◆ Mettre plusieurs serveurs ? Très difficile, pourquoi ?

    5 / 34

    Quel impact ?

  • Il existe deux modèles de distribution possible :

    ◆ Plusieurs serveurs contenant chacun une copie complète de la base :◆ Performances accrues pour les requêtes◆ Diversité géographique possible (plus grande résistance aux évènement extérieurs)◆ Baisse des performances pour les mises à jour◆ Ne permet pas de stocker plus de données que sur un seul serveur

    ◆ Partitionnement des données. Une relation R peut être découpés en morceaux R1, …,R1, disposés sur des machines différentes. Le découpage peut se faire par colonnes oupar lignes.

    ◆ Augmentation de la capacité de stockage globale◆ Jointures très coûteuses si deux colonnes sont sur deux machines différentes◆ Agrégats coûteux si les lignes sont sur deux machines différentes◆ Une machine en panne ou inaccessible compromet tout le système

    6 / 34

    Distribution et modèle ACID

  • Le modèle ACID est parfois trop contraignant :

    ◆ Système de réservation de billets d'avion ? Modèle ACID nécessaire◆ Calcul du nombre de messages envoyé par utilisateurs de chaque tranche d'âge, surFacebook ? Modèle ACID inutile

    Y a t-il un modèle alternatif ?

    7 / 34

    Le modèle ACID est-il toujours adapté ?

  • Le théorème (énoncé comme une conjecture en 1999 par E. Brewer et prouvé en 2004)dit que dans un système distribué partageant des données, au plus 2 des 3 propriétéssuivantes peuvent être optimale :

    ◆ Consistency (cohérence) : tous les nœuds de calcul voient les même données au mêmemoment◆ Availability (disponibilité) : chaque requête reçoit une réponse de succès ou d'échec◆ Partition tolerence (tolérance aux pannes) : le système continue de fonctionnercorrectement malgré un découpage arbitraire lié à des pannes réseau

    Le théorème en lui-même est souvent mal interprété. Il a surtout été énoncé (d'aprèsBrewer) pour inciter les gens à explorer d'autres modèles/compromis.

    8 / 34

    Théorème de Brewer

  • Le modèle BASE est régit par les propriétés suivantes :

    ◆ Basically Available (toujours disponible) : le système s'efforce de répondre à unerequête, quel que soit son état◆ Soft state (état « mou ») : l'état interne du système peut changer sans intervention d'unutilisateur◆ Eventually consistent (cohérent au bout d'un temps fini) : si on laisse passersuffisamment de temps entre deux mises à jour ou pannes, le système converge vers unétat cohérent

    9 / 34

    Modèle BASE

  • On considère un système avec deux nœuds N1 et N2 :

    ◆ Mise à jour M suivi de deux fois la même requête Q :◆ ACID : si M est dans une transaction, alors Q s'effectue strictement après M et lesdeux instances de Q renvoient le même résultat◆ BASE : les deux instances de Q peuvent renvoyer des résultats différents, M peuts'exécuter en même temps que Q et ne même pas être fini.

    ◆ N2 tombe en panne :◆ ACID : le système entier est en panne◆ BASE : N1 continue de répondre

    10 / 34

    Exemple concret

  • Le modèle BASE permet de créer des systèmes composés de plusieurs nœuds, capablede stocker des données indépendemment et de répondre rapidement. Comment lemettre à profit ?

    11 / 34

    Que peut on faire avec BASE ?

  • 1 Introduction, UTF-8 et XML ✓2 XPath (1) ✓3 XPath (2) ✓4 XSLT ✓5 DOM & JAXP ✓6 NoSQL/MongoDB

    6.1 Propriétés et limites des bases SQL ✓6.2 MongoDB6.3 MongoDB : langage de requêtes6.4 Modèle distribué

    Plan

  • ◆ Une base de données◆ NoSQL (i.e. non relationnelle)◆ Distribuée (gestion de la distribution et de la réplication◆ Orientée documents, basées sur JSON◆ Manipulée Javascript◆ Un framework Map/Reduce

    Ce cours n'est qu'une introduction rapide. On se concentrera sur la modélisation dedonnées, les requêtes et la distribution.

    13 / 34

    Qu'est-ce que MongoDB

  • Une valeur JSON est représenté par un sous-ensemble de la syntaxe Javascript pour lesobjets.

    ◆ null : la constante null◆ Booléens : les constates true ou false◆ Nombres : les nombres au format IEEE-759◆ Les chaînes de caractères : délimitées par des " (obligatoirement), avec les séquencesd'échappement usuelles (\n, …)◆ Les tableaux : suite de valeurs séparées par des virgules, entre [ ]◆ Des objets : les nom propriétés sont des chaines de caractères (séparés par desvirgules)

    { "nom" : "Nguyen", "prénom" : "Kim", "cours": [ "Javascript", "TER" ], "full time" : true, "age" : 3.6e1, "hobby" : null }

    14 / 34

    JSON : syntaxe

  • ◆ Pas de syntaxe pour des commentaires◆ Une propriété est n'importe quelle chaine syntaxiquement valide◆ Les tableaux peuvent contenir des types différents◆ Les blancs en dehors des chaînes ne sont pas significatifs◆ Les chaînes ne peuvent pas être sur plusieurs lignes

    15 / 34

    JSON : syntaxe (suite)

  • Après avoir lancé le serveur, on exécute le shell : mongo etud

    > db.getName()etud> db.createCollection("test"){ "ok" : 1 }> db.test.insert( [ { "nom" : "Toto" , "note" : 17 },

    ... { "nom" : "Titi" , "note" : 12 }, ... { "nom" : "Tata" , "note" : 9.5, "point_jury" : 0.5 } ])

    BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 3, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ]})

    16 / 34

    Exemple

  • > db.test.find(){ "_id" : ObjectId("5bcdf22840901d2552acbe95"), "nom" : "Toto", "note" : 17 }{ "_id" : ObjectId("5bcdf22840901d2552acbe96"), "nom" : "Titi", "note" : 12 }{ "_id" : ObjectId("5bcdf22840901d2552acbe97"), "nom" : "Tata", "note" : 9.5, "point_jury" : 0.5 }> db.test.find({ "note" : { "$gt" : 10 } }, { "nom" : 1}){ "_id" : ObjectId("5bcdf22840901d2552acbe95"), "nom" : "Toto", "note" : 17 }{ "_id" : ObjectId("5bcdf22840901d2552acbe96"), "nom" : "Titi", "note" : 12 }>> db.test.find( { "$where" : function () { return (this.point_jury || 0) + this.note

  • On peut dresser le tableau comparatif suivant :

    SGBDR MongoDBBase de donnée Base de donnéeTable CollectionLigne (ou tuple) Document (JSON)Colonne (ou attribut) Clé/ValeurSQL Javascript + Query DocumentsJointures Documents imbriquésClé Primaire Clé Primaire (_id)Contraintes Validateurs

    18 / 34

    MongoDB vs BD Relationnelle

  • 1 Introduction, UTF-8 et XML ✓2 XPath (1) ✓3 XPath (2) ✓4 XSLT ✓5 DOM & JAXP ✓6 NoSQL/MongoDB

    6.1 Propriétés et limites des bases SQL ✓6.2 MongoDB ✓6.3 MongoDB : langage de requêtes6.4 Modèle distribué

    Plan

  • db.createCollection (nom, options) :

    db.getCollection(nom) :db.nom :

    crée une collection vide dans la base (le nom estobligatoire et les options faculatitives)

    Renvoie la collection dont le nom est donnéRenvoie la collection dont le nom est donné (ne fonctionne pas si le nom de la

    collection est identique à un nom de méthode)

    L'API contient beaucoup d'autre méthodes (copie d'une base, changement des droits,destruction d'une base, création de vues, …)

    20 / 34

    Bases de données (objets DB)

  • C'est sur les objets collections que se trouvent toutes les opérations CRUD (Create/Read/Update/Delete)

    Points essentiels :

    ◆ Les documents insérés peuvent être non-uniformes (champs de noms et de typesdifférents◆ Tous les documents possèdent une clé primaire (insérée automatiquement si nonfournie), le champ _id◆ Les requêtes reposent sur des Document Query des objets avec des champsparticuliers représentant la requête

    21 / 34

    Collections (objets Collection)

  • db.col.insert (docs)où docs est soit un document, soit un tableau de documentsExemple:

    > db.col.insert( [ { "nom" : "Toto" , "note" : 17 }, ... { "nom" : "Titi" , "note" : 12 }, ... { "nom" : "Tata" , "note" : 9.5, "point_jury" : 0.5 } ])

    > db.col.insert({ "name" : "Toto" })MongoDB crée automatiquement un champs _id contenant un id unique

    22 / 34

    Insertion

  • db.col.find (cond, proj)

    ◆ Sans argument, la requête renvoie tous les documents de la collection◆ L'argument cond peut être un document query (cf. slide suivant)◆ L'argument cond peut être une fonction Javascript renvoyant un booléen. Dans ce cas,le document courant est associé à la variable this.◆ Proj est une spécification de projection (un document JSON qui indique quels champsgarder)◆ La fonction renvoie un objet de type curseur (Cursor). Dans le shell, ce dernier estdirectement itéré et affiché

    23 / 34

    Lectures

  • Un query document est un objet JSON ordinaire, dont certains champs ou valeurs sontinterprété par le moteur de requêtes de MongoDB.Syntaxe :

    { "champ1" : valeur1, …, "champn" : valeurn }

    ◆ Le document est évalué à vrai si tous tous les champs sont évalués à vrai◆ Si le nom d'un champ ne commence pas par $, alors il est considéré comme un champdu document d'entrée. La valeur est associée est alors utilisée comme test :

    ◆ Si la valeur est une constante, alors le test vaut vrai si le champ du même nom dansl'entrée à la même valeur◆ Si la valeur est unquery documentalors il est recursivement évalué

    24 / 34

    Query Documents

  • $eq, $ne, $lt, $lte, $gt, $gte :

    $in, $nin :

    $and, $or, $not :

    Compare la valeur du champ à une constante : db.t.find( { "note" : { "$gte" : 18 } } )

    Teste si la valeur du champ appartient (ou non) à un tableau : db.t.find( { "note" : { "$in" : [ 16, 17, 20 ] } } )

    Combinaisons booléenes de tests. $and et $or prennent leursopérandes dans un tableau : db.t.find({ "note" : { "$and" : [ "$gt" : 10, "$lt" : 20 ] })

    … et bien d'autres choses (operations sur les tableaux, expressions régulières, codeJavascript arbitraire)

    25 / 34

    Query Documents : quelques opérateurs

  • Attention : quand les tests ne sont pas des opérateurs spécifiques aux tableaux, ils sontautomatiquement distribués (comme les comparaisons en XPath) avec une sémantique «il existe » :

    > db.t.insert( [ { "nom" : "Toto", "note" : 18 }, { "nom" : "Titi", "note" : [ 12, 15, 17 ] } ]) > db.find( { "note" : { "$gt" : 16 } }){ "_id" : ObjectId("…"), "nom" : "Toto", "note" : 18 }{ "_id" : ObjectId("…"), "nom" : "Titi", "note" : [ 12, 15, 17 ] }

    26 / 34

    Query Documents et tableaux

  • Dans une opération find, on peut spécifier les champs à garder ou ceux à supprimer(mais pas les deux à la fois).Pour conrserver uniquement certains champs :

    { champ1 : 1, … , champn : 1 }

    Pour supprimer certains champs :

    { champ1 : 0, … , champn : 0 }

    On n'a pas le droit de mélanger le mode 1 (garder) et le mode 0 (supprimer). Uneexception est le champ _id qui est toujours par défaut dans le résultat sauf si on ajoute_id : 0 (ce qui est toujours possible

    > db.t.find({ "note" : 18 }, { "nom" : 1 }){ "_id" : ObjectId("…"), "nom" : "Toto" }> db.t.find({ "note" : 18 }, { "note" : 0 }){ "_id" : ObjectId("…"), "nom" : "Toto" }> db.t.find({ "note" : 18 }, { "nom" : 1, "_id" : 0}){ "nom" : "Toto" }

    27 / 34

    Projections

  • db.t.update(cond, update, options)db.t.deleteOne(cond)db.t.deleteMany(cond)

    ◆ cond est un query document permettant de sélectionner◆ update est un update document (même principe, avec des opérateurs de mise à jour)

    > db.t.update({ "note" : 18 }, { "$set" : { "note" : 17, "malus" : 1})

    Par défaut, update ne met à jour qu'un seul document qui vérifie le critère. Pour desmises à jours multiple, passer l'option multi:

    > db.t.update({ "note" : 9 },{ "$set" : { "note" : 10 }}, { "multi" : true})

    28 / 34

    Mises à jour

  • 1 Introduction, UTF-8 et XML ✓2 XPath (1) ✓3 XPath (2) ✓4 XSLT ✓5 DOM & JAXP ✓6 NoSQL/MongoDB

    6.1 Propriétés et limites des bases SQL ✓6.2 MongoDB ✓6.3 MongoDB : langage de requêtes ✓6.4 Modèle distribué

    Plan

  • MongoDB s'inscrit dans le paradigme BASE

    ◆ Assurer une plus grande disponibilité (meilleur temps de réponse)◆ Assurer la resistence aux pannes

    MongoDB introduit le concept de Replica Set.

    Un Replica Set est un ensemble de serveurs MongoDB qui contiennent tous une copie dumême ensemble de données

    Parmi cet ensemble, l'un des nœuds est le nœud primaire et les autres des nœudssecondaires

    Un nœud primaire est le seul qui reçoit les mises à jours. Par contre tous les nœuds dureplica set peuvent répondre aux lectures/requêtes

    30 / 34

    Redondance pour la tolérence aux pannes

  • (source : documentation MongoDB)

    En cas de défaillance du nœud primaire, les nœuds secondaires restants élisent unnouveau nœud primaire

    31 / 34

    Replica sets

  • MongoDB permet aussi de stocker des grands volumes de données

    Un une base de donnée peut être distribuée sur un ensemble de shards (éclat,fragments)

    Le sharding (fragmentation) des données se fait selon une clé de sharding

    32 / 34

    Passage à l'échelle horizontal

  • (source : documentation MongoDB)

    ◆ Une collection peut être fragmentée (collection 1) ou non (collection 2)◆ Au sein d'un même fragment, la partie de la collection stockée est repliquée (via unreplica set)◆ Un routeur de requête reçoit les requêtes et mises à jour depuis l'application cliente ettransmets aux fragments

    33 / 34

    Sharding

  • C'est un survol rapide de MongoDB…

    ◆ Permet de faire des transformations Map/Reduce◆ Implémente les agrégats, des group by◆ Beaucoup de concepts sont présents dans d'autres systèmes (Spark, Hadoop,Cassandra, CouchDB)

    34 / 34

    Conclusion