J'ai un certain nombre de machines virtuelles Xen exécutées sur un certain nombre de serveurs Linux. Ces ordinateurs virtuels stockent leurs images de disque dans des volumes Linux LVM avec des noms de périphérique le long des lignes de/dev/xenvg/server001os et ainsi de suite. J'aimerais prendre des sauvegardes régulières de ces images de disque afin que je puisse restaurer la machine virtuelle dans le cas où nous aurons besoin (les périphériques LVM se reflètent déjà avec DRBD entre deux machines physiques chacune, je suis juste en train d'être un paranoïaque supplémentaire ici).
Comment vais-je aller à ce sujet? Ovment la première étape consiste à instancher le périphérique LVM, mais comment puis-je transférer ensuite des données sur un serveur de sauvegarde de la manière la plus efficace possible? Je pourrais simplement copier tout le périphérique, quelque chose du long des lignes de:
dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"
... Mais cela prendrait beaucoup de bande passante. Existe-t-il un outil de type RSYNC pour la synchronisation des contenus de blocs de disque entiers entre serveurs distants? Quelque chose comme:
rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img
Si je comprends correctement la page du manuel de Rsync, la commande ci-dessus ne fonctionnera pas réellement (le fera-t-il?), Mais cela montre ce que je vis. Je comprends que l'option RSYNC --Devices est de copier eux-mêmes des appareils, pas le contenu de ces appareils. Faire une copie locale de VM image avant de la synchroniser avec le serveur distant n'est pas une option car il n'y a pas l'espace disque.
Existe-t-il un utilitaire pratique qui peut synchroniser entre les périphériques de blocs et un fichier de sauvegarde sur un serveur distant? Je peux écrire un si je dois, mais une solution existante serait mieux. Ai-je manqué une option rsync qui le fait pour moi?
Standard RSYNC manque cette fonctionnalité, mais il y a un patch pour celui-ci dans la tagball Rsync-patchs (copy-périphériques.diff) qui peuvent être téléchargées à partir de http://rsync.samba.org/ftp/rsync/ Après appliquer et recompiler, vous pouvez les périphériques RSYNC avec l'option -Copy-Devices.
Bien qu'il existe des correctifs "écriture-périphérique" et "copie-périphérique" pour RSYNC, ils ne fonctionnent que sur de petites images (1-2 Go). RSYNC dépensera des âges à la recherche de blocs correspondants sur des images plus grandes et il est presque inutile de 40 Go ou de fichiers plus importants.
Nous utilisons ce qui suit pour effectuer une comparaison de checksum de 1 Mo, puis copiez simplement le contenu s'il ne correspond pas. Nous utilisons cela pour les serveurs de sauvegarde sur un hôte virtuel aux États-Unis à un système de sauvegarde au Royaume-Uni, sur Internet. Très peu d'activité de la CPU et de performances d'instantané sont seulement après les heures suivantes:
Créer un instantané:
lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1
export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='[email protected]';
Ensemencement initial:
dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"
Sauvegarde incrémentielle nocturne (envoie uniquement des blocs modifiés):
ssh -i /root/.ssh/rsync_rsa $remote "
Perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
lzop -dc | Perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
Perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
Supprimer l'instantané:
lvremove -f company-exchange-snap1
Les personnes intéressées à le faire spécifiquement avec des instantanés LVM pourraient aimer mon outil LVMSync , qui lit la liste des blocs modifiés dans un instantané et envoie simplement ces modifications.
Jetez un coup d'oeil à Projet de stockage Zumastor Linux Il implémente une sauvegarde "instantanée" à l'aide d'un outil binaire "rsync" via l'outil DDSNAP .
De la page de l'homme:
dDSNAP fournit une réplication de périphérique de blocs donné une installation d'instantanée de niveau de bloc capable de contenir plusieurs instantanés simultanés de manière efficace. DDSNAP peut générer une liste de morceaux d'instantanés qui diffèrent entre deux instantanés, puis envoyez cette différence sur le fil. Sur un serveur en aval, écrivez les données mises à jour sur un périphérique de bloc d'instantané.
Il y a un python script appelé blocsync qui est un moyen simple de synchroniser deux périphériques de bloc sur un réseau via SSH, ne transférant que les modifications.
- Copiez blocsync.py dans le répertoire de domicile de l'hôte distant
- Assurez-vous que votre utilisateur distant peut soit sudo, soit la racine elle-même
- Assurez-vous que votre utilisateur local (root?) Peut lire le périphérique source et ssh à l'hôte distant
- Invoquer:
python blocksync.py /dev/source user@remotehost /dev/dest
Je suis récemment piraté dessus pour le nettoyer et le changer pour utiliser le même algorithme de somme de contrôle rapide que RSYNC ( Adler-32 ).
Attention simplement que la performance d'un système contenant des instantanés LVM est proportionnelle au nombre d'instantanés.
Par exemple Performances MySQL avec instantanés LVM
Si vous essayez de minimiser le montant de la quantité d'espace vide que vous envoyez sur le fil avec une plaine dd
, pourriez-vous ne pas simplement le conduire à gzip avant de le faire passer à SSH?
par exemple. dd if =/dev/xenvg/server001os | gzip | Administrateur SSH @ BackupServer "DD Of =/MNT/LARGEDISK/SERVER001OS.IMG.GZ"
Après avoir recherché plusieurs années, j'ai récemment créé un outil pour Synchronisation des instantanés LVM entre serveurs. Il est conçu pour utiliser minimal IO et permettre aux systèmes de fonctionner pendant que la synchronisation se produit.
Il est similaire à ZFS Envoyer/recevoir en ce sens que, en synchronisant les différences entre les instantanés LVM et utilise un provisioning mince de sorte que l'impact des performances soit minime.
Je voudrais des commentaires, alors s'il vous plaît jeter un oeil.
En plus de Réponse de David Herselman - Le script suivant sera synchronisé vers un périphérique local:
Perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 |
Perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
Perl -ne 'BEGIN{$/=\1} if ($_ eq"s") {$s++} else {if ($s) {
seek STDOUT,$s*1024,1; $s=0}; read ARGV,$buf,1024; print $buf}' 1<> $dev2
Autant que je sache, les deux scripts ont été publiés pour la première fois à - lists.samba.org .
Ceci est une ancienne question, mais personne n'a mentionné deux outils très utiles pour synchroniser efficacement deux dispositifs de blocs:
BDSYNC , qui utilise une approche diff-transfert-et-patch;
blocksync (ici vous pouvez trouver ma version améliorée ), qui utilise une approche de réécriture dans la place.
Je suggère fortement de jouer avec à la fois des outils et de sélectionner les éléments de mieux à mieux s'adapter à votre utilisation prévue.