Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 18/02/2013, à 14:12

mcmyst

Stratégie backup VM avec disque LVM

Bonjour à tous,

Je dispose de deux hyperviseurs séparés dans deux datacenter différents.
Un hyperviseur fait tourner 3 VM en état nominale, et si un jour cet hypervisuer crash, je veux être capable de démarer le service sur le deuxième hyperviseur.
Je ne veux pas de solution de haute dispo, je veux juste mettre en place une solution de backup qui me permette de repartir sur le second hyperviseur en "Plan de reprise d'activité".

Partant de là, j'ai 2 VM qui heberge chacune une base de données MySQL-InnoDB avec un fort trafic (300 insertion/s) et la troisième ne fait quasiment aucune écriture sur son disque. Ce que je veux c'est être sur que mes backups soit restaurables sans aller trifouiller dans MySQL pour faire du recovery etc... Ca ne me dérange pas de bloquer l'accès à mes BDD le temps d'un backup.

Voici le script que j'ai fait, le pricnipe est :
- vérouillage BDD mySQL
- snapshot LVM
- stockage du contenu dans un fichier BZ2
- suppresion des snapshot LVM
- envoit du backup sur le deuxième hyperviseur
- restauration du contenu dans les VM respective
En cas de crash, on a plus qu'a cliquer sur le bouton play sur les VM de l'hyperviseur 2.

#!/bin/bash

##### Variables
fifo_bdd1="/tmp/backup_bdd1"
ip_bdd1="bdd1.domain"
fifo_bdd2="/tmp/backup_bdd2"
ip_bdd2="bdd2.domain"
#####

#### Backup du serveur
echo "Backup du volume LVM /dev/vg1/kvm-srv1..."
lvcreate -L 9G -s -n kvm-srv1-backup /dev/vg1/kvm-srv1
echo "Backup du volume LVM /dev/vg1/kvm-srv1 termine"

#### Backup de la BDD2
echo "Verouillage de la BDD2 avant le backup"
if [ -e $fifo_bdd2 ]; then
        rm $fifo_bdd2
fi
mkfifo $fifo_bdd2
mysql -u root -p'pwd' -h $ip_bdd2 <$fifo_bdd2 & (
  echo "FLUSH TABLES WITH READ LOCK ;" 1>&6
  echo "Base de donnees verouillees, backup du LVM /dev/vg1/kvm-bdd2..."
  lvcreate -L 9G -s -n kvm-bdd2-backup /dev/vg1/kvm-bdd2
  echo "Backup du LVM /dev/vg1/kvm-bdd2 termine"
  echo "UNLOCK  tables;" 1>&6
) 6> $fifo_bdd2
echo "Deverouillage de la BDD2 apres le backup"

#### Backup de la BDD1
echo "Verouillage de la BDD1 du proxy avant le backup"
if [ -e $fifo_bdd1 ]; then
        rm $fifo_bdd1
fi
mkfifo $fifo_bdd1
mysql -u root -p'pwd' -h $ip_bdd1 <$fifo_bdd1 & (
  echo "FLUSH TABLES WITH READ LOCK ;" 1>&6
  echo "Base de donnees verouillees, backup du LVM /dev/vg1/kvm-bdd1..."
  lvcreate -L 101G -s -n kvm-bdd1-backup /dev/vg1/kvm-bdd1
  echo "Backup du LVM /dev/vg1/kvm-bdd1 termine"
  echo "UNLOCK  tables;" 1>&6
) 6> $fifo_bdd1
echo "Deverouillage de la BDD1 apres le backup"

# Sauvegarde des snapshots
echo "Sauvegarde des snapshots"
dd if=/dev/vg1/kvm-srv1-backup | bzip2 -9 -c > /srv/backup/kvm-srv1-backup.bz2
dd if=/dev/vg1/kvm-bdd2-backup | bzip2 -9 -c > /srv/backup/kvm-bdd2-backup.bz2
dd if=/dev/vg1/kvm-bdd1-backup | bzip2 -9 -c > /srv/backup/kvm-bdd1-backup.bz2
echo "Fin de sauvegarde des snapshots"

