no sql pour valtech tech days
TRANSCRIPT
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
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 ?
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
Mouvement démarré fin 2008
Emergence en 2010Emergence en 2010
Facebook annonce Cassandra
Twitter passe de MySql à
Cassandra
Twitter passe de Cassandra à
MySql
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
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
Structured Structured DatabaseDatabase
Document Store
Key-Value Store(Tableaux associatifs)
Graph
Column(Dimensionnelle
)
Les modèles de donnéesLes modèles de données
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
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/
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/
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
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/
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) ...
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
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/
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/
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
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/
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
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
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
Eventual ConsistencyEventual Consistency
La plupart des bases NoSql sacrifient la cohérence au moins à court terme
RéplicationRéplication
OK
OK
KO
KO
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
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
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
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/
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