This is the old XigmaNAS forum in read only mode,
it will taken offline by the end of march 2021!



I like to aks Users and Admins to rewrite/take over important post from here into the new fresh main forum!
Its not possible for us to export from here and import it to the main forum!

Transformer des snapshots en backup-rsync

French community

Moderators: velivole18, ernie, mtiburs

Forum rules
Set-Up GuideFAQsForum Rules
Post Reply
User avatar
mtiburs
Forum Moderator
Forum Moderator
Posts: 951
Joined: 09 Aug 2012 23:34
Location: France - Besançon
Status: Offline

Transformer des snapshots en backup-rsync

Post by mtiburs »

Bonjour les amis,

Suite à une grosse refonte de mon architecture informatique, je voulais pouvoir "ranger" mieux certaines choses.

Voici le "topo":
- les snapshots ZFS, c'est bien mais c'est propre au FS (Files Système), c'est à dire que çà ne fonctionne que sur ZFS
- les backup-rsync c'est bien, mais faut les faire au fil de l'eau (l'avantage, c'est que c'est des fichiers normaux, donc, qui ne sont pas liées au FS)

... alors, je me suis dis qu'il serait sans doute possible de faire des rsync de snapshots dans un répertoire "backup-rsync (dédié aux rsync)".
Pour faire cela, il faut passer par des clones de snapshots, et là le rsync devient possible facilement.
Seulement c'est lourd et il faut être attentif à ce qu'on fait ... :lol: ... çà fait déjà trop de contraintes :roll: ... alors, un p'tit script pourrait faire les choses à ma place ;)

le principe c'est:
un pool "rpool" qui contient des datasets (comme nas1_marc)
ce pool contient par exemple:
rpool/nas2_marc (le dataset ou jeu de volume)
rpool/nas2_marc@auto-20180213-060000
rpool/nas2_marc@auto-20180214-060000
rpool/nas2_marc@snap
rpool/nas2_marc@unautresnapshot
rpool/nas2_marc@auto-20180217-060000
rpool/nas2_marc@auto-20180218-060000
le but est de faire un rsync entre rpool/nas2_marc@auto-20180213-060000 et rpool/nas2_marc@auto-20180214-060000, dans un répertoire contenant le même nom que le snapshot (en remplaçant le @ par -) et ensuite de supprimer rpool/nas2_marc@auto-20180213-060000.
Pour cela il faut:
1) au moins 2 datasets
ensuite,
2) il faut transformer les 2 datasets en clones pour avoir une structure de fichiers normale
puis,
3) faire le rsync (avec l'option backup)
puis,
4) supprimer les clones et le dataset le plus ancien

A chaque lancement du script, un dataset est éliminé, et, si il n'y en a plus assez, le script s'arrête.
De cette façon, on se retrouve avec
la disparition du datatset rpool/nas2_marc@auto-20180213-060000
la différence entre ( rpool/nas2_marc-auto-20180213-060000 et rpool/nas2_marc-auto-20180213-060000 ) rangé dans un répertoire dédié: rpool/BACKUP_nas2/rpool/nas2_marc-auto-20180214-060000 qui se trouvera dans une zone de backup qui se trouve extérieur au pool.
(dans mon cas, je fais le backup dans le même pool, mais sinon, çà donnerait: unautrepool/BACKUP_nas2/rpool/nas2_marc-auto-20180214-060000)

Chaque lancement du script "mange" le plus ancien snapshot et crée en échange un backup-rsync avec le même nom que le snapshot (avec un - à la place du @)
J'ai mis une petite sécurité, car si il y a moins de 2 snapshots, çà grignote l'arborescence du système ... ce qui ... est un peu gênant :shock: ... enfin, çà fait un peu désordre :? ... c'est juste apocalyptique quoi 8-) ... je m'en doutais, mais j'ai voulu essayer quand même ... maintenant, je sais que la bêtise fait partie des choses infinies :oops: )

J'ai donc fait un script qui permet de faire çà.
Attention ! je ne suis pas "bon" en script, je me débrouille comme je peux, donc c'est juste pour info, et c'est sans doute "mal fait", mais çà permet d'atteindre l'objectif, c'est l'essentiel :mrgreen:
Donc, c'est juste à titre indicatif, juste pour partager
Il ne faut pas l'utiliser tel quel, mais l'analyser avant, il y a des choses à améliorer !