# Suppression des snapshots LV
echo "Suppression des snapshots LVM"
lvremove -f /dev/vg1/kvm-srv1-backup
lvremove -f /dev/vg1/kvm-bdd2-backup
lvremove -f /dev/vg1/kvm-bdd1-backup
echo "Fin de suppression des snapshots LVM"

# Envoie des snapshots sur HYPERVISEUR2
echo "Envoi des snapshot vers HYP2"
scp -l 20000 /srv/backup/kvm-srv1-backup.bz2 root@hyp2.domain:/srv/backup/kvm-srv1-backup.bz2
scp -l 20000 /srv/backup/kvm-bdd2-backup.bz2 root@hyp2.domain:/srv/backup/kvm-bdd2-backup.bz2
scp -l 20000 /srv/backup/kvm-bdd1-backup.bz2 root@hyp2.domain:/srv/backup/kvm-bdd1-backup.bz2
echo "Fin de l'envoi vers HYP2"

# Restauration des snapshots sur les VM
echo "Restauration des snapshot sur HYP2"
ssh hyp2.domain 'bunzip2 -c /srv/backup/kvm-srv1-backup.bz2 | dd of=/dev/vg1/kvm-srv1'
ssh hyp2.domain 'bunzip2 -c /srv/backup/kvm-bdd2-backup.bz2 | dd of=/dev/vg1/kvm-bdd2'
ssh hyp2.domain 'bunzip2 -c /srv/backup/kvm-bdd1-backup.bz2 | dd of=/dev/vg1/kvm-bdd1'
echo "Fin de la restauration sur HYP2"

Plusieurs questions:
- Je dois impérativement vérouiller les BDD en lecture seul pendant le spashot afin d'avoir un backup cohérent. Cependant, je ne peux pas me connecter à MySQL, vérouiller les table, me déconnecter, faire le snapshot et me reconnecter pour les dévérouiller car MySQL dévérouille les table dès que l'on se déconnecte. C'est pourquoi j'ai récupérer un bout de code sur Internet qui permet de faire ça en passant par une redirection dans un descripteur de fichier. Seulement, au moment du snapshot LVM un message m'indique : "File descriptor 6 (/tmp/backup_bdd1) leaked on lvcreate invocation". Ma question est donc : Au moment du snapshot est-ce que mes bases sont bien vérouillés ? Ou est ce que le snapshot LVM coupe le descripteur de fichier et donc déconnecte l'utilisateur du serveur MySQL, ce qui déverouille les tables ?

- Je trouve que la phase "dd if ... | bzip " dure très longtemps, surement due au fait qu'il faut parcourir tout le snapshot LVM de plusieurs dixaines de Go même si il n'y a que 5Go d'utilisé ? Je cherche bien sur à limiter les I/O disque sur l'hyperviseur 1 pendant les backups,.

- Auriez-vous des idées afin d'améliorer la stratégie de backup ? Encore une fois je ne veux pas faire de haute dispo, donc pas la peine de sortir les armes lourdes (DRDB et companie...), un simple backup me suffit.

Dernière modification par mcmyst (Le 18/02/2013, à 14:15)

Hors ligne

#2 Le 18/02/2013, à 15:40

tiramiseb

Re : Stratégie backup VM avec disque LVM

Salut,

Voici une réponse qui n'en est pas une : un méthode, un peu différente, que je te propose.

1/ verrouiller la base MySQL (flush tables with read lock)
2/ forcer la synchronisation des données sur le disque (sync)
3/ faire un snapshot LVM (lvcreate [...] -s [...])
4/ déverrouiller la base (unlock tables)
5/ monter le snapshot sur un point de montage temporaire
6/ sauvegarder le contenu du snapshot (donc un tar du contenu et non un dd du volume)
7/ démonter le snapshot
8/ détruire le snapshot

