lindev : administration linux , développement php

Aller au contenu | Aller au menu | Aller à la recherche

01 fév. 2010

couchDB par la pratique

C'est quoi couchDB

couchDB.png

CouchDB est un serveur de base de données orienté Document et accessible via une API REST HTTP/JSON.
Sans schéma, sans tables, ce qui offre une flexibilité sans limite de vos documents.

Comment , simplement car couchDB est une base qui n'est pas relationnel , il n'y a donc pas de structure qui fige les documents .

Comment l'utiliser

CouchDB utilise le protocole HTTP , avec des entêtes en GET , PUT , POST , DELETE , COPY.

Avec une possibilité d'activer l'authentification HTTP pour restreindre les accès selon vos souhaits
Pour vous simplifier la vie , j'ai développé une librairie qui réuni les méthodes indispensables pour utiliser une base couchDB , cette librairie vous permettra les action suivantes :

 * Création / suppression de bases
 * insertions de documents
 * suppressions .. 
 * copie
 * déplacements
 * réplication 
 * lecture
 * etc ..


Pour la documentation complète , voir le wiki .

oscar_couchDB

Nous allons quand même ici expliquer l'utilisation basic d'une base couchDB avec cette librairie

initialisation

Comme le précise la doc , il nous suffit d'inclure simplement la lib :

require_once 'Oscar_couchDB.php';

Nous allons ensuite récupérer une instance de la classe :

$Ocdb   =   Oscar_couchDB::getInstance();

Commençons par configurer l'accès au serveur principal , qui a comme adresse ip 10.0.0.220:

$Ocdb->set_host('10.0.0.220');
$Ocdb->set_port(5999);

Nous voilà fin prêt à attaquer ....

Commençons par créer notre table

if( ! $Ocdb->add("mabase") ){
   echo "Échec à la création de la base de données";
}

Une fois notre base crée , nous allons pouvoir la remplir avec des documents , pour créer un document , il faut de nouveau faire appel à la méthode add().

$doc = array("NOM"=>"Document A","TYPE"=>"texte");
 
$retour = $Ocdb->add("mabase","0001",$doc);
if(  $retour == false ){
    echo "Erreur à la création du document , erreur : $retour";
}else{
    echo "Document crée avec succès , <br>ID: ".$retour['id']."<br>REVISION: ".$retour['rev'].";
}

Comme vous l'aurez remarqué un document possède à sa création une révision , cela permet par exemple lors d'une modification non volontaire , de revenir en arrière .
Cependant , cela reste limité en temps , car si l'on compacte la base , seule la dernière révision est disponible .

Pour connaitre les révisions d'un document , vous pouvez faire appel à cette méthode :

$Ocdb->all_revs("mabase", "0001");

0001 étant l'id du document qui se doit d'être unique .

Et pour compacter la base pour un gain de place :

$Ocdb->compact_database('mabase');

Maintenant , comment récupérer notre enregistrement ?
Nous allons simplement utiliser la méthode get()

$mondocument = $Ocdb->get("mabase","0001");

Vous voilà avec un tableau $mondocument qui contient toutes les données que vous y avez entrées ainsi que son id et sa révision .

Pour lire une révision spécifique , il est possible de préciser celle-ci comme-ceci :

$mondocument = $Ocdb->get("mabase","0001",$revision);

Dans l'ordre des choses , nous allons supprimer ce document , voici la méthode :

$database = 'mabase';
$iddocument = '0001';
$revdoc = '1-872c3e4693b3e608148fb85b3f64df74';

$Ocdb->delete($database, $iddocument, $revdoc);

Ici la révision du document est obligatoire .



Voilà pour ces quelques exemples , il y a encore de nombreuses autres méthodes aussi simples les unes que les autres à utiliser , je vous laisse les découvrir via la documentation ici

replication

Il y a un point important , car c'est un avantage non négligeable de couchDB , la replication , qui est d'une simplicité étonnante .

Dans la librairie , il y a donc une méthode qui vous permet de répliquer vos données , de façon manuelle , mais aussi automatique , voici sa mise en place .

Commençons par paramétrer les coordonées des serveur A et B

$Ocdb->set_replication('10.0.0.220','10.0.0.221','5984','mabase','mabase_Repli');

Nous avons donc ici spécifié l'adresse du serveur source , suivi de celle du serveur cible , le port du serveur cible , la base de données source , et pour finir la base de données cible , qui n'est pas obligatoirement du même nom.

De plus si les base source/cible n'héxiste(s) pas , la librairie tentera de la/les créer .
Le réplication paramétrée , activons l'automatisme pour être certains que chaque action faite sur le serveur source soit immédiatement faite sur le serveur cible.

$Ocdb->auto_replique(TRUE);

Et voilà , plutôt simple non ?

Si le serveur cible n'est pas disponible , ce n'est pas grave , la réplication se faisant sur les logs binaire , il rattrapera automatiquement son retard lorsqu'il sera de nouveau disponible .
De plus , si le serveur source , tombe , vous pouvez attaquer directement sa réplication , en changeant les paramètres via set_replication , et lorsque le serveur sera de nouveau disponible , il se mettra automatiquement à jour , toujours grâce au logs binaires .

utile

Nous avons vue ici l'utilisation de quelques méthodes de la librairie Oscar_couchDB , mais il faut savoir que vous pouvez creer des vues en javascript qui vous permettent de faire des requêtes , filtres ect sur les documents en base , je vous donne un lien complet pour apprivoiser celà .
unixGarden

La librairie est disponible à plusieurs endroits :

 *  phpClasses
 *  dans les libs de mon fw fw-oscar.fr

11 déc. 2009

Réplication mysql

MIse en place

