4.1 Descriptif

Apache Cassandra est un système de gestion de base de données distribuée qui appartient à la classe des systèmes NoSQL et est conçu pour créer des stockages hautement évolutifs et fiables d'énormes tableaux de données présentés sous la forme d'un hachage.

Initialement, le projet a été développé dans les entrailles de Facebook et en 2009 transféré sous l'aile de l'Apache Software Foundation, cette organisation continue de développer le projet. Des solutions industrielles basées sur Cassandra sont déployées pour fournir des services à des entreprises telles que Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter et Spotify. En 2011, le plus grand cluster de serveurs desservant une seule base de données sous Cassandra comptait plus de 400 machines et contenait plus de 300 To de données.

Écrit en langage Java , il implémente un système de hachage distribué similaire à DynamoDB, qui offre une évolutivité presque linéaire avec un volume de données croissant. Il utilise un modèle de stockage de données basé sur une famille de colonnes, qui diffère des systèmes comme MemcacheDB, qui stockent les données uniquement dans une paire clé-valeur, par la possibilité de stocker des hachages avec plusieurs niveaux d'imbrication.

Appartient à la catégorie des SGBD tolérants aux pannes : les données placées dans la base de données sont automatiquement répliquées sur plusieurs nœuds d'un réseau distribué ou même uniformément réparties dans plusieurs centres de données. Lorsqu'un nœud tombe en panne, ses fonctions sont reprises à la volée par d'autres nœuds, l'ajout de nouveaux nœuds au cluster et la mise à jour de la version de Cassandra se faisant à la volée, sans intervention manuelle supplémentaire ni reconfiguration des autres nœuds.

Cependant, il est fortement recommandé de re-générer des clés (labels) pour chaque nœud, y compris ceux existants, afin de préserver la qualité de l'équilibrage de charge. La génération de clés pour les nœuds existants peut être évitée dans le cas d'une augmentation multiple du nombre de nœuds (2 fois, 3 fois, etc.).

4.2 Modèle de données

Dans la terminologie de Cassandra, une application fonctionne avec un espace de clés, ce qui correspond au concept de schéma de base de données dans le modèle relationnel. Ce keyspace peut contenir plusieurs familles de colonnes, ce qui correspond au concept de table relationnelle.

À leur tour, les familles de colonnes contiennent des colonnes (colonne), qui sont combinées à l'aide de la clé (clé de ligne) dans l'enregistrement (ligne). La colonne se compose de trois parties : nom (nom de la colonne), horodatage (horodatage) et valeur (valeur). Les colonnes d'un enregistrement sont triées. Contrairement à une base de données relationnelle, il n'y a aucune restriction quant au fait que les enregistrements (et en termes de base de données, ce sont des lignes) contiennent des colonnes portant les mêmes noms que dans d'autres enregistrements - non.

Les familles de colonnes peuvent être de plusieurs types, mais dans cet article nous omettrons ce détail. Toujours dans les dernières versions de Cassandra, il est devenu possible d'exécuter des requêtes pour définir et modifier des données (DDL, DML) en utilisant le langage CQL, ainsi que de créer des index secondaires.

La valeur spécifique stockée dans cassandra est identifiée par :

  • keyspace est une liaison à l'application (domaine). Vous permet d'héberger des données de différentes applications sur le même cluster ;
  • une famille de colonnes est une liaison à une requête ;
  • key est une liaison à un nœud de cluster. La clé détermine sur quels nœuds les colonnes enregistrées se retrouveront ;
  • nom de colonne est une liaison à un attribut dans l'enregistrement. Vous permet de stocker plusieurs valeurs dans une seule entrée.

Chaque valeur est associée à un horodatage, un nombre spécifié par l'utilisateur qui est utilisé pour résoudre les conflits lors de l'enregistrement : plus le nombre est élevé, plus la colonne la plus récente est prise en compte et, lorsqu'elle est comparée, écrase les anciennes colonnes.

4.3 Types de données

Par types de données : l'espace de clés et la famille de colonnes sont des chaînes (noms) ; l'horodatage est un nombre 64 bits ; et la clé, le nom de la colonne et la valeur de la colonne sont un tableau d'octets. Cassandra a également le concept de types de données. Ces types peuvent être spécifiés (en option) par le développeur lors de la création d'une famille de colonnes.

Pour les noms de colonnes, cela s'appelle un comparateur, pour les valeurs et les clés, cela s'appelle un validateur. Le premier définit quelles valeurs d'octets sont autorisées pour les noms de colonne et comment les ordonner. La seconde est quelles valeurs d'octets sont valides pour les valeurs de colonne et de clé.

Si ces types de données ne sont pas définis, alors cassandra stocke les valeurs et les compare en tant que chaînes d'octets (BytesType) car, en fait, elles sont stockées en interne.

Les types de données sont :

  • BytesType : toutes les chaînes d'octets (pas de validation)
  • AsciiType : chaîne ASCII
  • Type UTF8 : chaîne UTF-8
  • IntegerType : nombre de taille arbitraire
  • Int32Type : nombre de 4 octets
  • LongType : nombre de 8 octets
  • UUIDType : UUID de type 1 ou 4
  • TimeUUIDType : UUID de type 1
  • DateType : valeur d'horodatage de 8 octets
  • BooleanType : deux valeurs : true = 1 ou false = 0
  • FloatType : nombre à virgule flottante de 4 octets
  • DoubleType : nombre à virgule flottante de 8 octets
  • DecimalType : un nombre avec une taille arbitraire et une virgule flottante
  • CounterColumnType : compteur de 8 octets

Dans cassandra, toutes les opérations d'écriture de données sont toujours des opérations de réécriture, c'est-à-dire que si une colonne avec la même clé et le même nom qui existe déjà arrive dans la famille de colonnes et que l'horodatage est supérieur à celui qui est enregistré, alors la valeur est écrasée . Les valeurs enregistrées ne changent jamais, seules les nouvelles colonnes arrivent avec de nouvelles valeurs.

Écrire à Cassandra est plus rapide que lire. Cela change l'approche adoptée dans la conception. Si nous considérons Cassandra du point de vue de la conception d'un modèle de données, il est alors plus facile d'imaginer une famille de colonnes non pas comme une table, mais comme une vue matérialisée - une structure qui représente les données d'une requête complexe, mais la stocke sur disque.

Au lieu d'essayer de composer des données d'une manière ou d'une autre à l'aide de requêtes, il est préférable d'essayer de stocker tout ce qui pourrait être nécessaire pour cette requête dans la famille cible. C'est-à-dire qu'il faut aborder non pas du côté des relations entre entités ou des relations entre objets, mais du côté des requêtes : quels champs doivent être sélectionnés ; dans quel ordre les enregistrements doivent aller ; quelles données liées aux principales doivent être demandées ensemble - tout cela doit déjà être stocké dans la famille de colonnes.

Le nombre de colonnes dans un enregistrement est théoriquement limité à 2 milliards. Ceci est une brève digression, et plus de détails peuvent être trouvés dans l'article sur les techniques de conception et d'optimisation. Et maintenant, plongeons dans le processus d'enregistrement des données sur Cassandra et de lecture.