mardi 27 avril 2010

Cassandra - 5) Votre première base de données

Il est temps maintenant de créer sa première base de données soi même.
Que les choses soient claires de suite : la méthode que je vais expliquer est strictement personnel et n'engage que ma compréhension de Cassandra. Etant donné la nouveauté de Cassandra, il n'existe pas pour l'instant de "Best Practice" (meilleurs pratiques) dans l'organisation des données avec une base de données orientée ligne.

Comme nous l'avions vu avant, nous allons créer un "mini-Facebook" très basique.

1) Les démarches

Il faut commencer par réfléchir, longtemps si possible et se poser les questions suivantes :
_Quelles données dois-je enregistrer ?
_Quelles données devrai-je sortir souvent ? (et oui il n'y a pas vraiment de requêtes structurées comme dans SQL, ne l'oubliez pas !)
_Quelles sont les relations entre mes données ?

Si vous avez fait de l'UML, cela pourra vous être très utile pour formaliser ces simples questions. La solution par contre n'est pas aussi simple que l'ont pourrait le croire

2) Les résultats avec notre mini-Facebook

On a passé quelque temps à réfléchir sur les questions évoquées plus hauts et on s'est dit les choses suivantes :

On a besoin de gérer des gens (c'est très souvent le cas dans les bases de données), qui peuvent être reliés par des relations amicales.
Ces gens peuvent partager des photos et dire des trucs sur les "Walls" des autres.

On arrive donc avec les classes (cf UMLs) suivantes :
  • Personne
  • Wall
  • Relations Amicales
  • Photos
On a aussi les relations suivantes :
1 Personne = 1 Wall
1 Personne = (X Albums <=N Photos) (X albums et N photos dans les albums)
1 Personne = N Relations amicales

Cette approche n'est pas spécifique à Cassandra et peut être appliqué à peu près tout le temps quand vous souhaitez designer une base de données.

3) Penser ColumnFamily

Maintenant vient la partie entièrement axée sur Cassandra.
Dans la partie 2) Nous avons vu comment à partir d'un problème, en déduire des relations, maintenant il est temps de traduire ses relations par des structures de données.
Voici ce que je propose (Il faut insérer ce code dans storage-conf.xml à la suite de la balise fermante de Keyspace1 si vous ne l'avez pas supprimé) :
Ps : Blogger apparemment n'apprécie pas les balises XML, donc tant que j'ai pas trouvé de moyen pour qu'il ne fasse pas la substition, cliquez sur l'image ci dessous. Désolé pour la gène éventuelle.)





4) Explications :

Nous avons donc défini 4 ColumnFamilys qui transcrivent les relations que nous avons données dans le 2.
La première "Utilisateurs" contient les informations sur un utilisateur (nom, âge, identifiant, mot de passe). L'identifiant CompareWith="UTF8Type" signifique que les Column seront ordonnées par comparaison de leur nom. albert viendra avant bertrand qui viendra avant conrad.
La deuxième "Photos" est de type Super. Ceci permettra donc de définir dans les noms de SuperColumn les intitulés d'albums et dans les Columns, les photos en elles-même. Le CompareWith est TimeUUIDType qui est un identifiant basé sur un timestamp (en milliseconde), cf wikipedia + un nombre aléatoire. Ce TimeUUID assure une unicité du nom de la colonne.
La troisième "Wall" contient le wall d'une personne. Le compare With TimeUUID nous permet d'avoir les messages sur le Wall ordonnés temporellement.
Enfin "Relation" qui traduit pour une personne l'ensemble des gens qu'elle connait.

C'est est fini pour cette entrée de blog.
Comme d'habitude, n'hésitez pas à me corriger ou à poster vos commentaires.

dimanche 25 avril 2010

Cassandra - 4) Configuration

Il est maintenant temps d'entrer dans les entrailles de la machine.
Ce qui va suivre est valable pour Cassandra 0.6.1 qui est sorti dernièrement.
Vous pouvez vous procurer la dernière version à l'adresse suivante : http://cassandra.apache.org/

L'installation de Cassandra dépendra de votre distribution. Je ne sais pas si Cassandra marche avec openjdk & openjre (je parle en particulier pour les gens sous debian). Une autre chose qui sera sûrement utile de faire sera la modification des options par défaut de lancement de cassandra (en particulier pour la heap size).

