Salut tout le monde,
Partie 1 : Présentation de proxmox et de la virtualisation
Partie 2 : Configuration du réseau interne
Partie 3 : Un petit Stress test pour la route
Partie 4 : Quelques optimisations Webserver
Partie 5 : HTTPS et IPV6
Partie 6 : Le Monitoring
Partie 7 : Les Backup
Et voilà dernier article de cette série, cette fois-ci dédié au backup de ses différents services.
De quoi pouvoir récupérer d’une grosse défaillance software ou hardware sans rien perdre.
Qu’est-ce que ça change proxmox pour les backup ?
Jusque-là, pour les backup, il fallait préparer des procédures de backup service par service (mysql avec des dump régulier, apache avec de l’archivage journalier, logs, memcache, …)
On finissait avec de très nombreux backup pour finalement se rendre compte le jour où l’on en a besoin qu’on a pas le bon backup où qu’il ne fonctionne plus depuis 6 mois :'(
Ou alors par exemple que le dump sql ne correspond pas aux dumps des fichiers.
L’idée ici va être plus simple, on backup les VM entièrement avec leurs contenus.
Le serveur SQL est mort, pas grave je te remonte un backup de tout le serveur en moins de 5 minutes (ça n’empêche par de faire des dumps régulièrs).
Dans cet article, on va voir dans un premier temps comment faire des backup et restaurer ses machines virtuelles.
Et dans un second temps comment faire des migrations ou des copies de VM d’un serveur à un autre.
On utilise l’interface web ?
Au début j’étais assez intéressé par l’interface et l’onglet backup.
Malheureusement, je trouve celui-ci un peu trop contraignant, j’ai donc décidé d’utiliser les utilitaires en lignes de commandes et de faire comme bon me semble.
Ce tuto ne vous présentera donc que des lignes de commandes, désolé pour ceux qui voulait du user friendly 😛
Quel type de backup va t’on faire ?
Sous OpenVZ, il y a 3 techniques de backup pour vos VM :
snapshot : cela fait un snapshot live de votre VM (ram + disk) et il est capable de la relancer dans le même état
suspend : cela met la VM en veille, copie tous les fichiers et la sort de veille (indispo de la VM <5s).
stop : cela arrête complètement la VM, copie tous les fichiers et la redémarre (indispo de la VM ~1min).
Ayant eu des problèmes avec le mode snapshot et un serveur SQL qui ne voulait plus repartir (une jolie corruption de table), j’ai arrêté d’utiliser ce type de backup.
J’utilise désormais quasi systématiquement le mode suspend qui lui provoque une légère indisponibilité, mais qui fourni des backups plus fiables.
Alors comment on sauvegarde ?
La commande est assez simple
vzdump <id de la vm>
Mais bon, on peut rajouter un certain nombre de paramètres, voici un exemple légèrement plus complet
vzdump 105 --dumpdir /var/lib/vz/dump/ --bwlimit /80000 --maxfiles 2 --mode suspend --compress gzip --exclude-path /home/static/content
Voilà, donc là voici un vrai commande de backup que j’utilise sur l’une de mes vm :
dumpdir : dossier dans lequel les backup seront enregistré
bwlimit : vitesse d’écriture max (pour éviter de pourrir tous les IO disque du serveur)
maxfiles : nombre de backup à conserver pour cette vm
mode (snapshot/suspend/stop) : donc le mode de backup
compress (0/lzo/gzip) : type de compression qu’on va utiliser pour gagner de la place
exclude-path : permet d’extraire certains dossier pour gagner de la place et du temps sur les copies de backup
C’est pas dangereux de backup en local?
Si totalement.
Si on les conserve en local, c’est surtout pour pouvoir facilement et rapidement revert un gros crash, un hack ou une corruption de données.
Mais en cas de défaillance du raid, du disk ou de la machine, on risque de tout perdre et les backups avec.
C’est pourquoi on va simplement rajouter une règle à la fin de notre script pour synchroniser ça ailleurs (sur un autre serveur, un ftp, une machine chez vous …).
Dans mon infra mon serv1 va copier ses backup sur serv2.
et inversement, serv2 va copier ses backup sur serv1.
Le jour où je perds l’un de ces deux serveurs, je ne perdrais aucune VM.
J’aurai la possibilité de remonter un proxmox tout neuf assez rapidement et le relancer comme si de rien était.
Et voilà le script
Et voilà donc le petit script python que j’ai fait pour gérer mes backup :
import sys, os, commands; # # Configuration des Backup # path_log="/var/log/auto-vzdump.log"; path_vzdump = "vzdump"; path_dump = "/var/lib/vz/dump/"; dump_bw_limit = 50000; # Configuration remote (SSH / SCP) enable_remote_backup = True; remote_host = "[adresse d'un serveur distant]" remote_login = "backup" remote_folder = "/var/lib/vz/dump/" # Configuration des backup par VM config_vm = { '101' :{ 'mode' : 'suspend', 'compress' : True, 'exclude-tmp' : True, 'exclude-path' : ['/home/deluge','/home/deluge-tmp'], 'max_backup_local' : 2 }, '104' :{ 'mode' : 'suspend', 'compress' : True, 'exclude-tmp' : True, 'max_backup_local' : 5 } }; # # Fin de la configuration # # Functions def build_cli_dump( vm_id, vm_options ): cli = path_vzdump+" "+vm_id; # On set le dossier de backup if path_dump : cli += " --dumpdir "+path_dump; # On set la vitesse de backup if dump_bw_limit : cli += " --bwlimit "+str(dump_bw_limit); # On set le nombre de backup conserver if 'max_backup_local' in vm_options.keys() : cli += " --maxfiles "+str(vm_options['max_backup_local']); # On set le mode de backup utiliser if 'mode' in vm_options.keys() : cli += " --mode "+vm_options['mode']; else : cli += " --mode suspend"; # On active ou non la compression if 'compress' in vm_options.keys() : if vm_options['compress'] : cli += " --compress gzip"; else : cli += " --compress 0"; # On ajoute l'option pour clean les dossiers temporaires (/var/log, /tmp, /var/tmp, ...) if 'exclude-tmp' in vm_options.keys() : if vm_options['exclude-tmp'] : cli += " --stdexcludes 1"; else : cli += " --stdexcludes 0"; # On ajoute ou non des excludes path custom if 'exclude-path' in vm_options.keys() : for path in vm_options['exclude-path']: cli += " --exclude-path "+path; return cli def get_last_backup( vm_id ): lastFile = False; for files in os.listdir( path_dump ): if files.endswith(".tar.gz") or files.endswith(".tgz") or files.endswith(".lzo") : if "vzdump-openvz-"+vm_id in files : lastFile = files return lastFile; def remote_backup( vm_id ): backup = get_last_backup( vm_id ); if backup : hostname = commands.getoutput("hostname"); folder = remote_folder+hostname+"/"; # Creation du folder distant cmdSsh = "ssh "+remote_login+"@"+remote_host+" \"mkdir -p "+folder+"\""; log( ">> "+cmdSsh ); log( commands.getoutput(cmdSsh) ); # Copie du backup dans le folder distant filename, extension = os.path.splitext( backup ); cmdScp = "scp "+path_dump+backup+" "+remote_login+"@"+remote_host+":"+folder+"vzdump-openvz-"+str(vm_id)+"-last.tar"+extension; log( ">> "+cmdScp ); log( commands.getoutput(cmdScp) ); def log( txt ): print txt; with open(path_log, "a") as logfile: logfile.write( txt +"\n"); # Processing for vm_id, vm_options in config_vm.items() : log( "Backup of VM "+vm_id+" : Started" ); log( " * Nettoyage des connexions de cette VM" ); cmdClean ="kill `ps -e | grep 'vzctl enter "+str(vm_id)+"' | awk '{print $1}'`" log( ">> " + cmdClean ); log( " * Commande de Backup" ); cmd = build_cli_dump( vm_id, vm_options ); log( ">> " + cmd ); log( commands.getoutput(cmd) ); if enable_remote_backup : log( " * Copie du backup sur un serveur distant : "+remote_host ); remote_backup( vm_id ); log( "Backup of VM "+vm_id+" : Finished" );
C’est donc un exemple qui va backup deux VM ( 101 et 104 ) et qui va les copier sur un autre serveur.
Il ne reste plus qu’à rajouter un petit crontab -e
0 4 * * 2,6 /usr/bin/python /root/backup-vm.py
Et voilà, tous les mardi et samedi à 4h du mat, ce script de backup sera exécuté.
Bien entendu, pour les connexions scp/ssh, pas question de rentrer un mot de passe à chaque backup.
Il faut donc avoir mis en place des authorized keys ssh pour pouvoir se logger directement.
Et comment on restaure une VM le jour où on en a besoin ?
assez simple :
vzrestore [fichier] [id de la vm]
C’est bien les commandes comme ça où il n’y a pas besoin de longues descriptions.
Et donc une migration/copie de VM?
Ça parait compliqué sur le papier de migré une machine, et pourtant.
Il suffit de faire un vzrestore d’une VM d’un autre serveur en précisant un ID de VM qui n’existe pas en local.
Exemple, sur mon serv2 :
vzrestore /var/lib/vz/dump/ks203802/vzdump-openvz-105-last.tar.gz 105
et voila je me retrouve avec la VM 105 installée sur ce proxmox et visible dans l’interface.
Et c’est une copie exacte de la première VM qui tournait sur l’autre serveur (attention si les deux serveurs sont en vpn, il risque d’y avoir des problèmes de configuration réseau, les 2 VM ayant la même).
Il ne reste plus qu’à changer cette config réseau et on peut la start comme d’habitude.
Et voilà c’est tout, le plus long c’est au final le scp/rsync entre les serveurs.
Bon, cet article se termine là, à la prochaine ++
at 17 h 12 min
Hô! ca sens le torrent ^^
Plus sérieusement, je suis passé voir ton script concernant ce backup et j’étais occupé à me demander si t’avais pas un fork ce celui-ci pour du ftp? (ceci avant que je commence à le coder maison)
Merci à toi,
Très bonne continuation,
Kéro
Twitter: @progerance
at 8 h 32 min
Pour du ftp, je te conseille de monter ton espace ftp de backup comme étant un repertoire sur ton système à l’aide de curlftpfs. C’est plus simple à gérer.
at 14 h 10 min
Bonjour, je cherche a migré des VMs chez ovh sous proxmox, du coup votre script m’intéresse mais je ne vois pas comment je doit mis prendre. apparemment à part « [adresse d’un serveur distant] » et le fichier config_vm ou je dois changer par mes vm je n’est rien d’autre à faire ? comment le lancer ? je l’upload sur le proxmox ovh dans un dossier particulier ? Cordialement.
at 11 h 57 min
Bonjour,
Comment utiliser –exclude-path pour une VM Windows ou je veux ignorer le lecteur F: par exemple?
at 17 h 35 min
Et bien quelle surprise, il y a encore des gens ici.
Desole gohan, mais je n’ai jamais utiliser de VM windows dans proxmox, du coup je n’ai rien de special a te suggerer a part te rediriger vers la documentation …
at 12 h 03 min
Bonjour,
un petit hors sujet mais qui est hyper important !!!!!
j’ai une machine windows qui se met en suspend dans mon proxmox et il n’y a aucune raison que cela se produise. Est ce que l’un d’entre vous saurait m’aider ? vue le savoir de l’admin de ce site ça serait cool que l’on maide.
Merci !
at 3 h 03 min
Hum … je n’en ai pas la moindre idée.
Les seuls tests que j’avais fait avec des container windows marchaient bien meme si un poil lourd.
A part ca, dur de t’aider, desormais je n’ai meme plus de proxmox a disposition pour tester. Bon courage ++
at 15 h 03 min
Bonjour,
Merci énormément ! Ayant personnellement un serveur Cloud Azure pour conserver mes sauvegardes distantes , j’ai l’impression qu’avec ton script il n’arrive pas à communiquer avec cette machine , pourrais-tu m’aider ou aurais-tu une adresse pour qu’on puisse communiquer à ce propos ?
Un énorme merci pour ton travail et si possible de ta réponse !
at 1 h 40 min
[…] Il était une fois, les backup/migration de VM sous Proxmox […]