Voici le script (il y a quelques commentaires)
#!/bin/bash

echo "";echo "=[debut]======================================";

echo "";
echo "type="$1" (genre nas1 ou nas2)";
echo "pool="$2;
echo "dataset="$3;

echo "faire ctrl-c si pas bon";
read ligne;

sleep 1

# chemin zfs (sans le / devant)
chz=$2"/"$3;
if [ -d /$chz ]
then
# le chemin est bon
echo "pool="$2" dataset="$3" répertoire OK";
else
# le chemin zfs n'est pas bon, on sort
echo "PB param";
exit
fi

# création d'une liste de snapshot (filtrée)
zfs list -H -o name -t snapshot | grep $chz"@" | xargs -n1 >./listsnap;

# on vérifie si il y a au moins 2 snapshots
lgfich=`cat ./listsnap | wc -l`;
if [ $lgfich -lt 3 ]
then
echo "!!! pas assez de snapshots !!! ("$lgfich")";
zfs snapshot $chz@`date +%Y-%m-%d_%Hh%M%S`;
echo "un snapshot a été crée - relancer le script";
exit
else
echo "Nbr de snapshots OK ("$lgfich")";
fi


# on fait un double
cp ./listsnap ./listsnap2;

# on enlève les @ dans la liste2
sed -i -e "s/@/-/g" ./listsnap2;

# on lit la première ligne (dataset@snapshot)
lig1=`sed -n 1p ./listsnap`;
# on lit la première ligne (dataset)
lig1sar=`sed -n 1p ./listsnap2`;

# on lit la deuxième ligne (dataset@snapshot)
lig2=`sed -n 2p ./listsnap`;
# on lit la deuxième ligne (dataset)
lig2sar=`sed -n 2p ./listsnap2`;

echo "";
echo "source..........="$lig1sar;
echo "destinantion....="$lig2sar;
echo "";

# on crée un clone du premier dataset (pour avoir un chemin de destination)
echo "création du clone source";
zfs clone $lig1 $lig1sar && echo "OK";
# on crée un clone du deuxième dataset (pour avoir un chemin de destination)
echo "création du clone destination";
zfs clone $lig2 $lig2sar && echo "OK";
### le but est de faire un rsync du premier snapshot sur le suivant ###

# affichage du rsync;
echo"";
echo "rsync -vrht --stats --progress --del --force --ignore-errors --backup --backup-dir=/rpool/BACKUP_"$1"/"$lig1sar"/ /"$lig1sar"/ /"$lig2sar"/";
rsync -vrht --stats --progress --del --force --ignore-errors --backup --backup-dir="/rpool/BACKUP_"$1"/"$lig1sar /$lig1sar/ /$lig2sar/;

echo "";

# on supprime la source qui a servit à faire le rsync (snapshot+clone)
zfs destroy -R $lig1;
# on supprime uniquement le clone
zfs destroy $lig2sar;

# on montre ce qu'il reste comme datasets (doit toujours être supérieur ou égal à 2)
zfs list | grep $3;

echo "";
echo "=[fin]================================================";


Voilà, de cette façon, je grignote mes datasets et je retrouve les différences de ces derniers dans les répertoires adéquats.

Je vais sans doute améliorer "la chose" avec un réportoire "current" dans la zone de backup-rsync (qui sera la différence entre le dernier snapshot et le dataset), c'est à dire en gros un rsync du dataset(clone) vers snapshot(clone)
soit par un autre script ou un ajout dans le script ci-dessus

Comme je suis du genre à déplacer des "trucs" (ou éventuellement les déplacer et renommer), je mettrai peut-être la zone de backup-rsync en déduplication.
Serveur Intel bi-Xéon P5530 / 8 X Ubuntu Serveur 18.04 LTS - ZFS-BTRFS-bcache / ~30 x PI2b(ARM) sous Nas4Free / et ...(chhhut)... 1 seul Xigmanas :o ... et pas à jour en plus :oops: (çà craint)
Conception d'un "système bizarre" :mrgreen: de "super-devices-autonomes" en NFS gérés par des micro-serveurs SAN(+nas) sous N4F (11 super-devs en raidz3) taille actuelle: 16To / prévue: 64To / théorique: 320To (consommation < 15W en veille - 24/24h) en service depuis 2 ans.

Post Reply

Return to “Français”