NoSQL La fin du relationnel? Michael Bailly



Documents pareils
AVRIL Au delà de Hadoop. Panorama des solutions NoSQL

NoSQL. Introduction 1/30. I NoSQL : Not Only SQL, ce n est pas du relationnel, et le contexte. I table d associations - Map - de couples (clef,valeur)

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Prototypage et évaluation de performances d un service de traçabilité avec une architecture distribuée basée sur Hadoop

NoSQL. Introduction 1/23. I NoSQL : Not Only SQL, ce n est pas du relationnel, et le contexte. I table d associations - Map - de couples (clef,valeur)

NoSQL : hype ou innovation? Grégory Ogonowski / Recherches Octobre 2011

Bases de Données NoSQL

Groupe de Discussion Big Data Aperçu des technologies et applications. Stéphane MOUTON

Introduction à ElasticSearch

Bases de données documentaires et distribuées Cours NFE04

Hibernate vs. le Cloud Computing

Cours 8 Not Only SQL

Prototypage et évaluation de performances d un service de traçabilité avec une architecture distribuée basée sur Hadoop

OpenPaaS Le réseau social d'entreprise

Technologies du Web. Ludovic DENOYER - ludovic.denoyer@lip6.fr. Février 2014 UPMC

L AVENIR DU NoSQL. Quel avenir pour le NoSQL?

Les bases de données relationnelles

Cassandra chez Chronopost pour traiter en temps réel 1,5 milliard d événements par an

Le NoSQL - Cassandra

Bases de données documentaires et distribuées Cours NFE04

Alfstore workflow framework Spécification technique

NoSQL : les meilleures

Master1 ère année. Réseaux avancés I. TP nº5 filière ISICG

Cartographie des solutions BigData

MapReduce. Nicolas Dugué M2 MIAGE Systèmes d information répartis

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

Bases de données documentaires et distribuées Cours NFE04

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Les bonnes pratiques. de l hébergement d un CMS

BIG DATA. Veille technologique. Malek Hamouda Nina Lachia Léo Valette. Commanditaire : Thomas Milon. Encadré: Philippe Vismara

les techniques d'extraction, les formulaires et intégration dans un site WEB

NoSQL - Systèmes de gestion de données distribués

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

Les technologies du Big Data

NoSQL. Etat de l art et benchmark

Benjamin Cornu Florian Joyeux. Les choses à connaître pour (essayer) de concurrencer Facebook.

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

Construire un réseau social avec Symfony Xavier Lacot Clever Age. Symfony Live 11 et 12 juin 2009 Clever Age Xavier Lacot

Open Source Job Scheduler. Installation(s)

NFE204 Bases de données avancées

Devenez un véritable développeur web en 3 mois!

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Apache, MariaDB & PHP pour un développement libre. Christophe

Sommaire. 3. Les grands principes de GFS L architecture L accès de fichier en lecture L accès de fichier en écriture Bilan

Architectures Web Services RESTful

CAS, un SSO web open source. 14h35-15h25 - La Seine A

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Architecture NoSQL et réponse au Théorème CAP

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

WDpStats Procédure d installation

4 Exemples de problèmes MapReduce incrémentaux

Un peu de culture : Bases N osql L 1

THÉMATIQUES. Comprendre les frameworks productifs. Découvrir leurs usages. Synthèse

Construire une application marketing Facebook sur la plateforme Windows Azure

Introduction à MapReduce/Hadoop et Spark

Django et PostgreSQL sous la charge

PostgreSQL, le cœur d un système critique

C-JDBC. Emmanuel Cecchet INRIA, Projet Sardes.

Bases de Données. Stella MARC-ZWECKER. Maître de conférences Dpt. Informatique - UdS

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Introduction à MySQL (ou MySQL en 3 heures montre en main)

Présentation du module Base de données spatio-temporelles

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

IBM Cloudant Data Layer Local Edition

Introduction à JDBC. Accès aux bases de données en Java

Programmation parallèle et distribuée

Introduction aux «Services Web»

Guide d installation de SugarCRM Open Source version 4.5.1

PHP et le Cloud. All rights reserved. Zend Technologies, Inc.

