Table des matières

Base de données relationnelles (SQL)

Respect des transactions ACID : Atomicité (tout ou rien), Cohérence (respect des contraintes d'intégrité), Isolation (pas d'interférence si concurrence d'accès, personne ne peut voir les états intermédiare), Durabilité (log, réplication). En cas de base de données répartie utilisation de algorithme du commit à deux phases.

Propriétés CAP : Consistency (cohérence, tout le monde voit les mêmes valeurs), Availability (Disponibilité même en cas de problème matériel), Partition Tolerance (résistance au partitionnement, le système marche encore s'il est déconnecté de la réplication). Il n'est pas possible d'avoir un fonctionnement avec les 3 en même temps. ACID, c'est C et A.

CAP 1 CAP 2

Consistency Tuning In Cassandra – experience@imaginea Archive du 04/09/2013 le 23/10/2019

Guy Harrison - Yet Another Database Blog - Consistency models in Non relational Databases Archive du 13/06/2010 le 23/10/2019

NoSQL

Différences

Schema NoSQL

Cours CNAM, Archive

Versionnement

Traitement des incohérences, trié par degré de complexité :

Estampilles temporelles

Chaque valeur possède un temps. En cas de conflit, on prends la plus récente.

Problèmes :

Stratégie optimiste

On ne travaille plus avec un compteur de temps mais par un incrément d'un compteur. Si la valeur est différente, la transaction est rejetée.

Problème : grand nombre de nœuds et nombreuses sollicitations

Horloge vectorielle

Copies multiples d'une même donnée puis synchronisation et détection de conflit.

Solution : pour chaque donnée, chaque nœud stocke le compteur de temps de tous les nœuds (enfin… la dernière valeur connue). On a donc pour chaque nœud, en plus de chaque donnée, un vecteur dont la taille est la même que le nombre de nœuds de la base de données.

Au début, le vecteur est initialisé à 0 pour le nœud en cours et inconnu pour les autres nœuds.

Si un nœud reçoit une demande de modification, il l'applique et incrémente son compteur de 1.

Quand il envoie la donnée à un autre nœud, il l'accompagne de son vecteur. Le nœud qui le reçoit à trois possibilités :

Répartition et partitionnement

Dans un système de base de données NoSQL, le volume de données est très nombreux et dépasse la capacité d'une machine d'où la nécessite de faire de la répartition. Comme la répartition est simple à faire, on utilise plutôt beaucoup de machine à bas coup plutôt que 2-3 très élevé. Il est donc courant de voir apparaître et disparaître des nœuds. Chaque nœud manifeste sa présence par un système de Watchdog.

Problème :

Cache mémoire distribué

Données en mémoire pour éviter l'accès à la base de données. Stratégie généralement de type LRU “Dernier utilisé, premier éjecté”.

Les données sont réparties dans le cache de tous les serveurs. Pour trouver dans quel serveur est la donnée, on utilise ((hash de la clé) modulo le nombre de serveur). Si le nombre de serveur est important, toutes les données peuvent être en cache. Si certains serveurs ont plus de mémoire que d'autre, on peut considérer qu'ils comptent comme deux ou plus de serveurs, en fonction de leur mémoire interne.

Si des nœuds disparessent, le modulo va changer puis le système va se recalculer via le LRU.

Séparation des lectures et écritures entre nœuds

Généralement, pour une sécurité très bonne, deux doublons, c'est déjà très bien.

Partitionnement Sharding avec Hachage cohérent

Répartir les données qui vont être accessibles en même temps dans une même partition. Mapping statique ou dynamique entre les partitions et les nœuds. Ici, on parle du stockage persistant des données en opposition avec le cache.

Encore une fois, la correspondance objet-partition par hash cohérent. C'est une nécessité pour éviter qu'en cas de modification du nombre de nœuds (Redundant Array of Inexpensive Servers (RAIS)), le stockage persistant des données change de nœuds. Le principe consiste à recalculer le hash en fonction de la modification.

Inconvénient : jointure possible uniquement sur les données d'une même partition.

Méthode :

Les familles NoSQL

Clé/valeur

Orientées documents

Orientées colonnes

Orientées graphes

MapReduce

Logiciel libre Hadoop en Java.

Implémentation de deux classes :

Et au final Hadoop se débrouille à propager les deux classes aux différents nœuds. Faire migrer les traitements vers les données. Réduit les flux, très grand nombre de serveurs.

Système de fichier HDFS : Hadoop Distributed File System.

Implémentation

CouchDB

MongoDB

Cassandra