Essayons de faire une installation pas à pas

1) Installation

Prérequis :
Linux, jre, jdk (pour le développement futur), Cassandra 0.6.0

Commencez par décompresser Cassandra 0.6.0 dans le dossier qui vous plaira.(Par défaut je l'avais fait dans : /home/victork/apache0.6/
Essayez de le lancer en vous positionnant dans le répertoire où vous avez décompressé apache et faites : bin/casssandra -f
SI tout marche bien passez à l'étape 2

SI vous avez des problèmes, il y a plusieurs solutions (cela n'a rien d'exhaustif) :
_Si vous êtes sous Ubuntu, voici un guide d'installation en anglais :
http://dustyreagan.com/installing-cassandra-on-ubuntu-linux/
_Si vous êtes sur debian, essayez d'installer jre et jdk par sun.
_Modifier le script de lancement pour changer la heap size.
_ Si rien ne fonctionne, les moteurs de recherche sont plutôt pratiques...

2) Première configuration

Il faut procéder à la configuration de votre base de données. Nous procéderons dans un premier temps par une configuration rapide avec les options basiques.
Dans un premier temps vous pouvez ne pas être intéressé par cette partie, en particulier si vous souhaitez directement tester. Dans ce cas passer directement à l'étape 3

Ouvrez avec un editeur de texte quelconque le fichier dans le repertoire de Cassandra : ./conf/storage-conf.xml
C'est ce fichier qui contient la description de vos/votre base de données.
Comme vous pouvez le constater ce n'est qu'un fichier XML au format classique. Ce qui va nous intéresser pour l'instant est ce qui est contenu dans ./conf/storage/storage-conf.xml
On peut remarquez les balises < ClusterName >  qui indiquent à Cassandra le nom du cluster que vous êtes en train de lancer. C'est important de mettre un nom car seuls les machins équipés d'un même cluster name sont susceptible de rejoindre le Cluster.

Cherchez ensuite la balise < Keyspaces > , c'est à cet endroit que commence la description de vos données.
Normalement, si vous n'avez touché à rien, il existe déjà :  < Keyspace Name="Keyspace1" >. Il y est par défaut. Vous pouvez le supprimer mais dans un premier temps je ne vous le conseille pas. Nous allons l'utiliser plus tard.
Plus tard sont définis les ColumnFamily avec leur type suivant si elles vont contenir des Column ou des SuperColumn (ColumnType="Super"). D'autres options sont également mises, mais passons pour cette première approche. Autre fait intéressant : l'élément "CompareWith=" qui dit comment Cassandra va gérer l'organisation des Columns à l'intérieur d'une clef. Pour les SuperColumn on a même :  "CompareSubcolumnsWith=" qui régit l'organisation des Column à l'intérieur d'une SuperColumn.

3) Premiers tests

Il est maintenant temps de tester si Cassandra fonctionne bien.
Dans un terminal, placer vous dans le répertoire Cassandra et tapez
bin/cassandra -f
Cela aura pour conséquence de lancer le serveur
Dans un autre terminal, toujours dans le répertoire Cassandra tapez :
bin/cassandra-cli --host locahhost --port 9160
Vous allez vous connecter à votre serveur lancé.

dans votre terminal vous devriez avoir :

Connected to: "Nom de votre Cluster" on localhost/9160
Welcome to cassandra CLI.

Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
cassandra> 




Si tout s'affiche correctement, c'est que tout s'est bien passé.
Vous pouvez taper ? pour voir quelques exemples d'actions à faire comme :

describe keyspace Keyspace1

Qui vous donnera une description de l'ensemble des ColumnFamily contenues dans votre Keyspace.

Vous avez maintenant un serveur Cassandra prêt à fonctionner !

jeudi 22 avril 2010

Cassandra - 3) Organisation des données

Une chose qui est probablement nouvelle pour les gens habitués à travailler sous SQL et dans les bases de données orientées colonnes est l'organisation des données dans Cassandra. Elle est hiérarchisé selon un principe assez simple.
On peut identifier 6 niveaux dont 1 qui n'existe pas forcément (SuperColumn) :
  • Cluster
  • Keyspace
  • ColumnFamily
  • Key
  • SuperColumn ( facultatif )
  • Column
Voyons ce que représente chacun de ses niveaux :


Cluster :

C'est le plus "gros" élément d'une base de donnée cassandra. Le node est défini au niveau d'un groupe de serveur et pas seulement au niveau d'un site.

Keyspace :
Espace où réside les données. Il faut penser cette structure comme l'ensemble des données que gère un site donné.

ColumnFamily :
Ensemble de clés. Il faut penser ça comme une "unité logique" où des informations d'un même genre ou sur un même sujet sont classés. Par exemple dans un réseau social ce sera Users ou Pictures.

Key :


L'unité de base, identifiant d'un ensemble de Columns ou SuperColumns suivant ce que vous avez décidé pour le type de votre ColumnFamily. Elle correspond à une entrée particulière.

SuperColumn :

Structure de données qui est un ajout de Facebook (et oui, ils ne font pas que voler les informations de tout le monde; parfois ils aident !). Les SuperColumn sont des Columns où chaque value est un ensemble de Column(s). Ceci sera expliqué plus bas.

Column :

Là où résident véritablement les données. Un(e) "Column" est identifié par son nom et une valeur.
Sous Cassandra les données sont enregistrées en byte[], donc vous devez faire la conversion pour retomber sur des strings ou autre types de données.


Un exemple pour illustrer tout cela : 

On n'apprend jamais mieux que par l'exemple. L'exemple de base est Twitter en général, mais moi, étant contrariant, je vais prendre Facebook.
Ce que je vais proposer est une solution pour organiser ses données sur Facebook, ce n'est évidemment pas la leur, cependant cela vous aidera à comprendre une organisation réelle dans Cassandra :

Cluster : FacebookSuperServers{
  KeySpace : FacebookInformations{
    ColumnFamily : Users{
      Key : victorkabdebon{
        SuperColumn : General Informations {
          Column : Name {
            value : Kabdebon
         }
         Column : Prenom {
           value : Victor
         }
        }
        SuperColumn : Amis{
          Column : Ami1{
             value : Hector
           }
       }
     }
    }
  }
}







Un peu de Twitter quand même :


Ce lien vous conduira vers la structure d'un Tweet.



FIN


J'espère vous avoir intéressé encore une fois.
Si vous avez des commentaires, questions ou corrections n'hésitez pas à m'envoyer un mail ou poster un commentaire. Merci !

mercredi 21 avril 2010

Cassandra - 2) Les clefs d'un succès

J'ai tenté de vous présenter un peu de façon générale ce qu'est Apache Cassandra et j'ai avancé beaucoup d'avantages sans toutefois les expliquer. Dans ce billet je vais essayer d'étayer mes propos sur les points intéressants de Cassandra.

  1. A propos de la vitesse
C'est peut être le point primordial d'une base de données. Lors de la primo-conception de BigTable les ingénieurs de Google ont cherché un moyen de savoir rapidement si un élément faisait parti d'un ensemble de données.
En réalité la réponse à cette question avait été donné en 1970 par le mathématicien Burton Howard Bloom, par le biais des "Blooms filters".

Ces blooms filters donnent un moyen simple de savoir si un élément appartient à un élément, il est à noter que les faux positifs (i.e. : un élément apparait comme étant dans l'ensemble, mais en fait n'y est pas) est possible, tandis qu'un faux négatif (i.e. : un élément apparemment, mais en réalité y est) est impossible. En résumé : Vous êtes sûr de ne jamais rater un élément en cherchant via un bloom filters.
Ceci a un avantage immédiat : Imaginons que vous avez une base de donnée de 1 To que vous avez découpé en morceaux de 100 Mo, chacun de ses morceaux ayant un blooms filters pour détecter un élément. Vous effectuez votre recherche parmis cette immense base de données, vous trouvez 4 réponses positives, vous n'avez qu'à chercher dans 4 * 100 Mo si l'élement intéressant y est. Vous êtes certains que dans les (1To - 400Mo) votre résultat n'y est pas. J'espère que vous pressentez l'efficacité de cette méthode.

2. Sécurité