LES ACCES ODBC AVEC LE SYSTEME SAS

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Architectures haute disponibilité avec MySQL. Olivier Olivier DASINI DASINI - -

Hadoop, Spark & Big Data 2.0. Exploiter une grappe de calcul pour des problème des données massives

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Quels choix de base de données pour vos projets Big Data?

Nouveautés de Drupal 8. Léon

Test de HSQLDB et Comparatif avec Sqlite

Informatique & Systèmes de Communication. Stages de 12 à 16 semaines aux Etats-Unis

Comprendre et optimiser la base de données WordPress WP TECH 2014

Les participants repartiront de cette formation en ayant une vision claire de la stratégie et de l éventuelle mise en œuvre d un Big Data.

Importation et exportation de données dans HDFS

Tests de montée en charge avec Tsung

Hébergement de site web Damien Nouvel

Service WEB, BDD MySQL, PHP et réplication Heartbeat. Conditions requises : Dans ce TP, il est nécessaire d'avoir une machine Debian sous ProxMox

DOCKER MEETUP. Christophe Labouisse

Labs Hadoop Février 2013

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Paris Airports - Web API Airports Path finding

De à 4 millions. Khanh Tuong

3 chapitre Groupe Eyrolles, 2008

Cahier des charges. Liny EIP 2013 EPITECH. seban_j, jaspar_y, ringue_t, rousse_g, thierr_o

+ = OpenStack Presentation. Raphaël Ferreira - enovance. Credits : Thanks to the OpenStack Guys 1

Plan. Accès aux données dans le framework.net. ADO.NET Entity Framework LINQ ADO.NET ADO.NET. 1. ADO.NET Mode connecté Mode non connecté

Programmation parallèle et distribuée

Web Tier : déploiement de servlets

Transcription:

NoSQL La fin du relationnel? Michael Bailly RMLL 2011

Raison #1 RDBMS don't are hard to scale

Mais aussi... Dénormalisation Mise en cache Moteurs d'indexation (Solr, Sphinx) Files d'attentes (Gearman, ActiveMQ)

Reason #2 Schema stinks smells

Raison #3 Données éphémères

En résumé RDBMS Enregistrements de petite taille, dôtés de relations bien définies et normalisées NoSQL Requêtes pouvant évoluer Données à longue durée de vie (fréquence MAJ faible) Pas besoin de perfs exceptionnelles en lecture Intégrité des données > perfs extensibilité Jeu de données très important Données pouvant être modélisées en arbres dont l'accès se fait par le noeud racine Structure de données hautement dynamique Complexité du mapping relationnel/objet -> perte de productivité

Compromis #1 ACID BASE ACID = Atomicity, Consistency, Isolation, Durability BASE = Basically Available Soft-state Eventual consistency

Compromis #2 C A P Consistency, Availability, Partitiontolerance Pick two! Eric A. Brewer (2000)

Dépôts clé-valeur http://www.flickr.com/photos/nshepard/230901

Dépôts clé-valeur // création d'un utilisateur INCR global:next_user_id => 1234 SET uid:1234:username jdoe SET uid:1234:password p4s5w0rd SET username:jdoe:uid 1234 // authentification de l'utilisateur GET username:jdoe:uid => 1234 GET uid:1234:password => p4s5w0rd SET uid:1234:auth fea5e81ac8ca77622bed1c2132a021f9 SET auth:fea5e81ac8ca77622bed1c2132a021f9 1234 // récupération des docs de l'utilisateur GET uid:1234:docs => [7890, 4567, 2345] GET doc:7890 => "<owner_id> <ts> Awesome!" // ajout d'un doc INCR global:next_doc_id => 7891 SET doc:7891 "<owner_id> <ts> Enorme!" LPUSH uid:1234:docs 7891

Redis Ecrit en C, licence BSD Stockage en RAM Persistance via snapshotting asynchrome ou AOF STRING, LIST, SET, ZSET Non distribué Pas de tolérance aux pannes Mais très rapide!

Redis : cas d'utilisation "Memcached on steroids" Nuages de tags Statistiques, logs Sessions Moteurs d'indexation Job queues (resque, Celery)

Redis : exemple Tags : utilisation d'un SET // tagging du doc 1234 SADD article:1234 ruby SADD article:1234 python SADD article:1234 php // tagging du doc 6789 SADD article:6789 django SADD article:6789 python // récupération des tags communs SINTER article:1234 article:6789 => python

Redis : librairies PHP Python Ruby Predis redis-py redis-rb Rediska txredis em-ruby PHP-Redis ohm

Ohm class Event < Ohm::Model attribute :name reference :venue, Venue set :participants, Person counter :votes index :name def validate assert_present :name end end class Venue < Ohm::Model attribute :name collection :events, Event end class Person < Ohm::Model attribute :name end

Rediska $options = array( 'namespace' => 'Application_', 'servers' => array( array ('host' => '127.0.0.1', 'port' => 6379) ) ); $writer = new Rediska_Zend_Log_Writer_Redis( 'keyname', $options ); $log = new Zend_Log($writer);

Project Voldemort LinkedIn Ecrit en Java, licence Apache 2.0 Distribué! Réplication auto des données sur plusieurs serveurs Partitionnement auto des données Tolérant aux pannes Versioning des données Backends de stockage pluggables (BDB, MySQL)

Dépôts orientés colonnes http://www.flickr.com/photos/stuckincustoms/536710395

Cassandra Facebook Ecrit en Java, licence Apache 2.0 Distribué! Réplication auto des données sur plusieurs serveurs (et même datacenters) Partitionnement auto des données Tolérant aux pannes, décentralisé (pas de SPOF) Disponibilité paramétrable via le ConsistencyLevel Excellente performances en écriture (stockage

Modèle de données Column : { name : "emailaddress", value : "jdoe@example.com", timestamp: 123456789 } SuperColumn : { name : "physicaladdress", value : { street: { name: "street", value: "xxx", ts: 123 }, city: { name: "city", value: "Paris", ts: 123 }, zip: { name: "zip", value: "75017", ts: 123 } } }

Modèle de données ColumnFamily : Users = { jdoe: { username: { name: "username", value: "jdoe", ts: 123 }, email: { name: "email", value: "jdoe@example.com", ts: 123 } }, jane: { username: { name: "username", value: "jane", ts: 123 }, email: { name: "email", value: "jane@example.com", ts: 123 }, gender: { name: "gender", value: "female", ts: 123 }, age: { name: "age", value: "25", ts: 123 }, } }

Modèle de données SuperColumnFamily : AddressBooks = { jdoe: { bob: { name : "physicaladdress", value : { street: { name: "street", value: "1 rue de la paix", ts: 123 }, city: { name: "city", value: "Paris", ts: 123 }, zip: { name: "zip", value: "75017", ts: 123 } } }, karen: { name : "physicaladdress", value : { street: { name: "street", value: "2 rue de la paix", ts: 123 }, city: { name: "city", value: "Paris", ts: 123 }, zip: { name: "zip", value: "75017", ts: 123 } } }, } }

Cassandra Object class Customer < CassandraObject::Base attribute :first_name, :type => :string attribute :last_name, :type => :string attribute :date_of_birth, :type => :date attribute :signed_up_at, :type => :time_with_zone validate :should_be_cool key :uuid index :date_of_birth association :invoices, :unique=>false, :inverse_of=>:customer end

Dépôts de documents http://www.flickr.com/photos/60849961@n00/238658480

CouchDB Ecrit en Erlang, licence Apache 2.0 Document = structure JSON API REST : HTTP + JSON Résolution de conflits facile (ID + n révision) Réplication incrémentale (scalable +++!) Robuste MapReduce incrémental Service Comet de notification des changements Partionnement automatique avec CouchDB Lounge

MongoDB Ecrit en C++, licence AGPL v.3.0 Document = structure JSON++, stockage en BSON API de requête assez complète Indexes Partitionnement (sharding) MapReduce Réplication Support payant possible In-Place updates

MongoDB : librairies PHP Python Ruby Mongo Pymongo (driver) Mango MongoMapper Mongoid MongoRecord MongoModel MongoDoc

MongoDB : shell interactif root@lenny:/opt/mongodb 1.3.2/bin#./mongo MongoDB shell version: 1.3.2 url: test connecting to: test type "help" for help > show dbs admin local test > db.people.save({"firstname":"john"}) ObjectId("4b8cccc622131491059056cd") > person = db.people.findone({ firstname : "John"}) { "_id" : ObjectId("4b8cccc622131491059056cd"), "firstname" : "John" } > person.lastname = "Doe" Doe > db.people.save(person) > db.people.findone({ firstname : "John"}) { "_id" : ObjectId("4b8cccc622131491059056cd"), "firstname" : "John", "lastname" : "Doe" }

Pymongo >>> import pymongo >>> from pymongo import Connection >>> conn = Connection('localhost', 27017) >>> db = conn.blog >>> posts = db.posts >>> import datetime >>> post = {"author": "Raphael",... "title": "La guerre des frameworks",... "tags": ["rails", "django", "symfony"],... "date": datetime.datetime.utcnow()} >>> posts.insert(post) ObjectId ('4b8ce378a5835f0dda000000') post = {"author": "Raphael",... "title": "Django + MongoDB = Mango",... "tags": ["python", "django", "mongodb"],... "date": datetime.datetime.utcnow()} >>> posts.insert(post) ObjectId ('4b8ce531a5835f0dda000001') >>> for post in posts.find({"author": "Raphael"}):... print post... >>> posts.count() 2 >>> d = datetime.datetime(2010, 3, 1) >>> for post in posts.find({"date": {"$gt": d}}):... print post

Pymongo >>> contact = {"firstname": "John",... "lastname": "Doe",... "address": {"street" : "1 rue de la paix",... "city": "Paris"},... "phones": [{"type": "home", "number": "+331234567"},... {"type": "mobile", "number" : "+33678901234"}]} >>> contacts.insert(contact) ObjectId ('4b8ce9f8a5835f0dda000002') >>> contact = {"firstname": "Jane",... "lastname": "Doe",... "address": {"street" : "1 rue de la paix",... "city": "Paris"},... "phones": [{"type": "home", "number": "+331234567"},... {"type": "mobile", "number" : "+3361234567"}]} >>> contacts.insert(contact) ObjectId ('4b8ceb90a5835f0dda000003') >>> for contact in contacts.find({"address.city": "Paris"}).sort("lastname"):... print contact...

Pymongo >>> contacts.find({"address.city": "Paris"}).sort("lastname").explain()["cursor"] u'basiccursor' >>> contacts.find({"address.city": "Paris"}).sort("lastname").explain()["nscanned"] 3.0 >>> from pymongo import ASCENDING, DESCENDING >>> contacts.create_index([("address.city", ASCENDING), ("lastname", ASCENDING)]) u'address.city_1_lastname_1' >>> contacts.find({"address.city": "Paris"}).sort("lastname").explain()["cursor"] u'btreecursor address.city_1_lastname_1' >>> contacts.find({"address.city": "Paris"}).sort("lastname").explain()["nscanned"] 2.0

MongooseJS var Schema = mongoose.schema ; var Phone = new Schema({ type: {type: String}, number: {type: String} }); var Person = new Schema({ firstname: {type: String}, lastname: {type: String, required: true}, address: { street: {type: String}, city: {type: String} }, phones: [Phone] }); mongoose.model("person", Person) ;

MongooseJS var newperson = mongoose.model("person"); newperson.firstname = "John" ; newperson.lastname = "Doe" ; newperson.address = {street: "1 rue de la Paix", city: "Paris"}; newperson.phones.push({type: "home", number: "+331234567"}); newperson.phones.push({type: "mobile", number: "+33067891234"}); newperson.save(function(err) { if (!err ) console.log("saved!"); }); mongoose.model("person").find( {"address.city" : "Paris" }, function (err,docs) { if ( err ) return console.log("aie!",err) ; console.log("found "+docs.length+" persons living in Paris"); } );

Un "planet NoSQL" http://nosql.mypopescu.com/

Merci de votre attention Questions?