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.