Refresh.png Après avoir écrit cet article je me suis aperçu que le procédé ne fonctionne pas parfaitement .... notamment si des données existent déjà sur le serveur maître .

Je vous présente donc ma façon de faire , afin de mettre en place une réplication avec un serveur déjà en production .

Note : Pas de différence entre le moteur des tables MyIsam , InnoDb .

Utilisateur de replication

Je vais créer sur le maître un utilisateur , qui aura les droits pour effectuer sa réplication .

mysql -uroot -p*******
CREATE USER 'slave_user'@'%' IDENTIFIED BY  'motdepasse';
GRANT REPLICATION SLAVE ON *.* TO slave_user@'%' IDENTIFIED BY 'motdepasse';
FLUSH PRIVILEGES;

Faits attention à ce qu'il n'y ai pas plusieurs utilisateurs du même nom .

Fichiers de conf

Il nous faut faire quelques modifications dans les fichiers de conf des serveurs maître est esclave ... pas de panique , quivez le guide .

Maître

vim /etc/mysql/my.cnf

Dans la section mysqld Il faut juste vérifier à ce que les paramètres suivants soient dé-commentés.

server-id = 1
log_bin   = /var/log/mysql/mysql-bin.log

Server-id se doit d'être unique , sur l'esclave , nous mettrons donc 2
Par contre , commentez le paramètre suivant:

#bind-adress = 127.0.0.1 

Sans quoi les connexions extérieures n'aboutirons pas .

Esclave

vim /etc/mysql/my.cnf

Dans la section mysqld Il faut juste vérifier à ce que les paramètres suivants soient dé-commentés et configurés.

server-id = 2
master-host=ipservmaitre
master-user=slave_user
master-password=******
master-port=3306


Par contre , commentez le paramètre suivant:

#bind-adress = 127.0.0.1 

Sans quoi les connexions extérieures n'aboutirons pas .




Ensuite , Commençons par couper les services qui écrivent sur les bases

Sur le maître et l'esclave :

Dans mon cas , je n'ai eu qu'à couper apache et cron

/etc/init.d/apache2 stop
/etc/init.d/cron stop

Sur le maître

Le principe est le suivant :

  1. RESET des logs binaires
  2. Visualisation de la position
  3. Dump
  4. Envoie du dump ver l'esclave

1 RESET des logs 2:Position

Connectons nous à mysql:

mysql -uroot -p*******
RESET MASTER;
SHOW MASTER STATUS;
exit

Ce qui doit donner :

showmaster.png

Il vous faut noter précieusement le nom du fichier binaire , et la position ici par exemple :

  • mysql-bin.000001
  • 13860

3 Dump des bases du maître

Dans mon cas , je vais repliquer l'ensemble des bases de mon serveur maître, j'utilise donc la commande suivante :

mysqldump -uroot -p******* --databases databaseA databaseB databaseC >/root/dump.sql

Note: je n'ai pas utilisé --all-databases , pour la simple raison , que cela produit un conflit avec la base information_schema et mysql , j'ai donc sélectionné toutes mes bases .

4: Envoie du dump vers le serveur esclave

Bon , juste pour rappel hein ...

scp /root/dump.sql adminservEsclave@ipservesclave:/home/adminservEsclave/dump.sql

Voilà laissons le maître de coté , passons à l'esclave ..

L'esclave:

Voilà le programme ...

  1. On vide entièrement mysql pour être sur du neuf
  2. Importation du dump
  3. Arrêt SQL_SLAVE
  4. RESET SQL SLAVE
  5. Définition du master
  6. Redémarrage du master
  7. Tests

1 nettoyage:

une simple requête :

DROP DATABASES databaseA;
DROP DATABASES databaseB;
DROP DATABASES databaseC;

2 Importation

L'importation aussi simple que l'export :

mysql -uroot -p******* < dump.sql

L'informatique compliqué ... quenéni !!!

3 Reconfiguration SLAVE

Nous voilà à l'étape de configuration de l'esclave .. commençons par le couper

mysql -uroot -p*******
STOP SLAVE;
RESET SLAVE;

Puis définissons le master (toujours dans la console mysql)

CHANGE MASTER TO MASTER _HOST='ip du maitre',
MASTER_USER='slave_user',
MASTER_PASSWORD='pwdslaveuser',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=13860;

SLAVE START;

Voyez l'utilisation du nom du fichier de logs binaires , et la position noté auparavant .
J'ai eu des soucis pour le bon démarrage de l'esclave , je suis obligé de le redémarrer complètement

STOP SLAVE;
RESET SLAVE;
START SLAVE;

4 : passons aux tests

Il faut nous assurer que l'esclave soit bien démarré , pour cela utilisez la commande sql suivant :

SHOW SLAVE STATUS;

Ce qui donne quelque chose du genre :

showslave.png

Il faut vérifier le début , à savoir :

  • Slave_IO_State soit à Waiting for master to send event
  • Slave_IO_Runnig soit à Yes
  • Slave_SQL_Running soit aussi à Yes

Ne vous reste plus qu'à tester l'évolution de la valeur de la position ( dans le log binaire ) à l'insertion d'un enregistrement sur le serveur maître ...
Ici la valeur qui doit évoluer : 972765

A savoir

  • Il est IMPERATIF de ne pas faire d'insertions sur le serveur esclave , seul les sélections sont possible, sinon , votre réplication s'arrêtera.
  • Les valeurs des screens ci dessous ne correspondent pas ensembles , pour la simple raison que les commandes pour faire cet article se sont fait sur des postes qui ne sont pas de vrai replications.


Si vous avez des commentaires , n'hésitez pas .
Ch.

Toujours est-il ,

- page 1 de 2