lindev.fr

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

27 mai 2011

LVM exemple de mise en pratique

recuperation-donnees-fichiers-9.jpg Cela fait longtemps que je tourne autour de ce gestionnaire de volumes jamais avoir eu l'occasion d'y mettre les mains . Aujourd'hui c'est chose faite !

LVM / LVM2 utilisation

Il y a quelques jours j'ai eu pour mission la mise en production d'un serveur web linux, hébergé sur une plateforme de virtualisation microsoft Hyper-V. Le contrainte principale était bien entendu la disponibilité de ce serveur , mais aussi la possibilité de restaurer le serveur sans connaissance particulière et surtout en un temps record ..

Première possibilité ,

La mise en place d'un cluster ( soit , deux machines virtuelles en front ou une maitre et l'autre esclave ). La machine hôte ( Hyper-V ) étant déjà bien chargé , la mise en place d'une seconde VM n'était pas envisageable.

Seconde possibilité ,

La machine hôte étant associée à une baie SAN, nous avons donc migré les données variables ( sources et BDD ) sur cette dernière , ce qui rend la restauration de la machine virtuelle aussi simple qu'un "copier coller", à partir du moment ou la vm est sauvegardé.

Pourquoi LVM

J'y viens, mettre les données dynamiques sur la baie SAN est bien beau , mais figer une taille de disque ( aussi virtuel soit-il ) est assez délicat. A moins d'être devint, il est très difficile d'estimer une taille suffisamment grande pour supporter les éventuelles évolutions, et il serait vraiment dommage de gâcher de de l'espace disque en surestimant le besoin .( l'espace disque SAS est à utiliser avec parcimonie, le moindre Go de cette qualité est précieux ).

J'ai donc créé un disque virtuel d'une taille fixe de 5Go ( il est aussi possible de créer un disque à taille variable , mais les performances chutent de 30% selon la doc ... ). 5Go est bien assez pour commencer et être tranquille un bon moment ( plus ou moins long selon l'activité ).

Ce disque virtuel nommé sdb ( que nos pouvons comparer à un disque dur physique ), sera dans un premier temps formaté, et nous allons créer une partition primaire sdb1 .

Création de la partition primaire

cfdisk /dev/sdb

Maintenant, étant donné que je souhaite utiliser ce disque avec LVM, il est nécessaire de déclarer la partition fraichement créée

Déclaration de la partition sdb1 à LVM

pvcreate /dev/sdb1

Maintenant étape importante, créer le groupe de volume(s) GV. Ce groupe de volume peut être représenté comme une unité regroupant un ensemble de volumes , ou plus simplement expliqué , une grosse partition composée de une ou plusieurs partitions de niveau inférieur appartenant ou non au même disque dur . Ce ne sera plus à vous de gérer la répartition de vos données sur entre les différentes partitions , le GV s'en chargera pour vous.

Création du GV ( Groupe de volumes )

vgcreate MONGROUP /dev/sdb1

Nous voilà maintenant avec un superbe groupe de volumes nommé MONGROUP sur lequel nous allons créer nos volumes logiques LV ( pour les utiliser comme des partitions standard )

Création d'une partition LV ( Volume Logique )

lvcreate -n mapartition -L 4,95g MONGROUP

warning.png Attention à mettre une taille valide, elle ne doit en aucun cas être supérieur à l'espace disponible ( risque de pertes ).

La partition maintenant créée, dernière étape avant de l'exploiter, le formatage .

Formatage de la partition mapartition

mkfs -t ext4 /dev/MONGROUP/mapartition

Et voilà notre volume prêt à l'emploi .

Ne reste plus qu'à le monter .. et l'exploiter ..

mount -t ext4 /dev/MONGROUP/mapartition /mnt

Je vous vois déjà venir en me disant .. que jusqu'à maintenant .. il n'y a pas d'avantage à utiliser LVM ... C'est vrai , créer simplement une partition et la formater directement serait tout aussi performant et bien plus rapide à mettre en place ..

Ok, alors le temps passe et tout d'un coup vous recevez mail de votre client indiquant avoir reçu plusieurs alerte concernant l'espace disponible sur le disque .. aïe !

Pas de panique puisque vous avez pris la peine de créer une partition géré par LVM, dans notre cas il suffira d'augmenter la taille de notre disque virtuel ( ou d'en créer un second ) et de l'ajouter à notre groupe de volumes MONGROUP

Augmenter la capacité du volume

Voyons comment faire cette manip en 5 minutes.

Dans un premier temps il faut démonter le volume avec la commande umount

Démonter le volume à modifier

umount /mnt

Puis il nous faut créer une nouvelle partition ( à partir du nouveau disque ou de l'espace disponible sur le disque virtuel sdb 5G de plus )

cfdisk /dev/sdb

info.png La nouvelle partition sera déclarée comme étant sdb2 ( à adapter dans votre cas )

Une fois la partition créée, nous allons la déclarer à LVM

pvcreate /dev/sdb2

Nous allons ensuite étendre notre groupe de volumes ( MONGROUP ) afin qu'il prenne en compte ma nouvelle partition , et de ce fait , offrir autant d'espace en plus.

Extension du groupe de volumes

vgextend MONGROUP /dev/sdb2

Voilà qui est fait. Nous allons vérifier la partition existante avant de la redimensionner

Vérification de la partition existante

e2fsck -f /dev/MONGROUP/mapartition

Une fois terminé, l'étape la plus importante , le redimensionnement de la partition . Pour commencer nous allons redimensionner notre volume logique ( LV ) mapartition

Redimensionnement de mapartition ( LV )

lvresize -L9,95g /dev/MONGROUP/mapartition

warning.png Attention à mettre une taille valide, elle ne doit en aucun cas être supérieur à l'espace disponible ( risque de pertes ).

Enfin, le volume logique redimensionné, reste à redimensionner notre système de fichiers ext4

Redimensionnement du système de fichiers ext4

resize2fs /dev/MONGROUP/mapartition

Et voilà mon espace disque vient d'augmenter de 5Go . Cette opération peut être répété autant de fois que nécessaire .

lvm2.png

Ch.

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

20 janv. 2010

Apprendre par la pratique

Wablab

wablab-logo.png

C'est un site qui vous propose des "défis" , d'exploitation de failles , les plus connus pour commencer ...
Aprés une inscription très rapide , sur le site , vous voilà prêt à relever les 7 premières épreuves .

Chaque épreuve pointe une faille bien précise , de plus , ils ne vous laissent pas sans information , ce qui les rends toutes largement faisable , sans non plus passer trop de temps à tâtonner .
Voilà de bon exercices qui par la pratique vous permet d'apprendre à connaître donc à éviter ce genre de failles dans vos développements , de plus je trouve ce genre d'exercice très addictifs .

Seul le niveau "Beginner" avec ses 7 défis est actuellement en ligne , il faut espérer l'ouverture des niveaux "Intermédiaire" et "Expert" dans un future proche , en attendant , allez y , faites chauffer votre matière grise et surtout votre bon sens

Voici le lien

www.wablab.com



12 janv. 2010

CouchDB

Installer couchDB debian Lenny

couchDB.png

Pour installer couchDB sur debian lenny ( stable ), une toute petite manip est nécessaire afin d'avoir la version 0.10.0. Sinon , vous aurez la version 0.8.0 qui est une version trop ancienne pour une bonne utilisation .

La manip

Le principe est simple , utiliser les paquets de squeeze.

Editez votre sources.list:

vim /etc/apt/sources.list

Ajouter le dépot squeeze :

deb http://ftp2.fr.debian.org/debian/ squeeze main contrib non-free

Un petit update

apt-get update

Et enfin , l'installation :

apt-get install couchdb

Attention : Une fois l'installation terminée , n'oubliez surtout pas de retirer le dépot de votre source.list .

Configuration

Fichier : /etc/couchdb/default.ini

Si vous désirez vous connecter de l'extérieur , ou pour utiliser une réplication entre deux machines , il vous faudra enlever ( commenter ) le paramétre bind_address = 127.0.0.1

Dans ce fichier , vous pouvez aussi paramétrer le port auquel le serveur écoute . ainsi que d'autres choses ... mais je ne suis pas encore aller plus loin pour le moment .

Fichier : /etc/couchdb/local.ini

Pour un accès administrateur un peu plus privé , dé-commentez le paramètre admin = ...
Et mettez votre mot de passe , il sera crypté au prochain redémarrage de couchDB .

Redémarrage

Redémarrez votre serveur couchDB :

/etc/init.d/couchdb restart

Note: J'ai fais deux installations et deux fois j'ai rencontré le problème suivant , pas moyen de me connecter au serveur ... dans les logs , un problème de bind ( le port déjà occupé ? ).
Solution , couper tous les process à coup de kill -9 et redémarrer couchdb .

Utilisation

Administration

Par défaut , une interface web d'administration est disponible à l'adresse suivante :

http://<ip du serveur>:5984/_utils

Avec php

Pour l'utilisation de couchDB avec php , j'ai développé une petite librairie simplifiant grandement les actions de bases Ajout / suppression / modification / clonage / lecture / réplication / ect ...
Cette librairie est disponible à plusieurs endroits :
fw-oswar.fr
phpclasses.org
freashmeat



Je trouve cet outil vraiment complémentaire à une base , il y a encore beaucoup à découvrir dessus ( les vues , les fonctions ect ... ) .. mais une chose à la fois .

Ch.

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 [email protected]'%' 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 [email protected]:/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