Si on demande à un entrepreneur quel est l'élément qui a le plus de valeur à ces yeux dans son entreprise, il répondra sûrement bien des choses, mais il oubliera probablement de dire que ce sont les bases de données. Celles-ci constituent la véritable richesse d'une entreprise ou d'un site web. On ne peut pas imaginer trente secondes Facebook qui perd la totalité de ses données. Ca en serait fini de cette entreprise.
Cassandra propose une approche de base de données distribuées. Les données sont présentes plusieurs fois et en cas de défaut d'un des serveurs d'un Node, les données pourront quand même être acheminées.
Ce phénomène est même obervable sur Google lors de la recherche de résultat. Tapez une requee dans Google image (par exemple : chien), observez les 30 premiers résultats. Refaites la même recherche quelques heures après, vous aurez un nombre de résultat différents et les premiers résultats seront probablement légèrement différents. Cela vient du fait que certains serveurs n'ont pas répondu à temps !

3. Quelques désavantages

Nous avons passé en revue les avantages de Cassandra, mais il ne faut pas oublier ses défauts.
_Planifier : On ne peut décemment pas partir à l'aventure sur Cassandra en se disant "bon je ferais évoluer les choses". Il faut penser avant de commencer un projet sur Cassandra.
_Il n'existe pas de requêtes structurées comme en SQL et si vous avez déjà utilisé MySQL ne vous attendez pas à trouver de SELECT AGE WHERE ... J'en reviens à ce qui est dit plus haut, il faut réfléchir avant de faire ses bases de données. Mais je suis certain que vous pouvez tous y arriver.

FIN
N'hésitez pas à me poser des questions ou à apporter des corrections au besoin.

mardi 20 avril 2010

Cassandra - 1) Présentation




Qu'est ce que Cassandra, pourquoi choisir ce type de données ?
Les deux questions sont légitimes, je vais tenter d'y répondre dans la suite.

Tout d'abord Cassandra est une base de données, "membre" du mouvement NoSQL né en réaction à l'emprise de SQL sur le monde du web. Tout le monde (ou presque) ayant participé au développement sur le web est passé devant la mention MySQL qui n'est pas une base de données à proprement parlé, mais un sytème de management de base de données SQL. SQL et MySQL ont bien des avantages : ils sont simples, très largement répandus, bien documentés, facile à l'installation mais dès qu'on commence à gérer des bases de données trop grosses, le système voit ses performances se dégrader.

Google, qui a de multiples datacenters à travers le globe et des exabytes de données l'a bien compris et ils ont conçu un système "BigTable" permettant de résoudre ce problème.
Ils se sont vite rendu compte qu'une base de données orientée colonne ("column oriented") est plus souple que le système SQL orienté lignes (row oriented).

Une implémentation OpenSource de ce principe a bientôt vu le jour, plusieurs en fait, mais étant donné que je ne les connais pas, je n'en dirai rien. Le projet Cassandra avait vu le jour. Bientôt il fut placé dans l'incubateur d'Apache Software Foundation ce qui donna un coup d'envol au projet.


Maintenant que nous avons un peu vu ce que c'est, pourquoi y venir ?
On peut évoquer plusieurs raisons :
  • Cassandra est rapide, TRES rapide. Voici une petite enquête qu'avait réalisé yahoo en se basant sur Cassandra 0.5. Il est à noter qu'Apache a annoncé avoir augmenté de 30% la vitesse globale entre la version 0.5.1 et 0.6.
  • Cassandra est évolutif et à plusieurs niveaux : Il permet d'avoir plusieurs serveurs et la redondance des données : parfait si on ne souhaite ne pas perdre de données. De plus le fait que ce soit une "column oriented" database lui permet d'évoluer dynamiquement, bien mieux que SQL.
  • C'est open source et gratuit.
  • Et enfin, c'est probablement l'AVENIR. Les plus gros sites y sont passés : Digg, Reddit, Facebook, Twitter. Ne laissez pas le train partir sans vous !


Ca en est fini pour ce premier billet, n'hésitez pas à me poser des questions ou à apporter des corrections au besoin.

A propos de ce blog

Bonjour à tous !

Dans ce blog je vous parlerai des technologies que j'utilise lors de mon développement de technologies web.
Donc si vous souhaitez débattre, apprendre, ou même créer, n'hésitez pas à venir et à participer sur ce blog.

Cordialement,
Victor Kabdebon