Script de sauvegarde Rsync à distance

Script de sauvegarde Rsync à distance - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 01-04-2013 à 22:31:02    

Bonjour à tous,
 
Je suis entrain de mettre en place un système de sauvegarde des données de mon NAS vers un NAS distant hébergé chez un ami et réciproquement pour ses données. Le tout est basé sur rsync, j'ai écrit un bout de script pour gérer le tout mais c'est un peu mon premier script. Etant donné qu'il s'agit quand même d'une application "sensible" pour l'intégrité des données, j'aimerai savoir si je me suis complètement planté ou non.
 
Désolé, ça va faire une grosse page de code balancée comme ça mais j'ai commenté un maximum pour m'y retrouver.
 
Le principe de base est en gros de faire des snapshots : je fais de l'incrémental pour récupérer les données modifiées entre 2 sauvegardes, le reste est constitué de lien en dur.
 

Code :
  1. #!/bin/bash
  2. # Version 2.2 - sauvegarde_nuit
  3. #
  4. #-------------------------------------------------------------------------------------------------------------------------------------------#
  5. # SYNCHRONISATION DISTANTE DES DONNES PAR RSYNC ENTRE 2 NAS
  6. #
  7. #Il créé un fichier flag, témoin de son lancement, puis démarre une sauvegarde miroir depuis une machine distante vers celle qui l'héberge
  8. #Lors du démarrage, il contrôle la présence du fichier flag, si celui ci est présent c'est qu'une synchro rsync est déjà en cours,
  9. #on la stoppe avec le signal SIGUSR1 (code retour 19 de rsync). Ceci fermera également le script qui l'a lancé
  10. #
  11. #Le script lance ensuite un "dry run" pour tester la connexion et lister le volume de données à envoyer. Les stats sont envoyées dans le
  12. #fichier de flag. Si tout s'est bien passé on lance la synchronisation réelle : d'abord mise à jour des dossiers puis des fichiers
  13. #
  14. #En cas d'erreur de rsync ou de sauvegarde de la veille non terminée, on envoie un mail pour alerter l'administrateur
  15. #En cas de bonne exécution, le fichier flag est transformé en fichier log dans le dossier de la sauvegarde
  16. #
  17. #Le script utilise une version patchée de rsync incluant l'option --detect-renamed pour ne pas retransférer des fichiers renommés ou
  18. #déplacés
  19. #-------------------------------------------------------------------------------------------------------------------------------------------#
  20. #VARIABLES ET CONFIGURATION
  21. #**********************************************************************************
  22. #Variables modifiables :
  23. DOSS_SCRIPT="/mnt/pool_sauv_distante_mickael/Scripts"  #Dossier abritant ce script
  24. NOM_FLAG="flag_nuit"          #Nom du fichier "flag" (sans extension)
  25. EXTENSION=".log"           #Extension à ajouter aux fichiers logs générés
  26. DOSSIER_SOURCE="/mnt/Tank/"         #Dossier source à sauvegarder
  27. NAS_DISTANT=192.168.0.2          #Adresse du serveur source
  28. PORT=22             #Port du service ssh serveur source
  29. USER="Toto"             #Nom d'utilisateur source
  30. CIBLE="/mnt/pool_sauv_distante_toto/Sauvegardes"   #Dossier de destination des sauvegardes (un dossier par date est créé ensuite à l'intérieur)
  31. USER_CIBLE="toto2"          #Nom d'utilisateur serveur destination
  32. EXCLUS="/mnt/pool_sauv_distante_toto/Scripts/liste.txt" #Liste des fichiers et dossiers à exclure de la sauvegarde
  33. BP_LIMITE=100            #Bande passante maximale en ko/s.   0 = pas de limite
  34. #Configuration :
  35. MAIL_SUCCES=1       #Mettre à 0 pour ne pas recevoir le rapport de sauvegarde par mail en cas de succès. Aucune influence sur les rapports d'erreur
  36. #FIN DES VARIABLES ET DE LA CONFIGURATION, NE PAS MODIFIER PLUS BAS
  37. #*******************************************************************************************************************************************
  38. # La fonction envoi_mail gère l'ajout des textes explicatifs et l'envoi des mails aux utilisateurs
  39. #elle a peu d'interêt ici, je vous l'épargne
  40. # La fonction copie_liens permet de créer au début de la sauvegarde l'image précedente en faisant une copie de la
  41. #sauvegarde N-1 par des liens en durs, cette copie sera ensuite exploitée par rsync pour la mettre à jour.
  42. # L'utilisation de ce système à la place de l'option --link-dest de rsync permet d'utiliser l'option --detect-renamed de
  43. #rsync
  44. #----------------------------------------------------------------------------------------------------------------------
  45. function copie_liens()
  46. {
  47. cp -alL $CIBLE/courante $CIBLE/000_$date_jour 2>> $flag   #copie (liens durs) de la sauvegarde courante. Sert de base et est mise à jour ensuite
  48. echo -e '\nCopie image courante terminée...' >> $flag
  49. }
  50. # La fonction lien_courante permet de mettre à jour le lien symbolique "courante" sur la sauvegarde distante
  51. # qui pointe vers la sauvegarde actuelle (c'est l'image courante)
  52. # La fonction reçoit un argument qui est le dossier à lier au dossier "courante"
  53. #----------------------------------------------------------------------------------------------------------------------
  54. function lien_courante()
  55. {
  56. rm -rf $CIBLE/courante 2>> $flag       #Suppression du dossier de la sauvegarde courante...
  57. ln -s $CIBLE/$1 $CIBLE/courante 2>> $flag     #... et recréation (en fait un simple lien vers la sauvegarde du jour)
  58. }
  59. # La fonction rotation_sauvegardes permet d'incrémenter le numéro des dossiers contenant les sauvegardes en conservant la date, par
  60. # exemple : 005_2012-12-12 est renommé en 006_2012-12-12. La sauvegarde numero 999 est supprimée.
  61. # Cette fonction supprime également les sauvegardes incompletes (nom de dossier se terminant par _incomplete) à partir de la 25eme sauvegarde
  62. function rotation_sauvegarde()
  63. {
  64. if ls $CIBLE/999_* > /dev/null 2>&1; then    #suppression de la sauvegarde numéro 999 si elle existe
  65. echo "suppression de la sauvegarde 999" >> $flag
  66. rm -rf $CIBLE/999_* 2>> $flag
  67. fi
  68. for i in {999..0}          #boucle de 999 à 0
  69. do
  70. ichaine=$(printf "%.3d" $i)       #génère le numéro de sauvegarde sur 3 chiffres
  71. if [ $i -gt 25 ] && find $CIBLE/${ichaine}_*_incomplete -maxdepth 0 > /dev/null 2>&1; then #à partir de la 25eme sauvegarde (et après) on teste si c'est une incomplète
  72.  echo "suppression de la sauvegarde incomplète ${ichaine}" >> $flag
  73.  rm -r $CIBLE/${ichaine}_*_incomplete 2>> $flag #si c'est une incomplète, on la supprime
  74. fi
  75. if ls $CIBLE/${ichaine}_* > /dev/null 2>&1; then #test de l'existence de la sauvegarde n
  76.  for k in $CIBLE/${ichaine}_*; do    #si existe on récupère son nom complet (avec chemin et date)
  77.   let j=$i+1         #génére le numéro n+1 sur 3 chiffres
  78.   j=$(printf "%.3d" $j)
  79.   k=${k#${CIBLE}/}       #supprime la partie chemin du nom de sauvegarde
  80.   mv $CIBLE/$k $CIBLE/${j}${k#$ichaine} 2>> $flag  #renomme la sauvegarde n en n+1
  81.  done
  82. fi
  83. done
  84. }
  85. # La fonction suppression sauvegarde permet de supprimer les anciennes sauvegardes en en gardant 1 seule par interval défini. Elle reçoit
  86. # 3 paramètres : une butée haute, une butée basse et un interval (dans cet ordre). La série entre les deux butées est divisées en intervals
  87. # de la longueur définie par le paramètre interval puis une seule sauvegarde est conservée dans celui ci.
  88. #Note : si la longueur de la série entre les butées n'est pas divisible par l'interval, le reste ne correspondant pas à un interval complet est
  89. #ignoré (ex : de 100 à 75 par pas de 10 : on garde une sauvegarde entre 100 et 91, une entre 90 et 81 mais rien n'est supprimé entre 80 et 75
  90. #-----------------------------------------------------------------------------------------------------------------------------------------------
  91. function suppression_sauvegardes()
  92. {
  93. let start=$1       # initialise la première boucle avec la butée haute passée en paramètre
  94. let stop=$start-$3+1     # initialise la première boucle avec le calcul de stop (start-pas+1)
  95. let fin=$2        # récupère la butée basse en paramètre n°3
  96. while [ $stop -ge $fin ]    # Cette boucle génère les bornes entre les butées hautes, basses et avec l'interval passé en paramètre
  97. do
  98. f=0         #initialise le flag
  99. for ((i=$start;i>=$stop;--i))  #boucle entre les bornes start - stop
  100. do
  101.  ichaine=$(printf "%.3d" $i)
  102.  if ls $CIBLE/${ichaine}_* > /dev/null 2>&1; then  #teste si on a une sauvegarde qui porte ce numéro
  103.   if [ $f -eq 0 ]; then        #si on en a une on regarde si c'est la première
  104.    let f=1           #si oui, on positionne le flag pour dire qu'on en a une
  105.   else
  106.    k=$(find $CIBLE/${ichaine}_* -maxdepth 0)
  107.    echo "suppression de la sauvegarde "${k#${CIBLE}/} >> $flag #si ce n'est pas la première, on la supprime
  108.    rm -r $CIBLE/${k#${CIBLE}/} 2>> $flag
  109.   fi
  110.  fi
  111. done
  112. let start=$stop-1     #calculs prochaine bornes
  113. let stop=$start-$3+1
  114. done
  115. }
  116. #Programme principal, contrôle l'état actuel, prépare le dossier de sauvegarde, lance une analyse (dry-run rsync),
  117. #puis copie l'arborescence des dossiers (sans supprimer les anciens) afin de permettre le bon fonctionnement de --detect-renamed
  118. #en cas de fichiers déplacés ou dossiers renommés et enfin lance la sauvegarde effective des fichiers.
  119. #Inclus le contrôle des codes retour des fonctions principales pour s'assurer de la bonne exécution.
  120. #----------------------------------------------------------------------------------------------------------------------
  121. flag=$DOSS_SCRIPT/$NOM_FLAG$EXTENSION         #définition du fichier de flag
  122. SOURCE=$USER@$NAS_DISTANT:$DOSSIER_SOURCE
  123. #Si il y a encore un fichier flag => la synchro de la veille n'est peut être pas terminée
  124. if [ -e $flag ]; then
  125. pkill -SIGUSR1 -f -u $USER_CIBLE rsync        #ferme Rsync avec le signal SIGUSR1 (le signal est testé par le script de la veille et lui signal de se fermer également)
  126. sleep 120               #Tempo 120 secondes
  127. date_veille=$(head -n 1 $flag | cut -c15-)       #récupère la date sauvegarde précédente (dans 1ere ligne du fichier flag)
  128. if [ -e $DOSS_SCRIPT/log/$date_veille-incomplete$EXTENSION ]; then  #teste l'existence d'un fichier date-incomplète dans les logs correspondant à la sauvegarde ci dessus
  129.  envoi_mail 1
  130.  rotation_sauvegarde            #effectue la rotation des sauvegardes (renommage n en n+1)
  131.  lien_courante 001_$date_veille         #met à jour le lien pour que le dossier "courante" pointe vers la sauvegarde précédente(incomplète)
  132. else
  133.  envoi_mail 2             # mail sauvegarde non terminée cause arrêt NAS ou plantage script => ne pas lier courante, sauvegarde non fiable
  134. fi
  135. fi
  136. date_jour=$(date +%Y-%m-%d)                  #Enregistrement date du jour
  137. #Effacement et reCréation du fichier de flag :
  138. echo 'SAUVEGARDE DU '$date_jour > $flag               #NE PAS MODIFIER CETTE LIGNE
  139. #Création du dossier de sauvegarde du jour : on recopie en liens l'image courante :
  140. copie_liens
  141. #on commence par un lancement de rsync en mode dry run pour lister dans le fichier de flag les fichiers à synchroniser (uniquement pour les statistiques)
  142. echo -e 'Début analyse du volume à '$(date +%H:%M:%S) >> $flag
  143. echo -e 'Rapport analyse, à synchroniser ce soir :\n----------------------------------------------' >> $flag
  144. $DOSS_SCRIPT/rsync -ahzn -e "ssh -p "$PORT --stats --timeout=60 --delete --exclude-from=$EXCLUS $SOURCE $CIBLE/000_$date_jour >> $flag 2>&1
  145. retval=$?                      #enregistre le code retour de rsync
  146. if [ $retval -ne 0 ]; then                 #contrôle du code  retour
  147. #si erreur (clés ssh, connexion, serveur distant éteind, indisponible, ...)
  148. echo -e '\nErreur d execution. Suppression du dossier 000_'$date_jour >> $flag
  149. rm -r $CIBLE/000_$date_jour >> $flag 2>&1
  150. envoi_mail 3
  151. mv $flag $DOSS_SCRIPT/log/$date_jour-erreur$EXTENSION          #déplacement du flag dans le dossier des log et renommage
  152. exit
  153. fi
  154. #Copie de l'arborescence des dossiers uniquement (ordre des includes/exclude important, pas de --delete)
  155. echo -e '\nDébut mise à jour arborescence à '$(date +%H:%M:%S) >> $flag
  156. $DOSS_SCRIPT/rsync -ahz -e "ssh -p $PORT" --timeout=60 --exclude-from=$EXCLUS --include='*/' --exclude='*' $SOURCE $CIBLE/000_$date_jour >> $flag 2>&1
  157. retval=$?                      #enregistre le code retour de rsync
  158. if [ $retval -ne 0 ]; then                 #contrôle du code  retour
  159. #si erreur (clés ssh, connexion, serveur distant éteind, indisponible, ...)
  160. echo -e '\nErreur d execution. Suppression du dossier 000_'$date_jour >> $flag
  161. rm -r $CIBLE/000_$date_jour >> $flag 2>&1
  162. envoi_mail 5
  163. mv $flag $DOSS_SCRIPT/log/$date_jour-erreur$EXTENSION          #déplacement du flag dans le dossier des log et renommage
  164. exit
  165. fi
  166. echo -e 'Mise à jour arborescence terminée à '$(date +%H:%M:%S) >> $flag
  167. #Lancement de la synchro réelle :
  168. echo -e '\n\nDébut de sauvegarde à '$(date +%H:%M:%S) >> $flag
  169. echo -e 'Rapport de sauvegarde :\n----------------------------------------------' >> $flag
  170. $DOSS_SCRIPT/rsync -ahz -e "ssh -p $PORT" --stats --delete --delete-excluded --detect-renamed --timeout=60 --bwlimit=$BP_LIMITE --partial --partial-dir="tempRsync" --exclude-from=$EXCLUS $SOURCE $CIBLE/000_$date_jour >> $flag 2>&1
  171. retval=$?                      #enregistrement et contrôle du code retour
  172. if [ $retval -eq 19 ]; then  #si rsync est quitté avec le code 19 (SIGUSR1) alors copie le flag en log et quitte le script car une nouvelle occurence du script s'est lancée...
  173. cp $flag $DOSS_SCRIPT/log                 #ATTENTION : Pas de mv direct du fichier de flag dans log car l'autre instance du script en a besoin
  174. mv $DOSS_SCRIPT/log/$NOM_FLAG$EXTENSION $DOSS_SCRIPT/log/$date_jour-incomplete$EXTENSION #renommage du fichier flag en log
  175. mv $CIBLE/000_$date_jour $CIBLE/000_${date_jour}_incomplete         #renommage du dossier avec ajout du suffixe "incomplete"
  176. exit
  177. elif [ $retval -eq 0 ]; then #si rsync est quitté normalement, déroulement normal...
  178. echo -e '\nSauvegarde terminée à '$(date +%H:%M:%S)'\nRotation des sauvegardes...'  >> $flag
  179. rotation_sauvegarde                   #Effectue le renommage de toutes les sauvegardes n en n+1 (rotation)
  180. echo 'Rotation terminée, effacement et recréation du dossier de sauvegarde courante...'  >> $flag
  181. lien_courante 001_$date_jour                #Suppression du dossier de la sauvegarde courante et recréation (en fait un simple lien vers la sauvegarde du jour)
  182. suppression_sauvegardes 1000 401 200              #Suppression de quelques anciennes sauvegardes avec une répartition variable selon l'ancienneté
  183. suppression_sauvegardes 400 131 30
  184. suppression_sauvegardes 130 41 10
  185. envoi_mail 9
  186. mv $flag $DOSS_SCRIPT/log/$date_jour$EXTENSION            #...déplace et renomme le fichier flag dans les logs
  187. elif [ $retval -ne 0 ]; then #si on a une erreur autre :
  188. echo -e '\nErreur d execution. Suppression du dossier 000_'$date_jour >> $flag
  189. rm -r $CIBLE/000_$date_jour >> $flag 2>&1
  190. envoi_mail 4
  191. mv $flag $DOSS_SCRIPT/log/$date_jour-erreur$EXTENSION          #déplace le fichier de flag dans le dossier des logs et le renomme
  192. exit
  193. fi


 
Ça fait un gros pâté  :sweat: , pas moyen de colorer sur le forum ?
 
Merci à vous en tout cas !  :)
 
Edit : coloration des commentaires pour essayer de gagner en lisibilité


Message édité par the_matrix_has_you le 02-04-2013 à 10:49:10
Reply

Marsh Posté le 01-04-2013 à 22:31:02   

Reply

Marsh Posté le 01-04-2013 à 23:21:47    

Code :
  1. pour colorer il faut sélectionner chaque portion


 
Pour ma part, c'est plus le comportement de tes sauvegardes qui me chagrine un peu : tu fais quoi là exactement ? [:transparency]  
Le tout c'est d'adapter tes roulements de sauvegardes suivant l'utilisation et la durée de rétention désirée... 999 sauvegardes ça te ferait quoi, sur 3 ans en journalier ? :pt1cable:  
 
Sur ton NAS tu as un cron de disponible ? Si oui tu pourrais déjà largement simplifier en utilisant un appel du genre :

MAILTO="sauvegardes@hfr-mail.org"
#minute hour mday month year command
0 5 1/7 * * sh /mon/script/backup_rsync_T.sh
0 5 2/7 * * sh /mon/script/backup_rsync_D.sh 1
0 5 3/7 * * sh /mon/script/backup_rsync_D.sh 2
0 5 4/7 * * sh /mon/script/backup_rsync_D.sh 3
0 5 5/7 * * sh /mon/script/backup_rsync_D.sh 4
0 5 6/7 * * sh /mon/script/backup_rsync_D.sh 5
0 5 7/7 * * sh /mon/script/backup_rsync_D.sh 6


variable MAILTO : les données de résultat du cron seront envoyé à cette adresse.
backup_rsync_T.sh -> un script de sauvegarde total
backup_rsync_D.sh -> un script de sauvegarde différentielle par rapport au précédent total enregistré, pour savoir le dossier du jour prendre la variable ajoutée dans le cron après l'appel du script [:spamatounet]  
 
Suivant la place (en exemple de cron, 5h du mat) :
- 1 journalière, rétention de 7 jours <- cron sait faire ! (0 5 * * *)
- 1 hebdomadaire, rétention de 3 semaines <- cron sait faire ! (0 5 1/7 * *)  
- 1 mensuelle, rétention de 6 mois <- cron sait faire ! (0 5 * 1,7 *)
- 1 annuelle, rétention comme tu le veux, mais externalisée sur un autre support (bluray par exemple)
 
Là ton script est intéressant, mais trop complexe à mon goût. Un exemple plus simple serait pour moi ceci, avec 3 types de fichiers de conf différents (journalière, hebdo, mensuelle)


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 02-04-2013 à 10:15:53    

Ce que je fais c'est une sauvegarde quotidienne qui part dans un dossier qui s'appelle 000 puis tous les jours je fais une rotation du dossier (fait par la fonction rotation_sauvegarde() ligne 82)
000 -> 001, 001-> 002, etc... ce qui permet de remonter dans le passé à volonté.
 
Comme tu le soulignes, l'intérêt de remonter diminuant avec le temps et pour gagner de l'espace, je fait un tri : toutes les sauvegardes de 000 à 040 sont gardés puis j'en garde 1 sur 10 entre 40 et 130, puis 1 sur 30 et 1 sur 200 à partir de la 400ème. Ceci est géré par la fonction suppression_sauvegardes() ligne 113 avec les appels paramétrables en 213, 214 et 215
 
Ici c'est pour une sauvegarde distante via internet, j'ai donc essayer de prendre en compte toutes les contraintes : économie maximum de la bande passante, gestion du risque de déconnexion, arrêt impromptu d'une des deux machines, le tout en restant 100% automatique. Du coup ça alourdi forcément un peu.


---------------
www.durindel.fr : info, aéro, photo
Reply

Marsh Posté le 04-04-2013 à 15:25:51    

En fait je fais une sorte de sauvegarde incrémentale mais en gardant sur la sauvegarde distante une certaine consistance puisque tous les fichiers inchangés sont remplacés par des liens durs. Cela est dicté par le fait que la bande passante en upload étant limitée je ne peux pas faire de différentielle ni me permettre de refaire régulièrement une sauvegarde totale.
 
J'ai réfléchi à ta proposition bardiel, si j'ai bien compris cron pourrait remplacer mes fonctions de rotation des sauvegardes et la suppression des plus ancienne selon la répartition spécifique. Le reste du script serait alors presque identique.
 
 
D'autres avis sur la méthode et la façon de coder ? J'aurais peut être du poser des questions plus spécifiques sans balancer tout le script qui fait peur en fait  :D

Reply

Marsh Posté le 05-04-2013 à 09:46:14    

rsnapshot


---------------
"Your god is too small", Giordano Bruno, 1548 - 1600
Reply

Marsh Posté le 06-04-2013 à 12:09:16    

Hello !
 
Je suis un utilisateur régulier de rsync, c'est un outil très puissant.
 
Si j'ai bien compris ce que tu veux faire : faire un mirror d'un NAS vers un autre ou plutôt une synchro dans les deux sens ?
 
Pourquoi vouloir gérer des backup temporel puisqu'avec la sync (ou le mirror) tu aura une sauvegarde distante ?


---------------
Dell 17R-SE / HTPC 3770K / Domotique DIY / Volumio DAC Rpi3 / Recalbox v4 Rpi3 / Citroen 2CV6 Special E
Reply

Marsh Posté le 06-04-2013 à 22:10:00    

Alors en résumé : j'ai un NAS à Orléans et un disque dans le NAS d'un ami à Toulouse. Je veux faire un backup quotidien de mon NAS vers le siens.
 
Ce n'est ni plus ni moins qu'un miroir, sauf que je veux pouvoir conserver l'historique pour retrouver un éventuel vieux fichier supprimé ou corrompu entre temps.
 
Pour moi la partie "temporelle" du script : la rotation des sauvegarde et la suppression non linéaire ne m'ont pas posés de soucis.  
 
Là où je me demande si c'est bien propre c'est plutôt sur la gestion du cas où le script de la veille n'a pas terminé la sauvegarde. J'explique : je ne peux avoir sur mon ADSL que 125ko/s en upload, je limite rsync à 100ko par exemple et déclenche par cron une sauvegarde quotidienne à minuit. S'il y a + de 6Go à transférer, le lendemain à minuit cron va relancer une autre instance du script et un autre rsync et ça colle un bazar monstre.
Du coup je gère ça avec un fichier "flag" qui sert aussi de log et qui reste en place si l'un des NAS s'est éteind au milieu de la synchronisation. Du coup ça permet de gérer le cas de la sauvegarde incomplète ou potentiellement foireuse.
 
 
roscocoltran -> Je ne connaissais pas rsnapshot, ça m'a l'air pas mal du tout. Je vais essayer de tester ça.
Je n'ai pas vu ça dans la doc mais tu sais si jamais il arrive à retrouver un fichier déplacé ou renommé par rapport à la sauvegarde n-1 et du coup à faire un hard link vers celui ci ou si il retransfère la totalité les données ?
J'utilise une version de rsync compilée avec cette modif (--detect-renammed) qui permet d'éviter de renvoyer plusieurs gigas (et donc plusieurs jours d'upload) si un utilisateur renomme le dossier "photo" en "PHOTOS".


---------------
www.durindel.fr : info, aéro, photo
Reply

Marsh Posté le 07-04-2013 à 00:20:45    

the_matrix_has_you a écrit :

Alors en résumé : j'ai un NAS à Orléans et un disque dans le NAS d'un ami à Toulouse. Je veux faire un backup quotidien de mon NAS vers le siens.
 
Ce n'est ni plus ni moins qu'un miroir, sauf que je veux pouvoir conserver l'historique pour retrouver un éventuel vieux fichier supprimé ou corrompu entre temps.
 
Pour moi la partie "temporelle" du script : la rotation des sauvegarde et la suppression non linéaire ne m'ont pas posés de soucis.  
 
Là où je me demande si c'est bien propre c'est plutôt sur la gestion du cas où le script de la veille n'a pas terminé la sauvegarde. J'explique : je ne peux avoir sur mon ADSL que 125ko/s en upload, je limite rsync à 100ko par exemple et déclenche par cron une sauvegarde quotidienne à minuit. S'il y a + de 6Go à transférer, le lendemain à minuit cron va relancer une autre instance du script et un autre rsync et ça colle un bazar monstre.
Du coup je gère ça avec un fichier "flag" qui sert aussi de log et qui reste en place si l'un des NAS s'est éteind au milieu de la synchronisation. Du coup ça permet de gérer le cas de la sauvegarde incomplète ou potentiellement foireuse.
 
roscocoltran -> Je ne connaissais pas rsnapshot, ça m'a l'air pas mal du tout. Je vais essayer de tester ça.
Je n'ai pas vu ça dans la doc mais tu sais si jamais il arrive à retrouver un fichier déplacé ou renommé par rapport à la sauvegarde n-1 et du coup à faire un hard link vers celui ci ou si il retransfère la totalité les données ?
J'utilise une version de rsync compilée avec cette modif (--detect-renammed) qui permet d'éviter de renvoyer plusieurs gigas (et donc plusieurs jours d'upload) si un utilisateur renomme le dossier "photo" en "PHOTOS".


rsnapshot n'est qu'un wrapper autour de rsync. Tu peux indiquer les chemins des binaires que rsnapshot doit utiliser. Tu peux donc lui indiquer le chemin de ta version compilée de rsync.


---------------
"Your god is too small", Giordano Bruno, 1548 - 1600
Reply

Marsh Posté le 14-04-2013 à 17:33:00    

T'as regardé l'option --update de rsync ? Ça n'envoie que si le fichier local est plus récent que le fichier distant (ou si nouveau).
Couplé avec --delete, ça permet de faire un miroir sans abuser de la bande passante.
Et re-coupler avec --backup, les fichiers supprimés à cause du --delete sont mis dans un dossier à part.
 
J'ai un petit script tout simple qui me permet d'avoir un miroir distant d'un dossier, et qui conserve les fichiers supprimés au cours du temps dans des dossiers datés du jour de la backup.

Code :
  1. date=`date +%y_%m_%d`
  2. rsync -abuv --delete --force --progress --stats \
  3.     --backup-dir="/a/b/rsync_delete/$date/"     \
  4.     -e ssh hote_distant:/backup_me/ /a/b/miroir | tee /a/b/log/$date


Dans le dossier /a/b j'ai :
- mon dossier miroir
- un dossier "rsync_delete" qui contient par exemple :
  - un dossier 13_04_07
  - un dossier 13_04_14 qui contient tous les fichiers qui ont été supprimés entre la backup du 07 avril et celle du 14 avril
- un dossier de log avec un log par date, histoire de s'y retrouver parmi tout ce bor*** :) (je l'ai pas mis dans mon script, mais ptèt que je le ferai un jour)
 
Je sais pas si ça t'aide mais ça me semble assez proche de ce que tu veux et c'est plus simple comme ça.
 
Si tu veux faire une rotation, t'as qu'à supprimer à chaque sauvegarde le plus vieux des dossiers de /a/b/rsync_delete :

Code :
  1. byebyedir=`ls /a/b/rsync_delete/ | head -n1`
  2. mv $byebyedir poubelle/

Reply

Marsh Posté le 14-04-2013 à 19:37:29    

the_matrix_has_you a écrit :

Alors en résumé : j'ai un NAS à Orléans et un disque dans le NAS d'un ami à Toulouse. Je veux faire un backup quotidien de mon NAS vers le siens.

fait poser une fibre noire entre ton ami et toi  :o
 
 
j'ai du revoir une soluce de backup pour le boulot qui tournait sur des script rsync homemade. Je trouve que tout le monde réinvente un peu la roue (le backup incremental) avec des script rsync. alors qu'en cherchant bien je pense qu'on peux trouver un truc clean et solide tout fait.
(j'ai trouvé bacula pour ma part, m'enfin ptetr un peu overkill pour ici)

Message cité 2 fois
Message édité par exeral le 14-04-2013 à 19:38:20
Reply

Marsh Posté le 14-04-2013 à 19:37:29   

Reply

Marsh Posté le 22-04-2013 à 10:02:53    

J'ai mis en place ce system pour le back up dans une PME (50 utilisateurs), en interne et en externe. La limitation aujourd'hui c'est le "rm" des hardlink, ça met un temps fou ! :(. Si quelqu'un a une idée pour accèlérer cela. Sinon ça marche très bien depuis plusieurs années, avec un roulement sur 30 jours... Simple, gratuit et efficace, si ce n'est le "rm" à la fin du script qui prend maintenant plusieurs heures :( ! Sous Red Hat.


---------------
Mon projet de coffret multimédia: http://maison2valerie.wordpress.co [...] hapitre-1/
Reply

Marsh Posté le 22-04-2013 à 10:11:21    

exeral a écrit :

fait poser une fibre noire entre ton ami et toi  :o
 
 
j'ai du revoir une soluce de backup pour le boulot qui tournait sur des script rsync homemade. Je trouve que tout le monde réinvente un peu la roue (le backup incremental) avec des script rsync. alors qu'en cherchant bien je pense qu'on peux trouver un truc clean et solide tout fait.
(j'ai trouvé bacula pour ma part, m'enfin ptetr un peu overkill pour ici)


genre un truc mentionné sur ce topic ?


---------------
"Your god is too small", Giordano Bruno, 1548 - 1600
Reply

Marsh Posté le 22-04-2013 à 14:27:36    

exeral a écrit :

j'ai du revoir une soluce de backup pour le boulot qui tournait sur des script rsync homemade. Je trouve que tout le monde réinvente un peu la roue (le backup incremental) avec des script rsync. alors qu'en cherchant bien je pense qu'on peux trouver un truc clean et solide tout fait.


 [:alkatraz] ça, ou encore rdiff-backup

exeral a écrit :

(j'ai trouvé bacula pour ma part, m'enfin ptetr un peu overkill pour ici)


Tout dépend de ce que tu recherches. Même si je réserverais bacula pour gérer la sauvegarde de plusieurs serveurs et/ou clients vers un serveur de sauvegarde.

senado a écrit :

J'ai mis en place ce system pour le back up dans une PME (50 utilisateurs), en interne et en externe. La limitation aujourd'hui c'est le "rm" des hardlink, ça met un temps fou ! :(. Si quelqu'un a une idée pour accèlérer cela. Sinon ça marche très bien depuis plusieurs années, avec un roulement sur 30 jours... Simple, gratuit et efficace, si ce n'est le "rm" à la fin du script qui prend maintenant plusieurs heures :( ! Sous Red Hat.


ça c'est le gros point faible des logiciels de sauvegarde, mais là c'est plus au niveau système de fichiers que cela se joue... avec bacula je m'y étais cassé les dents dessus, et finalement "on" a décidé de faire [:am72] zéro hardlink, bacula mets ses fichiers suivant le FS utilisé pour ne pas faire perdre de temps inutilement au système.
Quand on met 4h pour faire 10Go de sauvegarde quotidienne à cause de ces conneries, autant ne plus s'enquiquiner avec. En 5 minutes c'est plié même si on prend plus de place ainsi.
On peut même s'amuser à faire de la backup "soit-disant" différentielle ainsi avec rsync et des hardlink, mais bon je ne tenterais pas ça sur un serveur de prod où j'ai du fichiers sensibles :o


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 24-04-2013 à 20:41:12    

Backup avec rsync, hard link des fichiers non modifes, suppression des vieux backup apres delais configurable, ... c'est exactement ce que fait Dirvish


Message édité par Gauteng le 24-04-2013 à 20:41:39
Reply

Marsh Posté le 24-04-2013 à 20:50:32    

senado a écrit :

J'ai mis en place ce system pour le back up dans une PME (50 utilisateurs), en interne et en externe. La limitation aujourd'hui c'est le "rm" des hardlink, ça met un temps fou ! :(. Si quelqu'un a une idée pour accèlérer cela. Sinon ça marche très bien depuis plusieurs années, avec un roulement sur 30 jours... Simple, gratuit et efficace, si ce n'est le "rm" à la fin du script qui prend maintenant plusieurs heures :( ! Sous Red Hat.


 
Supprimer les hard link etait beaucoup plus rapide sous XFS que sous ext3.
 
J'ai jamais essaye avec ext4 (enfin si, mais seulement chez moi) car ca fait deja quelques annees que je ne suis plus admin.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed