No sql pour valtech tech days

27
Introduction Introduction NoSql NoSql Présentation Présentation pour la demi- pour la demi- journée des journée des consultants consultants Claude Falguière Octobre 2010

Transcript of No sql pour valtech tech days

Page 1: No sql pour valtech tech days

Introduction Introduction NoSqlNoSql

Présentation Présentation pour la demi-pour la demi-journée des journée des consultantsconsultants

Claude Falguière

Octobre 2010

Page 2: No sql pour valtech tech days

Des bases crées pour des besoins spécifiquesDes bases crées pour des besoins spécifiques

GoogleAmazon

Indexation d'un très grand nombre de

sites

Besoin énorme de stockage

Site de commerce en très forte croissance

Conserver disponibilité et fiabilité

SGBD Relationnel ?

Page 3: No sql pour valtech tech days

La réponse aux problèmes de montée en chargeLa réponse aux problèmes de montée en charge

HBase

Apache Cassandra

CouchDB

Big Table (Google)

SimpleDB (Amazon)

Voldemort (LinkedIn)

Cassandra (Facebook)

Issues des Issues des réseaux sociauxréseaux sociaux Des projets Des projets Open SourceOpen Source

Page 4: No sql pour valtech tech days

Mouvement démarré fin 2008

Emergence en 2010Emergence en 2010

Facebook annonce Cassandra

Twitter passe de MySql à

Cassandra

Twitter passe de Cassandra à

MySql

Page 5: No sql pour valtech tech days

Un ensemble disparate sous la bannière NoSqlUn ensemble disparate sous la bannière NoSql

Orientées volumes,

scalabilité et

disponibilité

Très souvent

distribuéesPas de support des

opérations couteuses type Join

ou transactions

Très utilisées par les

réseaux sociaux et le

micro-blogging

… … mais des points communsmais des points communs

Page 6: No sql pour valtech tech days

Démontage du SGBDDémontage du SGBD

Modèle de Modèle de donnéesdonnées

Modèle de Modèle de donnéesdonnées

Gestion de la Gestion de la concurrenceconcurrenceGestion de la Gestion de la concurrenceconcurrence

APIAPIAPIAPI

StockageStockageStockageStockage

SQL API spécifique

Relationnel Structures de données

Transactionnel ACID

Versionning, Eventual

Consistency

Monolithique Réparti

ToujoursToujours

SouventSouvent

Page 7: No sql pour valtech tech days

Structured Structured DatabaseDatabase

Document Store

Key-Value Store(Tableaux associatifs)

Graph

Column(Dimensionnelle

)

Les modèles de donnéesLes modèles de données

Page 8: No sql pour valtech tech days

Des hashmaps distribuées

Ce modèle est très simple et les implémentations sont très nombreuses

Les bases Key Valeur Les bases Key Valeur

BigTable (Google)

SimpleDB (Amazon)

Project Voldemort (LinkedIn)

Dynamo

Redis

Riak

Page 9: No sql pour valtech tech days

Exemples Redis en ligne de commandeExemples Redis en ligne de commande

$ ./redis-cli set mykey somevalueOK$ ./redis-cli get mykeysomevalue$ ./redis-cli lpush mylist firstvalueOK$ ./redis-cli lpush mylist secondvalueOK$ ./redis-cli lpush mylist thirdvalueOK$ ./redis-cli lrange mylist 0 -11. thirdvalue2. secondvalue

http://code.google.com/p/redis/http://code.google.com/p/redis/

Langage Bindings :

C, C#, Common Lisp, Java, JavaScript, Lua, Tcl, Perl, Python, Ruby, Scala, Clojure, Go, Erlang

http://try.redis-db.com/http://try.redis-db.com/

Page 10: No sql pour valtech tech days

final String bootstrapUrl = "..."; final StoreClientFactory factory = new SocketStoreClientFactory( new ClientConfig().setBootstrapUrls(bootstrapUrl) ); final StoreClient client = factory.getStoreClient("MyStore");

final Versioned version = client.get("key");

version.setObject("value");

client.put("key", value);

final String bootstrapUrl = "..."; final StoreClientFactory factory = new SocketStoreClientFactory( new ClientConfig().setBootstrapUrls(bootstrapUrl) ); final StoreClient client = factory.getStoreClient("MyStore");

final Versioned version = client.get("key");

version.setObject("value");

client.put("key", value);

Exemples Voldemort avec un Java bindingExemples Voldemort avec un Java bindinghttp://project-voldemort.com/http://project-voldemort.com/

Page 11: No sql pour valtech tech days

Aussi des sortes de hashmap.

Une ligne peut avoir un nombre quelconque de “colonnes” représentées par une série de

couples clé-valeur

Représentation plus flexible des données attachées à une entité (Sparse data)

Les bases Colonne Les bases Colonne

Cassandra

HBase

Hypertable

Page 12: No sql pour valtech tech days

Exemples Cassandra en Java avec Apache ThriftExemples Cassandra en Java avec Apache Thrift

http://incubator.apache.org/thrift/http://incubator.apache.org/thrift/

// insert data

ColumnPath name = new ColumnPath("Standard1", null, "name".getBytes("UTF-8")), "Chris Goffinet".getBytes("UTF-8");

client.insert("Keyspace1", key_user_id, name, timestamp, ConsistencyLevel.ONE);

ColumnPath age = new ColumnPath("Standard1", null, "age".getBytes("UTF-8")), "24".getBytes("UTF-8");client.insert("Keyspace1", key_user_id, age, timestamp, ConsistencyLevel.ONE);

// insert data

ColumnPath name = new ColumnPath("Standard1", null, "name".getBytes("UTF-8")), "Chris Goffinet".getBytes("UTF-8");

client.insert("Keyspace1", key_user_id, name, timestamp, ConsistencyLevel.ONE);

ColumnPath age = new ColumnPath("Standard1", null, "age".getBytes("UTF-8")), "24".getBytes("UTF-8");client.insert("Keyspace1", key_user_id, age, timestamp, ConsistencyLevel.ONE);

http://cassandra.apache.org/http://cassandra.apache.org/

Page 13: No sql pour valtech tech days

Exemples Cassandra en Java avec Apache ThriftExemples Cassandra en Java avec Apache Thrift

// read single columnColumnPath path = new ColumnPath("Standard1", null, "name".getBytes("UTF-8"));ColumnOrSuperColumn name =

client.get("Keyspace1", key_user_id, path, ConsistencyLevel.ONE)); // read entire rowSlicePredicate predicate = new SlicePredicate(null, new SliceRange(new byte[0], new byte[0], false, 10));ColumnParent parent = new ColumnParent("Standard1", null);List<ColumnOrSuperColumn> results = client.get_slice("Keyspace1", key_user_id, parent, predicate, ConsistencyLevel.ONE);for (ColumnOrSuperColumn result : results) ...

// read single columnColumnPath path = new ColumnPath("Standard1", null, "name".getBytes("UTF-8"));ColumnOrSuperColumn name =

client.get("Keyspace1", key_user_id, path, ConsistencyLevel.ONE)); // read entire rowSlicePredicate predicate = new SlicePredicate(null, new SliceRange(new byte[0], new byte[0], false, 10));ColumnParent parent = new ColumnParent("Standard1", null);List<ColumnOrSuperColumn> results = client.get_slice("Keyspace1", key_user_id, parent, predicate, ConsistencyLevel.ONE);for (ColumnOrSuperColumn result : results) ...

Page 14: No sql pour valtech tech days

Des hashmaps où la valeur associée à une clé est

un document soit XML soit JSON

Retrouver avec une seule clé un ensemble d’informations structurées de manière hiérarchique : un utilisateur, ses statuts, ses messages

L’équivalent en relationnel impliquerait beaucoup de jointures

Les bases DocumentLes bases Document

CouchDBMongoDB

Page 15: No sql pour valtech tech days

Exemple CouchDB en REST/JSONExemple CouchDB en REST/JSON

$ curl -X PUT http://couchdb:5984/tourism-db/hotel-de-la-mer \-d '{ "nom": "Hôtel de la Mer", "chambres": 12, "confort": ["vue sur mer", "accès wifi"]}'

{"ok":true,"id":"hotel-de-la-mer" ,"rev":"1-7b182be1c40992eb715f6f1eb05ba109"}

$ curl -X PUT http://couchdb:5984/tourism-db/hotel-de-la-mer \-d '{ "nom": "Hôtel de la Mer", "chambres": 12, "confort": ["vue sur mer", "accès wifi"]}'

{"ok":true,"id":"hotel-de-la-mer" ,"rev":"1-7b182be1c40992eb715f6f1eb05ba109"}

http://couchdb.apache.org/http://couchdb.apache.org/

Page 16: No sql pour valtech tech days

Exemple CouchDB en JavaExemple CouchDB en Java

// create a database object pointing to the database // "mycouchdb" on the local host Database db = new Database("localhost", "mycouchdb");

// create a hash map document with two fields Map<String,String> doc = new HashMap<String, String>();doc.put("firstname", "Claude");doc.put("lastname", "Falguière");

// create the document in couchdbdb.createDocument(doc);

// create a database object pointing to the database // "mycouchdb" on the local host Database db = new Database("localhost", "mycouchdb");

// create a hash map document with two fields Map<String,String> doc = new HashMap<String, String>();doc.put("firstname", "Claude");doc.put("lastname", "Falguière");

// create the document in couchdbdb.createDocument(doc);

http://couchdb.apache.org/http://couchdb.apache.org/

Page 17: No sql pour valtech tech days

Reposent sur la notion

de nœuds

et de relations entre noeuds

et de propriétés qui leur sont attachées

Très répandues dans le traitement des données de réseaux sociaux (l’utilisateur, ses amis, ses messages)

En phase avec les outils du web sémantique (RDF, OWL, SparQL)

Les bases Graphes Les bases Graphes

Neo4

InfoGrid

Page 18: No sql pour valtech tech days

http://code.google.com/p/jo4neo/

public class Person { transient Nodeid node; @neo String firstName; @neo Date date;

@neo(index=true) String screenName; @neo Collection<Role> roles; // ...}

public class Person { transient Nodeid node; @neo String firstName; @neo Date date;

@neo(index=true) String screenName; @neo Collection<Role> roles; // ...} ObjectGraph graph = …

Collection<City> cities = graph.get(City.class);User user = new User();user = graph.find(user).where(user.screenName) .is(screenName).result();

ObjectGraph graph = …

Collection<City> cities = graph.get(City.class);User user = new User();user = graph.find(user).where(user.screenName) .is(screenName).result();

Exemples Neo4J avec Jo4NeoExemples Neo4J avec Jo4Neo http://neo4j.org/http://neo4j.org/

Page 19: No sql pour valtech tech days

Exemples Neo4J en SPARQLExemples Neo4J en SPARQL

SELECT ?personWHERE { ?person neoj4:knows ?friend . ?friend neoj4:knows ?user ?user neoj4:firstName "claude"} ORDER BY ?album

SELECT ?personWHERE { ?person neoj4:knows ?friend . ?friend neoj4:knows ?user ?user neoj4:firstName "claude"} ORDER BY ?album

Page 20: No sql pour valtech tech days

En général distribuées et répliquéesEn général distribuées et répliquées

RéplicationRéplication

CléCléPartition 1

Partition 2

Répartition par hashage ou b-TreeRéplication au fil de l'eauTimestamps et versionning

Répartion

Page 21: No sql pour valtech tech days

3 caractéristiques techniques cruciales pour les systèmes systèmes distribuésdistribués Consistency

Partition Tolerance

Availability

Le CAP Theorem (Eric Brewer)Le CAP Theorem (Eric Brewer)

On ne peut pas On ne peut pas avoir les trois en avoir les trois en même tempsmême temps

Page 22: No sql pour valtech tech days

Eventual ConsistencyEventual Consistency

La plupart des bases NoSql sacrifient la cohérence au moins à court terme

RéplicationRéplication

OK

OK

KO

KO

Page 23: No sql pour valtech tech days

R+W > NR+W > N

Le client doit contrôler le niveau de cohérence

Paxos algorithm

OK

OK

W=3

R=2

N=4Quorum = N/2 + 1 = 3OK

Page 24: No sql pour valtech tech days

Des avantagesDes avantages

Facilite l'intégration dans les clouds

Peu de gestion de la sécurité

Facilite les traitements distribuésRéel avantage

de disponibilité

… … mais des inconvénientsmais des inconvénients

Coût du changement

Facilite les traitements distribués

Gestion de données hiérarchiques ou

réseau

Apprendre à bien gérer les clés

Elastique

Page 25: No sql pour valtech tech days

Cours du soir JMeter - Valtech 25

Bibliographie et crédits

Crédits photos et clipartsxxx xxx

Bibliographie

Structured Storage : http://en.wikipedia.org/wiki/Structured_storageCassandra : http://wiki.apache.org/cassandra/ThriftExamples

Page 26: No sql pour valtech tech days

Cours du soir JMeter - Valtech 26

Copyright notice

● Vous êtes libre de :● Reproduire, distribuer et communiquer cette création au public● Modifier cette création

● Selon les conditions suivantes :● Paternité. Vous devez citer le nom de l'auteur original de la

manière indiquée par l'auteur de l'oeuvre ou le titulaire des droits qui vous confère cette autorisation (mais pas d'une manière qui suggérerait qu'ils vous soutiennent ou approuvent votre utilisation de l'oeuvre).

● Rien dans ce contrat ne diminue ou ne restreint le droit moral de l'auteur ou des auteurs.

http://creativecommons.org/licenses/by/3.0/

Page 27: No sql pour valtech tech days

Cours du soir JMeter - Valtech 27

Contact information

Vous pouvez modifier cette présentation mais vous devez

citer les sources (auteur et traducteur) quelque part dans

votre présentation.

Par exemple incorporez cette diapositive au début pour

dire que votre présentation provient de ces sources.

Merci de faire pour le mieux.

Présentation de

Claude Falguière

http://fr.linkedin.com/in/claudefalguierehttp:www.valtech.fr

Présentation de

Claude Falguière

http://fr.linkedin.com/in/claudefalguierehttp:www.valtech.fr