Chapitre 2 NoSQL
Chapitre 2 NoSQL
1
Plan de cette présentation
I. Introduction
A. Problèmes avec les systèmes de gestion de bases de données relationnelles
B. Architecture à serveur unique VS base de données distribuée
C. NoSQL et changement de paradigme (paradigm shift)
II. Qu'est-ce que NoSQL ?
A. Historique des bases de données NoSQL
B. Relation entre Big Data et NoSQL
C. Relation entre la mise à l'échelle horizontale et NoSQL
III. Classement de bases de données NoSQL
A. Classement par usage
B. Classement par schéma de données
IV. NoSQL et cohérence
A. Le théorème CAP
2
Introduction
SGBDR
3
Introduction
SGBDR
Cependant ... ces modèles n’ont pas connu un franc succès auprès des
acteurs de l’informatique, et le modèle relationnel est resté très
majoritairement dominant.
4
Introduction
Problèmes avec les SGBDR
5
Introduction
Problèmes avec les SGBDR
6
Introduction
Problèmes avec les SGBDR
9
Introduction
Architecture à serveur unique
(Single server architecture)
10
Introduction
Architecture à serveur unique
(Single server architecture)
12
Introduction
Bases de données distribuées
Il existe plusieurs SGBDR qui peuvent être distribués, notamment :
● MySQL : MySQL est un SGBDR open source populaire qui peut être distribué sur plusieurs
machines. MySQL Cluster Edition est conçu pour les applications à grande échelle et à
haute disponibilité et prend en charge les bases de données distribuées.
● Oracle : Oracle est un SGBDR commercial qui prend en charge les bases de données
distribuées et fournit des fonctionnalités telles que la réplication de données en temps réel,
l'équilibrage de charge et le basculement automatique (automatic failover).
● Microsoft SQL Server : Microsoft SQL Server est un SGBDR commercial qui prend en
charge les bases de données distribuées via ses fonctionnalités de clustering de
basculement SQL Server et de groupes de disponibilité SQL Server Always On.
● PostgreSQL : PostgreSQL est un SGBDR open source populaire qui prend en charge les
bases de données distribuées grâce à ses fonctionnalités intégrées de réplication et de
partitionnement.
● IBM Db2 : IBM Db2 est un SGBDR commercial qui prend en charge les bases de données
distribuées via sa fonction IBM Db2 pureScale, qui fournit un basculement automatique et un
équilibrage de charge pour les applications à grande échelle.
13
Introduction
Bases de données distribuées
Au fur et à mesure que les grandes propriétés se sont déplacées vers les clusters, cela a révélé un
nouveau problème : les bases de données relationnelles ne sont pas conçues pour être exécutées sur
des clusters. Les bases de données relationnelles en cluster, telles qu'Oracle RAC ou Microsoft SQL
Server, fonctionnent sur le concept d'un sous-système de disque partagé. Ils utilisent un système de
fichiers compatible avec les clusters qui écrit sur un sous-système de disque hautement disponible,
mais cela signifie que le cluster a toujours le sous-système de disque comme point de défaillance
unique. Les bases de données relationnelles peuvent également être exécutées en tant que serveurs
distincts pour différents ensembles de données, divisant efficacement la base de données. Bien que
cela sépare la charge, tout le sharding doit être contrôlé par l'application qui doit garder une trace du
serveur de base de données auquel parler pour chaque bit de données. De plus, nous perdons toutes
les requêtes, l'intégrité référentielle, les transactions ou les contrôles de cohérence qui traversent les
fragments. Une expression que nous entendons souvent dans ce contexte de la part de personnes qui
ont fait cela est « actes contre nature ».
14
Introduction
NoSQL et changement de paradigme (paradigm shift)
15
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data"
16
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data"
17
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data"
Vitesse
Variabilité
18
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data" - La solution Google
19
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data" - La solution Google
20
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data" - La solution Google
● Dans une BdD relationnelle, une structure de requête classique est de la forme
SELECT-FROM-WHERE-GROUPBY. L' application de la condition du Where (1) revient à
appliquer sur chaque ligne de la relation la fonction de test booléenne f(...). Puis l’exécution du
Group by va tout d’abord (2) trier les lignes retenues selon l’attribut attr2 en regroupant celles
présentant la même valeur pour cet attribut, et va ensuite (3) appliquer la fonction g(...) sur la
liste des attributs attr1 d’un ensemble de lignes de même attribut attr2.
● Ceci correspond à appliquer une fonction map(f, lignes de la relation), puis à trier et
regrouper les lignes retenues selon l’attribut attr2, et enfin à appliquer la fonction reduce(g,
liste d’attr1) aux attributs attr1 de chaque groupe de lignes.
● Une opération Map-Reduce, avec une fonction reduce appliquée par groupe de résultats de la
fonction map, permet donc de refaire un "Select...From...Where...Group by...". Sa mise en
œuvre sera sans doute plus complexe que l’emploi de SQL, mais sera aussi plus
générique : elle fonctionnera même si les éléments stockés dans la base ne sont pas de
simples attributs de types scalaires comme dans une BdD relationnelle. Par exemple, si
les éléments stockés sont des données structurées complexes, comme des fichiers de
données, un SGBDR ne pourrait pas être employé, alors qu’un mécanisme de Map-Reduce au
dessus d’un système de fichiers distribués sera utilisable.
21
Introduction
NoSQL et changement de paradigme (paradigm shift)
L'émergence du "Big Data" - La solution Google
● La présentation par Google en 2003-2004 de son système de
fichiers distribué et de son mécanisme de Map-Reduce distribué
avait fait une forte impression, mais ces outils restaient propriété
et exclusivité de Google. Inévitablement, une implantation libre
vit le jour peu de temps après. Hadoop fut développé initialement
par Doug Cutting pour mettre au point un moteur de recherche
libre. Il repose sur le système de fichier distribué HDFS (Hadoop
Distributed File System), et sur un mécanisme de Map-Reduce
distribué exploitant HDFS.
● L’environnement de développement choisi fur l’écosystème
extrêmement portable de Java. Hadoop a été assez rapidement
adopté, et des sociétés comme Yahoo ! et Facebook annonçait
déjà en 2012 avoir des dizaines de milliers de machines
exploitées par Hadoop.
● Le développeur d’applications basées sur Hadoop écrit
essentiellement les fonction map et reduce, sous forme de
classes Java.
22
Qu'est-ce que NoSQL ?
Le terme « NoSQL » a été inventé en 2009 lors d'un événement sur les
bases de données partagées. Le terme est vague, incorrect (certains
moteurs NoSQL utilisent des variantes du langage SQL, par exemple
Cassandra), mais présente l'avantage d'avoir un effet marketing et
polémique certain.
23
Qu'est-ce que NoSQL ?
Historique des bases de données NoSQL
Pour comprendre les bases de données NoSQL, nous
devons savoir pourquoi elles sont là en premier lieu…
Au milieu des années 80, c'était le moment où les bases de
données relationnelles arrivaient vraiment et commençaient leur
ascension, il était assez difficile d'imaginer qu'il y aurait un temps
sans bases de données relationnelles.
SGBDR nous a apporté de nombreux avantages:
● Persistance de nos données
● Gestion de la concurrence par le biais de transactions
● SQL est devenu un langage standard de facto pour interroger
ces bases de données
mais les bases de données relationnelles ont
● Intégration et rapports
aussi quelques problèmes...
24
Qu'est-ce que NoSQL ?
On multiplie le nombre de tables pour représenter
conceptuellement le même objet.
Historique des bases de données NoSQL
● L'une des rugosités du langage SQL est ce que les
Anglo-Saxons appellent le défaut d'impédance (impedance
mismatch) objet-relationnel.
● Par défaut d'impédance, les créateurs du terme veulent
signifier que le passage du relationnel à l'objet s'effectue
avec une perte d'énergie et une résistance trop forte.
● Comme on le voit sur cette figure, nous assemblons des
structures d'objets en mémoire souvent en termes d'une
sorte d'ensemble cohérent de choses, puis afin de
l'enregistrer dans la base de données, nous devons
décomposer cette structure en parties afin qu'elle entre
dans ces lignes individuelles et ces tables individuelles.
● Pour traiter ce défaut d'impédance, des frameworks de
mapping objet-relationnel (Object-Relational Mapping,
ORM) ont été proposés.
25
Qu'est-ce que NoSQL ?
Historique des bases de données NoSQL
Le défaut d'impédance est un problème suffisamment
gênant pour qu'au milieu des années 90, les gens disaient
que les bases de données relationnelles allaient disparaître et
que les bases de données d'objets allaient arriver, de cette
façon nous pouvons prendre nos structures en mémoire et les
enregistrer directement sur disque sans aucune de ces
correspondances (mapping) entre les deux.
26
Qu'est-ce que NoSQL ?
Historique des bases de données NoSQL
28
Qu'est-ce que NoSQL ?
Historique des bases de données NoSQL
● SQL a été conçu pour fonctionner sur ces
grandes boîtes conçues pour fonctionner
comme un système de nœud de données
unique, il ne fonctionne pas très bien avec de
grands groupes de petites boîtes.
● Plusieurs acteurs du big data ont compris ce
problème. Ils ont essayé de distribuer des
bases de données relationnelles et de les
exécuter sur des clusters, cela a fonctionné,
mais cela reste "non naturel" et compliqué.
Les bases de données SQL, de par leur
conception, étaient censées fonctionner sur
un nœud unique et centralisé.
29
Qu'est-ce que NoSQL ?
Historique des bases de données NoSQL
● Quelques organisations ont dit "nous en avons assez, nous
devons faire quelque chose de différent" et elles ont développé
leurs propres systèmes de stockage de données qui étaient
vraiment très différents des bases de données relationnelles.
● Google avait tout d’abord développé BigTable en 2004 : une BdD
distribuée bâtie sur son système de fichiers distribués GFS et sur
son propre mécanisme de Map-Reduce pour traiter les requêtes
d’interrogation des données. Il s’agissait d’un entrepôt de données
orienté colonnes. Les données sont encore organisées en lignes et
colonnes, mais toutes les lignes n’ont pas forcément les mêmes
colonnes (modèle beaucoup plus souple que celui des BdD
relationnelles).
● En 2007 Amazon développe un entrepôt de paires clé-valeur
appelé Dynamo, totalement distribué avec une architecture sans
maître.
● Ces grandes organisations ont commencé à parler un peu de leurs
solutions, ont publié des articles scientifiques et c'est cela qui a
vraiment inspiré tout un nouveau mouvement de bases de
données qui est le mouvement NoSQL.
30
Qu'est-ce que NoSQL ?
31
Qu'est-ce que NoSQL ?
Le terme NOSQL est généralement interprété comme Not Only SQL et vise à
signifier que de nombreuses applications ont besoin de systèmes autres que les
systèmes SQL relationnels traditionnels pour augmenter leurs besoins en gestion
de données.
La plupart des systèmes NOSQL sont des bases de données distribuées ou des
systèmes de stockage distribués, mettant l'accent sur le stockage de données
semi-structurées, les hautes performances, la disponibilité, la réplication des
données et l'évolutivité, par opposition à l'accent mis sur la cohérence immédiate
des données, les langages de requête puissants et les données structurées.
32
Qu'est-ce que NoSQL ?
Quelle est la relation entre Big Data et NoSQL ?
33
Qu'est-ce que NoSQL ?
36
Qu'est-ce que NoSQL ?
● NoSQL fonctionne sur de nombreux processeurs
○ Les systèmes NoSQL vous permettent de stocker votre base de données sur plusieurs
processeurs et de maintenir des performances à haute vitesse.
● La définition ne s'agit pas du langage SQL
○ La définition de NoSQL n'est pas une application qui utilise un langage autre que SQL. SQL
ainsi que d'autres langages de requête sont utilisés avec les bases de données NoSQL.
● Il n'y a pas que le big data
○ De nombreuses applications NoSQL, mais pas toutes, sont motivées par l'incapacité d'une
application actuelle à évoluer efficacement lorsque le Big Data est un problème. Bien que le
volume et la vitesse soient importants, NoSQL se concentre également sur la variabilité et
l'agilité.
37
Qu'est-ce que NoSQL ?
Que signifie l'agilité dans les systèmes NoSQL ?
38
Qu'est-ce que NoSQL ?
Que signifie l'agilité dans les systèmes NoSQL ?
Exemple d'adaptation ou de modification d'une collection MongoDB
Imaginez que vous ayez une collection MongoDB appelée "customers" qui est
utilisée pour stocker des informations sur les clients de votre entreprise. La
collection a un schéma fixe, chaque document ayant les champs suivants :
39
Qu'est-ce que NoSQL ?
40
Qu'est-ce que NoSQL ?
Que signifie l'agilité dans les systèmes NoSQL ?
Exemple d'adaptation ou de modification d'une collection MongoDB
Cela ajoutera le champ d'adresse à chaque document de la collection clients. Les
nouveaux documents auront désormais la structure suivante :
41
Classement de bases de données NoSQL
42
Classement de bases de données NoSQL
Classement par usage
● Assouplissement de la structure :
○ Pour s'affranchir de la rigidité du modèle relationnel, les moteurs NoSQL simplifient la plupart
du temps la structure des données (utilisations de schéma souples comme le JSON,
relâchement des contraintes, pas d'intégrité référentielle entre des tables, pas de schéma
explicite au niveau du serveur).
● Structures spécifiques :
○ Certains moteurs NoSQL sont dédiés à des besoins spécifiques, et implémentent donc une
structure et des fonctionnalités focalisées sur un cas d'utilisation. Citons par exemple les
moteurs orientés graphes, ou les moteurs de recherche plein texte qui offrent également des
fonctionnalités proches d'un SGBD, comme Apache Solr ou ElasticSearch.
43
Classement de bases de données NoSQL
Classement par usage
● Volumétrie :
L'un des aspects importants des moteurs NoSQL est leur capacité à monter en charge. C'est
sans doute même la raison première de la création du mouvement NoSQL. Supporter des
volumétries importantes passe par une distribution du stockage et du traitement. Hadoop est un
système de distribution du traitement colocalisé avec un système de distribution de stockage. La
distribution du traitement est très importante dans un conexte analytique et dans la plupart des
applications Big Data. Le stockage distribué est soit réalisé par des fichiers plats sur un système
de fichiers distribués, soit par un moteur de base de données distribué comme Cassandra ou
Hbase, conçu pour fonctionner sur un large cluster de machines.
44
Classement de bases de données NoSQL
Classement par schéma de données
45
Classement de bases de données NoSQL
Key-Value
● Une base de données clé-valeur est un type de base de données
NoSQL conçue pour stocker des données sous forme de paires
clé-valeur. Dans une base de données clé-valeur, les données
sont stockées sous la forme d'une collection de paires clé-valeur,
où chaque clé est associée à une valeur. La clé est un identifiant
unique pour les données, tandis que la valeur correspond aux
données réelles stockées.
○ ça pourrait être un nombre unique, ça pourrait être un document complexe
ou une image
● Les bases de données clé-valeur sont hautement évolutives et
performantes, et sont bien adaptées aux applications qui
nécessitent des lectures et des écritures à grande vitesse. Ils sont
souvent utilisés pour la mise en cache, la gestion des
sessions et d'autres applications nécessitant un accès rapide et
à faible latence aux données.
46
Classement de bases de données NoSQL
Key-Value
47
Classement de bases de données NoSQL
Modèle de données du document (Document Data Model)
● En relationnel, on a des lignes (des nuplets pour être précis) et des tables
(des relations). Dans le contexte du NoSQL, on va parler de documents et
de collections.
● Dans un nuplet relationnel, on ne trouve que des valeurs dites
atomiques, non décomposables. Il ne peut y avoir qu’un seul genre pour un
film. Si ce n’est pas le cas, il faut (processus de normalisation) créer une table
des genres et la lier à la table des films.
○ Cette nécessité de distribuer les données dans plusieurs tables est une lourdeur
souvent reprochée à la modélisation relationnelle.
● Avec un document structuré (en notation JSON), il est très facile de
représenter les genres comme un tableau de valeurs, ce qui rompt la
première règle de normalisation. On pourrait donc « encoder » une base
relationnelle sous la forme de documents structurés, et chaque document
pourrait être plus complexe structurellement qu’une ligne dans une table
relationnelle.
○ Facilite l'ajout de nouveaux champs de données ou la modification du schéma de vos
données sans avoir à apporter de modifications majeures à votre base de données.
48
Classement de bases de données NoSQL
Modèle de données du document (Document Data Model)
49
Classement de bases de données NoSQL
Bases de données orientées colonnes
● Les bases de données orientées colonnes sont assez proches
conceptuellement des tables relationnelles : elles comportent
des colonnes avec un type de données. La structure des
bases orientées colonnes est modélisée selon BigTable, la
base de données de Google.
● Une table comporte des clés, souvent appelées rowkeys, les
clés de lignes. Ces clés sont uniques et sont maintenues
dans un ordre lexicographique.
● À l'intérieur de la table, des familles de colonnes sont définies
et regroupées. La famille de colonnes est prédéfinie, et on lui
attribue souvent des options, alors que les colonnes qui s'y
trouvent ne sont pas prédéfinies, c'est-à-dire qu'il n'y a pas de
description de schéma à l 'intérieur d'une famille de colonnes.
D'une ligne à l'autre, les colonnes présentes dans une famille
peuvent varier selon les données à stocker.
50
Classement de bases de données NoSQL
Bases de données orientées colonnes
● Le stockage sur le disque est organisé par famille de colonnes. On
peut donc considérer les familles de colonnes comme des
sous-tables. Si on représente cette organisation du point de vue de la
structure des données qu'on peut manipuler dans un langage comme
Java, on peut voir les choses comme illustrées à la figure suivante :
● La table est un ensemble trié de clés. La clé est une liste de
familles, la famille est un ensemble trié de colonnes, et la
colonne est une liste de valeurs - timestamp. Cela donne en une
ligne:
○ SortedMap<Cle, List<SortedMap<Colonne, List<Valeur, Timestamp>>>>
● Les colonnes comportent donc un nom de colonne, une valeur et un
horodatage (timestamp).
● Les bases orientées colonnes sont plus difficiles et complexes à
mettre en place que les bases orientées documents ou paires
clé-valeur, elles correspondent à des besoins plus larges.
51
Classement de bases de données NoSQL
Bases de données orientées graphes
● Une base de données de graphes est une base de données
NoSQL basée sur la théorie des graphes pour stocker des
données sur des environnements riches en relations. La
théorie des graphes est un domaine mathématique et
informatique qui modélise les relations entre des objets
appelés nœuds. La modélisation et le stockage de données sur
les relations sont au cœur des bases de données de graphes.
● L'intérêt pour les bases de données de graphes est né dans
le domaine des réseaux sociaux.
● Dans les données des réseaux sociaux, il peut y avoir des
dizaines de relations différentes entre les individus qui doivent
être suivies, et souvent les relations sont suivies à plusieurs
niveaux (par exemple, amis, amis d'amis et amis d'amis
d'amis). Il en résulte une situation où les relations deviennent
tout aussi importantes que les données elles-mêmes. C'est
le domaine où brillent les bases de données de graphes.
52
Classement de bases de données NoSQL
53
NoSQL et cohérence
54
NoSQL et cohérence
Le transactionnel et la cohérence des données
Dans le monde informatique, une transaction est une unité d'action qui doit respecter quatre critères, résumés par
l'acronyme ACID, et qu'on nomme donc l'acidité de la transaction.
Critère Définition
Atomique Une transaction représente une unité de travail qui est intégralement validée ou totalement annulée. C'est
tout ou rien.
Cohèrente La transaction doit maintenir le système en cohérence par rapport à ses règles fonctionnelles. Durant
l'exécution de la transaction, le système peut être temporairement incohérent, mais lorsque la transaction se
termine, il doit être cohérent, soit dans un nouvel état si la transaction est validée, soit dans l'état cohérent
antérieur si la transaction est annulée.
Isolée Comme la transaction met temporairement les données qu'elle manipule dans un état incohérent, elle isole
ces données des autres transactions de façon à ce qu'elle ne puisse pas lire des données en cours de
modification.
Durable Lorsque la transaction est validée, le nouvel état est durablement inscrit dans le système.
55
NoSQL et cohérence
Le transactionnel et la cohérence des données
● La notion de cohérence est importante, et c'est l'un des éléments les plus sensibles
entre le monde du relationnel et le monde NoSQL.
● Les SGBDR imposent une règle stricte: d'un point de vue transactionnel, les lectures de
données se feront toujours sur des données cohérentes. La base de données est
visible en permanence sur un état cohérent. Les modifications (état intermédiaire) en
cours sont donc cachées.
● Mais cet état intermédiaire peut durer longtemps, pour deux raisons: plusieurs
instructions de modifications de données peuvent être regroupées dans une unité
transactionnelle, qui peut donc être complexe. Ensuite, un SGBDR fonctionnant de façon
ensembliste, une seule instruction de mise à jour, qui est naturellement et
automatiquement transactionnelle, peut très bien déclencher la mise à jour de milliers
de lignes de table. Cette modification en masse conservera des verrous d'écriture sur les
ressources et écrira dans le journal de transaction ligne par ligne. Tout ceci prend bien
évidemment du temps.
56
NoSQL et cohérence
Le transactionnel et la cohérence des données
Une transaction, c'est donc un mécanisme d'isolation d'une opération
simple ou complexe.
Elle est importante dans le cadre d'un SGBDR, car du fait du modèle
relationnel, une donnée complexe va se décomposer dans plusieurs tables
et devra donc faire l'objet de plusieurs opérations d'écriture.
57
NoSQL et cohérence
Relâchement de la rigueur transactionnelle
● On comprend bien qu'un moteur NoSQL, basé sur le principe de l'agrégat, ne présente pas ce
genre de problème. Dans MongoDB par exemple, on écrit en une seule fois un document JSON qui
agrège toutes les informations de la commande : plus besoin par conséquent d'une transaction
explicite.
● De fait, les critères de la transaction changent de sens: l'écriture est naturellement atomique
car le document est écrit en une fois, et elle est naturellement isolée car le document est
verrouillé durant l'écriture.
● Il faut donc repenser le concept des critères transactionnels à la lumière d'un système qui
gère différemment ses données, et dont les possibilités et les exigences sont autres.
● Les systèmes NoSQL agrègent les données, mais quand ils sont distribués, ils les
dupliquent. Cela repose le problème transactionnel dans le cadre de la réplication. Si on écrit une
donnée plusieurs fois, sur plusieurs nœuds d'un cluster, cette écriture redondante sera-t-elle
atomique, cohérente, isolée et durable? C'est dans ce contexte qu'il faut comprendre les
discussions autour de la cohérence (consistency) des écritures dans un moteur NoSQL.
58
NoSQL et cohérence
Un exemple d'incohérence logique
Imaginons que nous ayons une commande avec des
articles et des frais d'expédition. Les frais d'expédition sont
calculés en fonction des articles de la commande.
59
NoSQL et cohérence
Un exemple d'incohérence logique
● Pour éviter un conflit lecture-écriture logiquement incohérent, les bases de
données relationnelles prennent en charge la notion de transactions.
● Une affirmation courante que nous entendons est que les bases de données NoSQL ne prennent
pas en charge les transactions et ne peuvent donc pas être cohérentes. Une telle affirmation est
généralement fausse car elle passe sous silence de nombreux détails importants. Notre
première clarification est que toute déclaration sur le manque de transactions ne s'applique
généralement qu'à certaines bases de données NoSQL, en particulier celles orientées agrégats.
En revanche, les bases de données de graphes ont tendance à prendre en charge les
transactions ACID de la même manière que les bases de données relationnelles.
● Deuxièmement, les bases de données orientées agrégat prennent en charge les mises à jour
atomiques, mais uniquement au sein d'un seul agrégat. Cela signifie que vous aurez une
cohérence logique au sein d'un agrégat, mais pas entre les agrégats. Ainsi, dans l'exemple,
vous pouvez éviter de rencontrer cette incohérence si la commande, les frais de livraison
et les éléments de ligne font tous partie d'un seul agrégat de commande.
60
NoSQL et cohérence
Un exemple d'incohérence de réplication*
Imaginons qu'il y ait une dernière chambre d'hôtel pour un
événement souhaitable. Le système de réservation d'hôtel fonctionne
sur de nombreux nœuds. Martin et Cindy sont un couple qui
envisage cette chambre, mais ils en discutent au téléphone car
Martin est à Londres et Cindy est à Boston. Pendant ce temps,
Pramod, qui est à Mumbai, va réserver cette dernière chambre. Cela
met à jour la disponibilité des chambres répliquées, mais la mise
à jour arrive à Boston plus rapidement qu'à Londres. Lorsque
Martin et Cindy lancent leurs navigateurs pour voir si la chambre est
disponible, Cindy la voit réservée et Martin la voit libre. Il s'agit d'une
autre lecture incohérente, mais il s'agit d'une violation d'une autre
forme de cohérence que nous appelons la cohérence de la
réplication : garantir que le même élément de données a la même
valeur lorsqu'il est lu à partir de différentes répliques.
*La réplication est le processus de copie de données d'un serveur vers un ou plusieurs autres serveurs,
afin de s'assurer que les données sont disponibles à plusieurs endroits. 61
NoSQL et cohérence
Théorème CAP
Théorème CAP : dans un système distribué il est impossible
de garantir à chaque instant T plus que deux parmi les
trois propriétés suivantes :
● Consistency (cohérence) :
○ tous les nœuds sont à jour sur les données au même moment;
● Availability (disponibilité) :
○ la perte d'un nœud n'empêche pas le système de fonctionner et
de servir l'intégralité des données;
● Partition tolerance (résistance au morcellement / une
panne partielle)
○ chaque nœud doit pouvoir fonctionner de manière autonome.
62
NoSQL et cohérence
Théorème CAP
Théorème CAP : dans un système distribué il est impossible
de garantir à chaque instant T plus que deux parmi les
trois propriétés suivantes :
● Consistency (cohérence) :
○ tous les nœuds sont à jour sur les données au même moment;
● Availability (disponibilité) :
○ la perte d'un nœud n'empêche pas le système de fonctionner et
de servir l'intégralité des données; Si vous avez un système qui peut avoir une
● Partition tolerance (résistance au morcellement / panne partition réseau et si vous avez un système
distribué, vous avez le choix : voulez-vous être
partielle) cohérent ou voulez-vous être disponible ?
○ chaque nœud doit pouvoir fonctionner de manière autonome.
63
NoSQL et cohérence
Théorème CAP
● Pramod et Martin veulent tous les deux réserver une chambre d'hôtel mais
la ligne de communication est coupée et les deux nœuds ne peuvent pas
communiquer (nous avons une “partition”).
● Il y a deux choix : L'un est que le système dit "ah, notre ligne de
communication est en panne, désolé, nous ne pouvons pas prendre
vos réservations d'hôtel pour le moment, veuillez réessayer plus
tard".
● L'alternative est que le système dise "oui, nous accepterons votre
réservation car nous sommes vraiment fiables et à jour".
● Ce que nous voyons, c'est un choix, c'est un choix entre la cohérence qui
signifie "non je ne ferai rien si mes lignes de communication sont
coupées" et la disponibilité qui dit "oui je vais continuer mais au risque
d'introduire un comportement incohérent".
● Maintenant, la chose essentielle à réaliser ici est qu'il s'agit d'un choix et
que c'est un choix qui ne peut être fait qu'en connaissant les règles
métier (business rules) avec lesquelles vous travaillez.
64
NoSQL et cohérence
Théorème CAP
● Il y a des cas où vous pouvez traiter avec élégance des réponses incohérentes aux
demandes. Ces situations sont étroitement liées au domaine et nécessitent une
connaissance du domaine pour savoir comment les résoudre. Ainsi, vous ne pouvez
généralement pas chercher à les résoudre uniquement au sein de l'équipe de
développement - vous devez parler à des experts du domaine. Si vous pouvez trouver
un moyen de gérer les mises à jour incohérentes, cela vous donne plus d'options pour
augmenter la disponibilité et les performances. Pour un panier (shopping cart), cela
signifie que les acheteurs peuvent toujours faire leurs achats et le faire rapidement.
● Dans certains cas, vous devez savoir dans quelle mesure vous tolérez les lectures
obsolètes et combien de temps peut durer la fenêtre d'incohérence.
● Il est généralement préférable de ne pas penser au compromis entre cohérence et
disponibilité, mais plutôt entre cohérence et latence. Nous pouvons alors considérer la
disponibilité comme la limite de latence que nous sommes prêts à tolérer ; une fois que la
latence devient trop élevée, nous abandonnons et traitons les données comme
indisponibles.
65
NoSQL et cohérence
Théorème CAP
● Grâce à ce théorème de CAP, il est alors
possible de classer toutes les bases de
données en les plaçant sur le "triangle de
CAP", tout en ajoutant des codes couleurs
pour chaque modèle de stockage.
● Nous pouvons constater que les bases de
données relationnelles se retrouvent sur la
face CA du triangle, combinant disponibilité
et cohérence. Nous retrouvons bien
MongoDB pour le couple CP (cohérence et
distribution) mais également les solutions
orientées colonnes comme HBase ou
BigTable.
66
Conclusion
Les bases NoSQL ne remplacent pas les BD relationnelles mais en sont une alternative, un
complément
apportant des solutions plus intéressantes dans certains contextes.
● On utilisera une base relationnelle, comme PostgreSQL, pour enregistrer rigoureusement les
transactions commerciales validées. Cela représente environ 1% de l'ensemble des accès aux
données, les autres actions étant essentiellement de la consultation et de la construction de paniers
d'achat.
● On utilisera une base orientée document, comme MongoDB, pour gérer l'interaction entre l'utilisateur
et le catalogue de produits et enregistrer les paniers. Cela permet de proposer une interface plus
réactive. Certaines incohérences se manifesteront parfois, par exemple on aura autorisé à ajouter un
objet au panier alors qu'au moment de la validation (et donc de la vérification dans la base
PostgreSQL) on découvrira qu'il n'est finalement pas disponible. On considère ici que ces quelques
erreurs sont non critiques et acceptables au regard du gain de performance acquis.
67