Tu trouveras le détail dans l'article que j'ai écrit dans le magazine Linux Pratique n°75, qui est a priori encore en kiosque.

La durée pendant laquelle la base est inaccessible est de quelques secondes, entre le verrouillage et le déverrouillage.


EDIT : en relisant ton message c'est ce que tu fais déjà, mais en bien plus compliqué... En raison de ce que je cite ci-dessous...


Cependant, je ne peux pas me connecter à MySQL, vérouiller les table, me déconnecter, faire le snapshot et me reconnecter pour les dévérouiller car MySQL dévérouille les table dès que l'on se déconnecte.

Tu es vraiment sûr de ça !?
Je n'ai jamais vu de problème de ce genre.

Dernière modification par tiramiseb (Le 18/02/2013, à 15:42)


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXe siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#3 Le 18/02/2013, à 15:56

mcmyst

Re : Stratégie backup VM avec disque LVM

Merci de ta réponse rapide !
Pour pouvoir monter le snapshot il me faudrait assez d'espace sur l'hyperviseur... Mon serveur ne fait que quelques dizaine de Go, mais les BDD font 100Go chacunes.
Et pour le fonctionnement de MySQL, je confirme c'est bien le cas. Peux être par sécurité, mais en tous ca s si je me deconnecte, les tables seront déverouillées même si je ne l'ai pas explicitement demandé.
http://dev.mysql.com/doc/refman/5.1/en/ … thods.html, en commentaire:

FLUSH TABLES WITH READ LOCK is extremely convenient for making a full backup of all MyISAM databases. However, the database locks are released as soon as the mysql session ends, which is why this backup-methods page suggests that FLUSH TABLES WITH READ LOCK be executed in one shell, while the backup command is run from a separate shell.

Mais ca ne me plait pas trop de faire plusieurs fichier de backup comme précise le commentaire.

Hors ligne

#4 Le 19/02/2013, à 08:17

tiramiseb

Re : Stratégie backup VM avec disque LVM

En effet, oups...

Bah la solution proposée est pas mal non ?

echo "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate [...] -s [...]; UNLOCK TABLES;" | mysql -u <user> -p <password>

Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXe siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#5 Le 19/02/2013, à 09:04

mcmyst

Re : Stratégie backup VM avec disque LVM

C'est vrai, je n'avais pas pensé que je pouvais juste executer une commande et non un autre script externe...
Merci !

Hors ligne

#6 Le 19/02/2013, à 13:16

mcmyst

Re : Stratégie backup VM avec disque LVM

J'ai modifié mon script de backup sur ce principe:

echo "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate -L 9G -s -n kvm-bdd1-backup /dev/vg1/kvm-bdd1; UNLOCK  tables;" | mysql -u root -p'pwd' -h $ip_BDD1

Mais j'ai toujours un message :

File descriptor 3 (socket:[4211378]) leaked on lvcreate invocation. Parent PID 26405: sh

Je ne sais pas si c'est un message d'erreur ou si c'est juste une information...

Hors ligne

#7 Le 19/02/2013, à 13:32

tiramiseb

Re : Stratégie backup VM avec disque LVM

C'est juste un warning sans gravité...

1/ l'exemple suivant contient cette erreur : http://blog.johngoulah.com/tag/mysql-ba … -snapshot/
2/ Le bugreport suivant indique que cette erreur est sans gravité : http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=558712


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXe siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#8 Le 19/02/2013, à 16:12

mcmyst

Re : Stratégie backup VM avec disque LVM

J'étais effectivement tombé sur le premier lien, mais l'auteur ne commente pas l'erreur donc ça ne m'a pas inspiré confiance, merci !

Dernière modification par mcmyst (Le 19/02/2013, à 16:13)

Hors ligne

Haut de page ↑