Légère mise à jour de l'introduction aux bases de données NoSQL faite pour l'Ensim (Ecole Nationale Supérieure d'Ingénieurs du Mans), niveau Master en Janvier 2014. Ajout d'exemples et d'une présentation rapide des APIs majeures.
2. Quelques mots...
Laurent Broudoux
Le jour ...
Architecte IT Senior chez MMA
Mots-clés : Java, SOA, Agile, Software factories
La nuit …
Coder, geek, open source comitter (voir http://github.com/lbroudoux)
Me joindre / suivre
@lbroudoux
laurent.broudoux@gmail.com
http://lbroudoux.wordpress.com
4. Les bases relationnelles et SQL ?
●
Modèle prédominant pour stocker de l'information
depuis + de 30 ans !
Nécessité de nombreuses
lectures / écritures en
simultané. Les RDBMS
proposent un système de
gestion de transaction
efficace permettant
d'éviter le pire !
Ecosystème riche et
collaboration
indispensable. L'écriture
puis les lectures dans un
RDBMS est un modèle
fréquent d'intégration
applicative.
Les RDBMS ont imposé un
paradigme de
modélisation et un
lanqage de requêtage
(SQL) standards
globalement partagés
entre tous les vendeurs.
5. Les limites des bases relationnelles (i)
Impedance mismatch
id : 1001
customer : lbroudoux
line items :
payment details :
bird 8 3.25 € 26 €
rabbit 4 22 € 88 €
cat 2 112 € 224 €
card Master Card
card number 1234-5678-9101
expiry 12/2014
orders
customers
order lines
credit cards
6. Les limites des bases relationnelles (ii)
Scalabilité
Le modèle de consistance des RDBMS
empêche l'utilisation de plusieurs
machines pour répartir la charge (au moins
en écriture)
Pour augmenter la performance d'accès à la base, pas d'autres
moyens que d'acheter un plus gros serveur, puis un autre, puis un
autre, …
7. Eléments de contexte
●
Plusieurs tendances forment le terreau d'un changement
– La SOA (Service Oriented Architecture)
●
Intégration applicative maintenant basée sur la notion de service
– Le cloud et les besoins en très haute disponibilité
●
Prédominance des clusters
●
Approche commodity hardware
– La réalité économique
●
Coût des machines très haute performance
●
Facturation « au cœur » par les vendeurs
8. NoSQL ? Terme apparu en 2009 avec plusieurs
interprétations possibles :
– No SQL
– Not Only SQL
Pas de définition formelle mais des
caractéristiques communes partagées par les
bases dites NoSQL :
– N'utilise pas de modèle relationnel et donc
pas le langage SQL
– Conçu pour être exécutée dans un cluster,
– Tendance à être Open Source,
– Généralement sans schéma et donc
permettant de stocker n'importe quelle
donnée dans n'importe quelle « ligne »
NoSQL s'écarte du modèle
de données relationnel pour
généralement proposer un
modèle par agrégat.
9. Relations & Agrégats (i)
●
Soit un modèle relationnel exemple, exprimé en UML, en
utilisant des associations
10. Relations & Agrégats (ii)
Id Name
123 Broudoux
Id Name Price
27 Rabbit 3.25
Id City Street
66 Parigne Le Polin
Id OrderId ProductId Quantity Price
991 99 27 3 9.75
Id CustomerId AddressId
55 123 66
Customers
Products
Address
BillingAddress
Id CustomerId ShippingAddressId
99 123 66
Orders
Items
Id OrderId CardNumber TxnId BillingAddressId
991 99 1234-4567-8910 a23ef75cd65b78 66
Payments
●
Soit sa projection sur le modèle relationnel physique
– Normalisation, pas de répétition, agnostique à l'usage
11. Relations & Agrégats (iii)
●
Reprenons le même modèle selon l'approche « agrégat »
– On utilisera plutôt des compositions pour marquer les agrégats
Un agrégat
représente une
unité de
manipulation des
données et
de gestion de
la cohérence
12. Relations & Agrégats (iv)
●
Soit sa projection en
JSON (notation
communément utilisé
dans le monde NoSQL)
– Dénormalisation
– 2 agrégats principaux
– Relations entre
agrégats arbitraires et
assurées
applicativement
13. Conséquences de l'approche agrégats
●
L'approche agrégat règle les problèmes d'impédance
mismatch mais :
– Difficile de déterminer clairement les limites entre agrégats
●
Le coté schemaless est un + mais à double tranchant
– Difficile de réaliser certaines requêtes non prévues (penser à
l'analytique)
●
L'approche agrégat présente tout de même l'énorme avantage
de limiter le vérouillage transactionnel à l'agrégat
– ACID pour RDBMS
– BASE pour NoSQL
●
Basic Availability Soft-state Eventually consistent
16. Sharding (ii)
●
Bénéfices
– Performance
●
En écriture car scaling horizontal
●
En lecture lorsque géolocalisation des données
– Espace disque des machines
– Résilience partielle voire localisée
●
Préoccupations
– Répartition équitable des données
– Localisation des accès communs - d'où les agrégats ;-)
– Sharding as application logic ?!
17. Réplication Maître / Esclave (i)
Lectures peuvent être faites
depuis le maître ou les esclaves
Toutes les écritures sont
faites sur le maître
Maître
Esclaves
Les
changements se
propagent vers
les esclaves
18. Réplication Maître / Esclave (ii)
●
Bénéfices
– Pour les applications avec beaucoup de lectures
●
Performance
●
Résilience
– Elasticité par le provisioning de nouveaux esclaves
●
Préoccupations
– Inconsistance possible en lecture (local read-write à gérer
par le driver)
– Résilience pour l'écriture fonction de la capacité de
changement de rôle (maître est un SPOF)
– Algorithme de vote automatique et split brain !
19. Réplication Peer to Peer (i)
Tous les nœuds lisent
et écrivent toutes les
données
Noeud
Noeud
Les nœuds
communiquent
uniquement
leurs écritures
20. Réplication Peer to Peer (ii)
●
Bénéfices
– Résilience en lecture comme en écriture
– Elasticité par le povisionning transparent
– Performances des lectures
●
Préoccupations
– Inconsistances car écritures simultanées possibles
– Performances des écritures
●
Voir les quorums et versions vectors ...
– Volume de données à synchroniser et sens de synchro !
21. Combinaison Sharding & Réplication
Maître / Esclave
Maître pour 2
shards
Maître pour 1
shard – Esclave
pour 1 shard
Esclave pour 2
shards
Esclave pour 1
shard
Esclave pour 2
shards
Maître pour 2
shard
23. Théorème CAP
« Il est impossible pour un système distribué de
satisfaire plus de 2 des 3 propriétés suivantes :
Cohérence, Disponibilité et Résistance au
morcellement »
- Eric Brewer, 2000
24. Théorème CAP
Cohérence
[Consistancy]
Disponible
[Availability]
Résistance au morcellement
[Partition tolerance]
Tous les clients
voient les
mêmes données
Un nœud recevant
une requête doit
répondre (et non :
le système est ok si
panne de noeuds)
Le système continue de
fonctionner même en cas
d'échec de communication
entre noeuds
CA
APCP
25. « Relâcher la consistance »
●
Ecritures inconsistantes
– Classiquement : pessimiste (verrou) ou optimiste
(versionning)
– NoSQL : Ces approches ne fonctionnent pas si le système est
distribué !
●
Lectures inconsistantes
– Classiquement : transaction et verrouillage de plusieurs
tables
– NoSQL : Cette approche ne fonctionne pas si les données
sont réparties sur plusieurs agrégats !
26. « Relâcher la consistance »
●
Stratégies alternatives
– Enregistrer les écritures inconsistantes, résoudre plus tard
(ex : Amazon Cart)
– Réduire la fenêtre d'inconsistance en relâchant la durabilité
– Les Quorums
●
« Combien de nœuds participants pour considérer la
consistance comme forte ? »
● Soit W le nombre de nœuds devant acquitter une écriture
● Soit N le nombre de réplicats d'une donnée (replication factor)
● Soit R le nombre de nœuds devant acquitter une lecture
Consistance forte quand : W > N / 2 et R + W > N
28. Map Reduce ?
●
L'avènement des agrégats est en grande partie due aux
clusters
– Compromis dans la façon de stocker les données mais pas
seulement …
– Nécessité de revoir la façon dont les données sont manipulées !
●
Dans « l'ancien monde », il y avait 2 choix :
– Faire le traitement sur le client : liberté dans la plate-forme,
délestage du serveur mais seulement si peu de données
– Faire le traitement sur le serveur : contrainte environnement,
peu de données à transférer mais charge !
29. Map Reduce ?
●
Avec un cluster :
– Plein de puissance car plein de machines !
– Mais encore plus la nécessité de transférer le moins de
données possible et de réaliser le travail sur le nœud
possédant les données !
●
Map-Reduce est un pattern inspiré de la programmation
fonctionnelle
map reduce
Map transforme chaque
élément d'une collection et
émet des paires clé / valeur
Reduce récolte toutes les paires
ayant la même clé et réalise le
calcul pour retourner un résultat
K V
K V
K V K R
30. bird :
Mon premier Map Reduce (i)
id : 1001
customer : lbroudoux
line items :
shipping address : ...
payment details : ...
bird 8 3.25 € 26 €
rabbit 4 22 € 88 €
cat 2 112 € 224 €
map
Agrégat représentant une facture client : « Quel est le total
des ventes par produit ? »
Price : 26 €
quantity : 8
rabbit :
Price : 88 €
quantity : 4
cat :
Price : 224 €
quantity : 2
La fonction « map » lit les enregistrements depuis la base et émet des paires de
clés / valeurs. On choisit la clé en fonction du critère de regroupement voulu.
31. Mon premier Map Reduce (ii)
bird :
price : 26
quantity : 8
price : 13 €
quantity : 4
price : 7.5 €
quantity : 2
reduce bird :
price : 46.5 €
quantity : 14
La fonction « reduce » prend plusieurs paires de clés / valeurs ayant la même clé et
les aggrège en une seule.
Le système rassemble toutes les paires ayant la même clé
avant de les transmettre à la fonction de réduction
32. Partitionnement et combinaison
●
Sous la forme la plus simple, un job map-reduce exécute
la fonction reduce une seule fois …
●
… mais n'oublions pas qu'un système NoSQL est
naturellement distribué ...
●
Que se passe t-il quand il y a plusieurs millions
d'agrégats à traiter ?
– Quelle quantité de données à transférer ?
– Quelle performance ?
Il est possible d'augmenter le parallélisme en partitionnant
les résultats de la fonction map.
33. Map Reduce partitionné
m
m
bird 12
rabbit 2
rabbit 4
cat 6
bird 3
rabbit 3
fish 20
fish 6
bird 12
cat 6
rabbit 2
rabbit 4
bird 3
rabbit 3
fish 20
fish 6
bird 12
bird 3
cat 6
r
rabbit 2
rabbit 4
rabbit 3
fish 20
fish 6
r{
{
Le partitionnement permet à la fonction « reduce » de s'exécuter en parallèle sur
différentes clés, voir sur différents noeuds
34. Partionnement et combinaison
●
La plupart des données transférées est répétitive
– Même ensemble de clés
Il est possible de diminuer le volume de données en combinant
les résultats de la fonction map avant de les transférer.
combine reducemap
Local Potentiellement distant
35. Map Reduce combiné
m
bird 3
rabbit 3
fish 20
cat 2
fish 6
rabbit 2
bird 12
cat 1
combine
bird 15
rabbit 5
fish 26
cat 3
r
r
La fonction « combine » permet de réduire les données à transférer au travers du
réseau avant la réduction. Une telle fonction est aussi par nature une fonction de
réduction.
38. Bases clés / valeurs (i)
●
Grossièrement : une simple hash table où tous les accès se font
en utilisant la clé primaire
●
Seulement 3 opérations possibles :
– Put : donner une valeur à une clé
– Get : récupérer la valeur d'une clé
– Delete : effacer la clé et sa valeur
●
Support de structures basiques (list, hash, set)
●
Parfois, notion de bucket ou couplage à un moteur d'indexation (ex :
Riak)
●
Très haute performance (in-memory possible)
●
RESTful !
C'est quoi ?
39. Bases clés / valeurs (ii)
– De l'information très volatile
●
Session utilisateur, données d'un panier d'achat
– De l'information très peu volatile et accédée très fréquemment
●
Descriptions produits, paramétrage applicatif
A utiliser pour ...
A éviter pour ...
– Des données possédant des relations
●
Relations entre agrégats ou corrélation entre données de
différents ensemble de clés
– Des opérations impliquant de multiples clés
– Des besoins de requêtage par les données
40. Bases clés / valeurs (iii)
Comment ?
Ecriture d'une paire
clé/valeur
Lecture d'une valeur
Construction d'un objet domain complexe
42. Bases document (i)
●
Bases stockant des documents qui peuvent être des arbres
Xml, JSON, BSON, etc …
– Pensez à des bases clés-valeurs où le contenu est examinable
●
Documents souvent regroupés par Collection
– 2 documents de la même Collection ne possèdent pas
nécessairement la même structure
●
Requêtes possibles en utilisant des syntaxes analogues à
Xpath, Xquery, Javascript, JXPath
●
Parfois, fonctions d'agrégation : sum, count, group
C'est quoi ?
43. Bases document (ii)
– Données avec partie structurée et partie non structurée
●
Evénements des applicatifs (sharding possible par application)
– Données de publication variables
●
CMS, Blogging avec commentaires, contenu dynamique, etc …
– Données de suivi temps réel ou analytiques
A utiliser pour ...
A éviter pour ...
– Opérations nécessitant consistance sur plusieurs agrégats
– Des structures d'agrégat très changeante avec des besoins de
requêtage forts
●
Inconvénient du schemaless
46. Bases column-family (i)
●
Données définies par une clé à laquelle peut correspondre
plusieurs familles de colonnes étant elles même des maps de
données
●
Langage de requête souvent pauvre
C'est quoi ?
name ''broudoux''
billingAddress data ...
payment data ...
odr1001 data ...
odr1002 data ...
odr1003 data ...
odr1004 data ...
123
Clé de ligne
Famille de
colonnes
« profile »
Famille de
colonnes
« orders »
Clé de colonne Valeur de colonne
47. Bases column-family (ii)
– Données avec partie structurée et partie non structurée
●
Evénements des applicatifs (sharding possible par application)
– Données de publication variables
●
CMS, Blogging avec commentaires, contenu dynamique, etc …
– Compteurs et analytiques
– Données avec TTL
A utiliser pour ...
A éviter pour ...
– Des besoins de requêtage complexes
– Des besoins de calcul d'agrégation simples (nécessité de
passer systématiquement par Map-Reduce aujourd'hui)
50. Bases graph (i)
●
Stockage sous forme d'entités (nodes) et d'associations (edges)
●
Les nodes possèdent des propriétés (penser à un objet)
●
Les edges possèdent un type (likes, author)
●
Optimisées pour traverser le graph rapidement dans n'importe
quel sens
– « Quelles sont les personnes employées par X dont les amis aiment le
film Y ? »
●
Modèle de distribution contraint : souvent pas de sharding
automatique, seulement réplication
●
Langages de requête « exotiques » : Gremlin, Cypher
●
Parfois, complété par un moteur d'indexation
C'est quoi ?
51. Bases graph (ii)
– Les moteurs de recommandations
●
« Les autres clients ayant acheté ce produit ont aussi acheté ... »
– Les données naturellement connectées
●
Réseaux sociaux
– Les services basés sur la localisation ou le calcul d'itinéraires
A utiliser pour ...
A éviter pour ...
– Les cas où de nombreux nœuds doivent être mis à jour
54. Get lucky with API ?
●
Des initiatives pour tenter d'uniformiser, abstraire le
développement avec bases NoSQL ?
– Spring Data : nouvelle API
●
Support correct de MongoDB, Neo4j, Redis, Riakn, Gemfire, JPA (?)
●
Support émergent de Hadoop/HTable, CouchDB, Elasticsearch,
Cassandra
– Hibernate OGM : construit sur JPA
●
Support de Infinispan, MongoDB, Neo4j
– GORM : origine Grails, maintenant utilisable en standalone
●
Support natif de Hibernate et MongoDB
●
Autres bases via encapsulation de Spring Data
55. Au delà de NoSQL...
« Polyglot Persistence » from Thoughtworks NoSQL Intro
56. Au delà de NoSQL...
BigData et Hadoop FileSystem
– Principes analogues mais appliqués à un file system
●
Sharding, replication, quorums pour la lecture / écriture
●
Map/Reduce pour la manipulation des données