Affichage des articles dont le libellé est couchDB. Afficher tous les articles
Affichage des articles dont le libellé est couchDB. Afficher tous les articles

dimanche 31 octobre 2010

Comment créer des vues dans couchdb

Chaque base de données de couchdb propose un répertoire '_design' qui hébergera les vues et les listes liées à votre base.
Les vues sont destinées à restituer les données sans formatage. Les 'shows' et les 'lists' mettent en forme les données. Le 'show' ne s'applique qu'a une entrée à l'inverse de la 'list' qui porte sur un groupe de données.

Concrètement le source des vues est un document JSON. Il faut a chaque fois, récupérer le document source, le modifier et le recharger sur couchdb.



{"_id":"_design/tablefait","_rev":"12-bf5c8cb0de5d7c352af03cb8ea45e8b6",
"language":"javascript",
"views":{
"cam-an-mois":{"map":"function(doc)
{if (doc.TYPE ==\"RAW\") {emit ([doc.campagne,doc.annee,doc.mois], doc); } }"}},
"lists":
{"indexml":"function (head, req)
{ var row;
start({ \"headers\":{\"Content-Type\" : \"application/xml\" }
});
send(\"<entries>\");
while(row = getRow())
{
var xml= new XML (\"<entry/>\");
xml.campagne=row.value.campagne; xml.annee=row.value.annee;
xml.mois=row.value.mois; send(xml);
}
send(\"</entries>\");
}"
}
}



Ici 'tablefait' est le nom du groupe de restitution, 'cam-an-mois' est le nom de la vue qui va servir à restituer les entrées suivant des clés d'index. Enfin 'indexml' est la fonction javascript à appliquer pour formater les résultats.





Utilisation d'une vue sans formatage particulier :
Par un navigateur : http.... 5984/db/_design/tablefait/_view/cam-an-mois?[2010,2010,09]


Avec le formatage XML

Par un navigateur : http.... 5984/db/_design/tablefait/_list/indexml/cam-an-mois?[2010,2010,09]


Attention la construction de l'url est fonction de la version de couchDB.


Les difficultés d'écriture d'une fonction de formatage sont les suivantes:

  • Le javascript de la fonction de formatage sera stocké dans une chaine de caractère. Les quotes sont à protéger par des '\'.
  • A chaque mise au point, le numéro de révision sera à ajuster.

Pour gérer ces problèmes plusieurs solutions sont possibles et seront présentées prochainement.

samedi 30 octobre 2010

Pour aller plus loin avec couchdb: la compilation

J'avais fait quelques ( posts sur le sujet) . Très vite, la manipulation de couchdb nécessite des bouts de javascript et du JSON. Je veux par exemple produire des données sous forme XML, ou proposer des vues avec des mises en page. Pour cela il faudra modifier les listes ou les vues dans couchdb.

La première précaution à prendre est de travailler avec la dernière version de couchdB. La gestion des listes et des vues a évolué d'une version à l'autre.
Pour installer une version récente de couchdb , il faudra probablement mettre à jour votre version de Erlang.


Le lancement de la commande ./configure dans l'archive de couchdb doit produire les erreurs suivantes:
La compilation de couchdb va chercher à résoudre les dépendances dont celle ci :
Is the Mozilla SpiderMonkey library installed?

spidermonkey est le moteur javascript de Firefox. Son installation complète se teste par la commande 'js' (librairie et l'interpréteur) .
Son installation se fait par:
apt-get install libmozjs-dev
Puis vient le tour de la librairie 'international character'
apt-get install libicu-dev

Enfin l'utilitaire 'curl' : c'est avec lui que se fait les premiers essais avec couchdb

apt-get install libcurl4-openssl-dev

Tout ca pour arriver au message :
configure: error: The installed Erlang version is less than 5.6.5 (R12B05).

Vous allez devoir vous payer une petite compilation du langage Erlang.

Rien de bien compliqué , juste un configure , make , make install dans le repertoire otp_src_Rnn

Puis revenir à la compilation de couchdb en précisant :
./configure --with-erlang=/usr/local/bin

Ok tout est bon le make et make install terminent l'opération. Le répertoire /usr/local/bin doit contenir au minimum erl et couchdb.





jeudi 23 juillet 2009

Prise en main de couchDB

L'installation de couchDB ne pose de problème avec les gestionnaires de paquets. Le système installe le programme erlang/OTP qui comporte un shell erlang. C'est dans ce langage que seront traité les requetes HTTP et traduite les fonctions javascript.

Sur une Debian, l'installation lance les programmes suivants:

2575 ? S 0:00 /bin/sh -e /usr/bin/couchdb -c /etc/couchdb/couch.ini -b -r 5 -p /var/run/couchdb.pid -o /dev/null -e /dev/null -R
2576 ? Sl 0:01 /usr/lib/erlang/erts-5.6.3/bin/beam -Bd -- -root /usr/lib/erlang
-progname erl (),.........
receive done -> done end. -couchini /etc/couchdb/couch.ini -pidfile /var/run/couchdb.pid -heart



Un script qui gèrera le daemon (usr/bin/couchdb) et le shell erlang (beam) .

Configuration


Le fichier de configuration couch.ini se trouve sous le répertoire /etc/couchdb

Il ressemble à ceci : (j'ai ajouté des commentaires en fin de ligne)


[Couch]

ConsoleStartupMsg=Apache CouchDB is starting. #message d'accueil

DbRootDir=/var/lib/couchdb # repertoire des fichiers BTREE

Port=5984 # port d'ecoute

BindAddress=127.0.0.1 # adresse de l'interface reseau

DocumentRoot=/usr/share/couchdb/www # repertoire de stockage des pages web d'administration

LogFile=/var/log/couchdb/couch.log # les logs

UtilDriverDir=/usr/lib/couchdb/erlang/lib/couch-0.8.0-incubating/priv/lib

LogLevel=info #log level (info ,debug)

[Couch Query Servers]

javascript=/usr/bin/couchjs /usr/share/couchdb/server/main.js

(remarque : couchDB est un projet Apache mais n'utilise pas de serveur Apache.)

L'interface d'administration: FUTON

Elle s'affiche à l'adresse suivante : http://127.0.0.1:5984/_utils



Cette interface permet de tout faire : création d'une entrée, réplication , statistiques.

Créer deux instances de couchDB.

Pour réaliser des essais de réplication , il est parfois necessaire de creer deux instances sur la même machine. Il faudra définir deux ports d'ecoute , avoir deux répertoire de données etc.

Commencons par duppliquer le fichier couch.ini en couch2.ini
Puis il faut éditer couch2.ini et modifer ces lignes :

portable:~# diff /etc/couchdb/couch.ini /etc/couchdb/couch2.ini
5c5
< consolestartupmsg="Apache"> ConsoleStartupMsg=Apache CouchDB instance 2 is starting.
7c7
< dbrootdir="/var/lib/couchdb"> DbRootDir=/var/lib/couchdb2
9c9
< port="5984"> Port=5985
13c13
< documentroot="/usr/share/couchdb/www"> DocumentRoot=/usr/share/couchdb2/www
15c15
< logfile="/var/log/couchdb/couch.log"> LogFile=/var/log/couchdb/couch2.log

Il faut créer avec les bons droits les répertoires pour la deuxième instance. Et copier les fichiers existants de la première instance vers les répertoires de la deuxième instance. Le répertoire DbRootDir des fichiers BTREE peut etre vide. Il sera mis à jour par le mécanisme de la réplication.

Afin on lancera les deux services par en prenant soin d'arrêter préalablement le service couchDB (/etc/init.d/couchdb stop )

couchdb -c /etc/couchdb/couch.ini &
couchdb -c /etc/couchdb/couch2.ini &

Voila , on est prêt pour essayer la réplication.

mercredi 15 juillet 2009

CouchDB : plus qu'un composant phrare du web 2.0: un révolution

CouchDB se présente comme une base de données documentaire. Cette phrase est réductrice par rapport aux concepts mis en pratique par couchDB. C'est en effet un concentré de technologies et de bonnes idées.
Je vais détailler 5 idées de base et aborder des concepts généraux..

CouchDB est une base de données orientée document. Elle stocke des documents et leurs pièces jointes comme les images par exemple.
CouchDB est capable d'exécuter des procédures stockées, ecrites en javascript.
Enfin coucheDB est ecrit en Erlang afin d'optimiser les performances. Il possède une interface de communication HTTP de type REST qui délivre ses réponses en JSON.



Principes

1) Les bases de données relationnelles ne sont pas toujours adaptées à notre 'vrai' univers.
Exemple : comment stocker des cartes de visites dans une BDDR ? : il faut créer une table pour les noms , prénoms , une autre table pour les téléphones une autre pour les mails. Une base de données relationnelle doit au moins respecter les trois formes normales (voir les rappels ici) . On se retroucve parfois avec des tables avec des champs vides.

2) On utilise de plus en plus souvent comme index un champ numérique autoincrémenté.
Cette solution permet d'avoir un identifiant technique non significatif. Mais cela rend très difficile le partitionnement des données. En fusionnant plusieurs sources de même nature, il va y avoir forcement des doublons dans les identifiants.

3) Les techniques d'historisation dans une BDDR coûtent chères et sont complexes. Pourtant, il existe une solution simple dans le monde du développement : le versionning (Subversion , GIT)

4) Les applications qui ont besoin de performance doivent êtres simples : Architecture REST, pas de verrous bloquants.
Avec REST , le client et non pas le serveur est chargé de conserver l'état des transaction. Cette opération est très limitée car les transactions sont atomiques et auto-suffisantes.
Un document qui est en cours de modification ne doit pas empêcher les services de délivrer sa version la plus récente à d'autres clients.

5) Il doit être possible de réaliser des opérations de masse sur les éléments stockés dans la base : c'est l'utilisation du Map and Reduce comme procédures stockées par le serveur.

Concepts généraux : le diagramme de CAP.

Ainsi couchDB se veut comme un système de base de données 'documentaires' évolutif et performant.

Le positionnement de couchDB peut se faire par rapport au diagramme de 'CAP'
C = Consistance des données , A = disponibilité des données (availability) et P = tolérance au Partitionnement des données. Chaque notion est un cercle, chaque cercle possède 2 points d'intersection avec les autres cercles (comme une rosace)



A l'intersection du cercle de la disponibilité et de la consistance des données on trouvera un protocole comme 'paxos' qui est utilisé dans le projet Chubby de Google : Les données sont disponibles et consistantes mais centralisées.

Les BDDR se placeront à l'intersection du cercle 'consistance' et 'partitionnement' : les données sont intègres , partageables sur des nœuds de cluster mais la disponibilité reste un problème. Exemple : il est facile de faire une base de données 'maitre' et des replicats, mais l'opération d'écriture ne pourra se faire que sur l'instance Maitre.

CouchDB se place à l'intersection de consistance et de disponibilité. Les données d'une base ne peuvent pas être nativement partitionnées sur plusieurs serveurs. Cette dernière contraintes est mineure par rapport aux deux autres facteurs. Cela ne vaut pas dire qu'il n'y ait pas un système de réplique, bien au contraire , couchDB est multi-maitre.

Les versions de document.

CouchDB utilise le MVCC (multi Version concurrency control) : gestion des versions multiples concurrentes. Cela veut dire qu'il n'utilise pas de verrou. Le client peut toujours obtenir la version la plus récente de l'entrée. Dès que le changement sera 'propagé' , c'est cette version qui sera disponible. Un client désirant envoyer une modification doit toujours indiquer sur quelle version il travaille.

L'identifiant des documents

CouchDB utilise des Universally Unique Identifiers (UUID) qui sont déterminés soit par le client soit par le serveur.

Un exemple d'entrée:

{
_id:”234567BCD4621D373CADE4E832627B345”,
_rev: 413123,
“Corps”: “ceci est le texte du document“,
"date" :"unbe_date"
}

Exemples de manipulations

curl http://localhost:5984/_all_dbs

Curl est un client HTTP en ligne de commande

La réponse du serveur :
["essaidb"]
La réponse est en JSON.

Interrogation de tous les documents :

curl http://localhost:5984/essaidb/_all_docs
{"total_rows":5,"offset":0,"rows":[
{"id":"7a1f52b2a0a7c74de7cba2f35b314ce9","key":"7a1f52b2a0a7c74de7cba2f35b314ce9","value": {"rev":"425879379"}},
{"id":"cbc79bccbc338e05abfb2932cf67a888","key":"cbc79bccbc338e05abfb2932cf67a888","value": {"rev":"707723218"}},
{"id":"encoreunessai","key":"encoreunessai","value":{"rev":"517881535"}},
{"id":"essaieric","key":"essaieric","value":{"rev":"12590446"}},
{"id":"essaisuite","key":"essaisuite","value":{"rev":"3012959012"}}

Mais aussi

CouchDB permet de redéfinir le mode de sortie, en remplaçant le JSON par du HTML. De même, il permet de programmer ses propres vues. Ainsi ,il est possible de réaliser des véritables apllications sans rien d'autre que couchDB