How we setup Rsync-powered Incremental Backups


Published on

Published in: Technology
1 Comment
  • Very interesting solution. Thanks for sharing!
    Out of curiosity.. any reason why you have disabled saving the powerpoint/pdf ?
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • TTP Conference 2011 – Celebrating 25 years of supporting Novell Solutions
  • According to the man page, --link-dest hard links to files in the link destination when the backup is the same as the source. (ie. identical files).
  • We set our link dest to current, a symbolic link always pointing to the current backup, then preform the backup. Next we set our current link to the latest backup and delete backups older than 30 days.
  • This is how we backed up a Netware server using NCP.
  • ..and a Windows one, using CIFS.
  • This is a screenshot of alpine-backup's code. As you can see, it is quite similar to our bash scripts, but adds error checking and is written in PHP. If you want to have a look at alpine-backup, the URLs are on the bottom.
  • This what our backup directory looks like. As you can see, only the first backup is large, the rest are quite small, only about 200MB large.
  • This an example of the configuration file format alpine-backup uses. It is an INI file. (I used this format because PHP had a built-in parser for it.)
  • This what our mount drivers look like. This particular one actually stops and restarts services for backup. (We use it for iPrint backups.)
  • Here is a screenshot of the mail we get from cron. As you can see from the summary, the backups are all successful!
  • This is a diagram of Selkirk College's organizational structure. All our servers are backed up in at least two locations. As you can see, there are two islands: the Nelson-centric one and the Castlegar-centric one. This is due to the fact that there are no fibre links between Castlegar and Nelson.
  • ...about half. (we sometimes use different parameters for our main and offsite backups.)
  • At this point I'd like to show you our first demo: How no-change syncing works. QNAP doing a Live Backup
  • QNAP in Slave Mode
  • Well, this does not explain much, let's have a look at
  • The first two commands SSH into our GroupWise server and use the perl scripts to create and activate a snapshot. Then we mount the snapshot and perform the backup via SSH.
  • Now, I'm going to move on to our next demo. Live Post Office
  • We start up the POA using an a backup.
  • ..and now: some old mail.
  • alp-dbrestore does not like dashes in DB Names.
  • Next, I'm going to show you how we restore our MySQL backups. First, we create test article.
  • Then, we create a new DB with an old version of the site. (Avoid dashes in database name)
  • We switch Drupal to the restore DB.
  • The article has now been rolled back.
  • This is a screenshot of our Oracle backups in action. Since we're running early, I'm going to show you what alpine-backup's code is like.
  • Any Questions? TTP Conference 2011 – Celebrating 25 years of supporting Novell Solutions
  • How we setup Rsync-powered Incremental Backups

    1. 1. <ul>TTP Conference 2011 </ul><ul>Celebrating 25 years of supporting Novell Solutions </ul>
    2. 2. Rsync Backups <ul>How we set up rsync powered incremental backups for Linux. </ul>Nicholas and Nick Paun
    3. 3. The Plan <ul><li>Because our obsolete tape backups were very slow, unreliable and hard to manage, we decided to go hard disk.
    4. 4. We needed to be able to keep the backups for at least 30 days.
    5. 5. The only way we could do this is by using incremental backups.
    6. 6. After ruling out large, expensive proprietary systems, we chose rsync . </li></ul>
    7. 7. About rsync <ul><li>Using -- link-dest , rsync can make incremental backups look like full ones without wasting any disk space by using hard links. This makes for easy restoring!
    8. 8. Because of rsync 's algorithm we do not transmit the full data over the network (except for the first time.)
    9. 9. Rsync is very reliable and rarely breaks due to file changes. </li></ul>
    10. 10. Version 1: The Scripts <ul><li>Our scripts were based on some heavily tweaked examples on the rsync site.
    11. 11. These simple scripts had no error checking, but they worked very well!
    12. 12. We needed to backup Netware servers too, so we used NCP mounting , which was very slow. </li></ul>
    13. 13. The Scripts echo &quot;Here we rsync DATA volume on CASADMLX server to /bkup/casadmlx/DATA/ folder on CASARKLX server&quot; rsync -av --link-dest= /bkup/casadmlx/DATA/current root@casadmlx:/media/nss/DATA/ /bkup/casadmlx/DATA/ $date rm /bkup/casadmlx/DATA/current ln -s /bkup/casadmlx/DATA/ $date /bkup/casadmlx/DATA/current rm -r /bkup/casadmlx/DATA/ `date --date='30 days ago' +%F`
    14. 14. The Scripts echo &quot;Here we rsync DATA volume on CASADM server to /bkup/casadm/DATA/ folder on CASARKLX server&quot; ncpmount -S casadm -A casadm -U .bkup.cs.users.selkirk -P provo /mnt/casadm/ rsync -av --link-dest= /bkup/casadm/DATA/current /mnt/casadm/DATA/ /bkup/casadm/DATA/ $date rm /bkup/casadm/DATA/current ln -s /bkup/casadm/DATA/ $date /bkup/casadm/DATA/current rm -r /bkup/casadm/DATA/ `date --date='30 days ago' +%F` umount /mnt/casadm/
    15. 15. The Scripts echo &quot;Here we rsync INSTRUCTORS volume on FS1 server to /bkup/fs1/INSTRUCTORS/ folder on CASARKLX server&quot; mount.cifs //fs1/INSTRUCTORS /mnt/fs1/ -o user=Administrator,pass=provo rsync -av -e 'ssh -p7774' --link-dest= /bkup/fs1/INSTRUCTORS/current /mnt/fs1/INSTRUCTORS/ /bkup/fs1/INSTRUCTORS/ $date rm /bkup/fs1/INSTRUCTORS/current ln -s /bkup/fs1/INSTRUCTORS/ $date /bkup/fs1/INSTRUCTORA/current rm -r /bkup/fs1/INSTRUCTORS/ `date --date='30 days ago' +%F` umount /mnt/fs1/
    16. 16. Version 2: alpine-backup <ul><li>Eventually we decided that we needed a proper backup system.
    17. 17. We wanted to have good error checking, replication, reporting and central control.
    18. 18. We also wanted to actually understand what was going on and we wanted a system that would fit our exact needs. So we wrote our own. </li></ul>
    19. 19. Version 2: alpine-backup <ul><li>After learning PHP programming and experimenting for awhile, I wrote alpine-backup , our current backup solution.
    20. 20. We decided to implement only the bare-minimum that we needed.
    21. 21. The result was a 100-line script that supports custom mount drivers and performs an incremental backup using rsync . </li></ul>
    22. 22. alpine-backup function  backup ( $opt , $src , $dest , $date , $name )  {    $_opt  =  OPTIONS ;    passthru ( &quot;rsync  $_opt   $opt  --link-dest  $dest /current  $src   $dest / $date &quot; , $return );   if ( $return  !=  0 )    {     echo( &quot;* Backup Failure ( $name ): rsync did not finish sucessfully.n&quot; );     die( 1 );    }      unlink ( &quot; $dest /current&quot; );    symlink ( &quot; $dest / $date &quot; , &quot; $dest /current&quot; );   echo( &quot;* Backup Successful:  $name n&quot; );  } <ul><ul><li>Website:
    23. 23. Google Code: </li></ul></ul>
    24. 24. Our backup directory
    25. 25. Configuration files ;; silvoes2lx backup config ;; September 2010 -- Nicholas Paun [APPS] source = &quot;root@silvoes2lx:/media/nss/APPS/&quot; dest = &quot;/bkup/silvoes2lx/APPS&quot; opt = &quot;-e 'ssh -p7774'&quot; delete_after = &quot;+30&quot; [HOME] source = &quot;root@silvoes2lx:/media/nss/HOME/&quot; dest = &quot;/bkup/silvoes2lx/HOME&quot; opt = &quot;-e 'ssh -p7774'&quot; delete_after = &quot;+30&quot;
    26. 26. Mount Drivers function  mountfs ( $user , $server , $command )   {     $return  =  passthru ( &quot;ssh  $user @ $server   ' $command   stop'&quot; );     return(! $return );   } function  umountfs ( $user , $server , $command )   {     $return  =  passthru ( &quot;ssh  $user @ $server   ' $command   start'&quot; );     return(! $return );   }
    27. 27. Logging
    28. 28. Experiments <ul><li>We setup offsite mirroring
    29. 29. Experimented with rsync daemons
    30. 30. We used batch files for replication
    31. 31. We ran rsync on cygwin (too slow.)
    32. 32. Backed up Windows servers via CIFS mounting
    33. 33. We setup Groupwise backups
    34. 34. We also started iPrint backups </li></ul>
    35. 35. Syncing using Batch Files <ul><li>Batch files allow you to send the same file list to multiple backup servers at once. </li><ul><li>ie. mirroring, replication, etc. </li></ul><li>We used them to sync our backups between 2 campuses.
    36. 36. This was our first attempt at offsite backups.
    37. 37. It had a drawback of losing sync if files had changed in between batches. </li></ul>
    38. 38. Syncing using Batch Files <ul><li>The first command uses --write-batch to create a batch file.
    39. 39. The second one uses --read-batch to perform the backup.
    40. 40. rsync -av --write-batch=SCRATCH.batch --link-dest=/bkup/caslablx/SCRATCH/current /mnt/caslablx/SCRATCH/ /bkup/caslablx/SCRATCH/$date
    41. 41. ssh n10arklx rsync -av --read-batch=- --link-dest=/bkup/caslablx/SCRATCH/current /bkup/caslablx/SCRATCH/$date <SCRATCH.batch </li></ul>
    42. 42. Offsite Backups <ul><li>The college bought 5 QNAPs, for offsite backups.
    43. 43. The QNAPs are NASs running some mystery meat Linux, that was the source of many headaches.
    44. 44. Initially, we added more configuration files that would copy the backups from the main backup server to the offsite one, but this grew quite complicated. </li></ul>
    45. 45. Selkirk College Backup System
    46. 46. No-change Syncing <ul><li>So, we came up with a better idea: the configuration files would not be modified, and still point at the real backup server.
    47. 47. But, when a QNAP reads the configuration files, it would run in slave mode and pull the backups from the backup server, instead of the live server.
    48. 48. This change removed the need for half of our configuration files. </li></ul>
    49. 49. Demo: No-change Syncing
    50. 50. Demo: No-change Syncing
    51. 51. GroupWise Backups <ul><li>Because dbcopy was slow and inefficient for backups, we decided to snapshot our GroupWise volumes.
    52. 52. This means that we can apply rsync 's deduplication ( --link-dest ) to GroupWise too.
    53. 53. We save 90-95% disk space and it is 10 times faster compared to a full backup. </li></ul>
    54. 54. GroupWise Backups <ul><li>As an added benefit, GroupWise and FS backups can now be handled by the same tool.
    55. 55. To snapshot NSS volumes we used Dean Giles' perl scripts (found on Cool Solutions).
    56. 56. If we ran GroupWise on an LVM volume, we could use LVM snapshots instead. </li></ul>
    57. 57. GroupWise Mount Driver function  mountfs ( $user , $server , $command )   {     $return  =  passthru ( &quot;; );     return(! $return );   } function  umountfs ( $user , $server , $command )   {     $return  =  passthru ( &quot;; );     return(! $return );   }
    58. 58. <ul>ssh casgrplx perl /usr/local/bin/ /dev/evms/CASGRPLXPOOL sdb 200000000 CASGRPLXPOOL_S1 ssh casgrplx perl /usr/local/bin/ CASGRPLXPOOL_S1 ssh casgrplx mount GRPWISE_SV /media/nss/GRPWISE_SV -t nssvol -o rw,name=GRPWISE_SV </ul>
    59. 59. Demo: GroupWise PO Restore
    60. 60. Demo: GroupWise PO Restore
    61. 61. Demo: GroupWise PO Restore
    62. 62. MySQL Backups <ul><li>We wanted to incrementally backup a database, but still use native dumping tools.
    63. 63. So we added a MySQL agent to our tools.
    64. 64. To gain maximum space savings, we split up the SQL files into one file per table.
    65. 65. Now we can use rsync 's --link-dest feature on our DBs too. </li></ul>
    66. 66. MySQL Backups <ul><li>This is the the command we use to backup databases </li></ul>mysql -p password db -e 'show tables' | grep -v 'Tables_in_' #show all tables in database mysqldump -p password --skip-dump-date db $table > $dumpdir/$table #create a dump of each individual table (with no timestamp, for linking) find $dumpdir -exec touch -d 2010-04-01 {} ; #touch dumps to a consistent date (for linking)
    67. 67. Demo: Drupal DB Restore
    68. 68. Demo: Drupal DB Restore
    69. 69. Demo: Drupal DB Restore
    70. 70. Demo: Drupal DB Restore
    71. 71. Oracle Backups <ul><li>One day, we got a user request to set up Oracle backups on a Windows server.
    72. 72. We had never seen an Oracle database before, so we did some searching and figured out how to use expdp.
    73. 73. First we logged in to the database and set up a directory handle:
    74. 74. CREATE DIRECTORY sgrcdev AS '/g/sgrcdev' ; </li></ul>
    75. 75. Oracle Backups <ul><li>Next, we use cygwin to run expdp on the server:
    76. 76. expdp system/$passwd@$db directory=$db full=y dumpfile=$db.dmp logfile=$db.log
    77. 77. … And then, we just copy the backups over and reset dump directory. </li></ul>
    78. 78. Oracle Backups
    79. 79. Conclusion <ul><li>In 2007, we didn't have a real backup, even if we bought an enterprise solution.
    80. 80. Now, we can control all of our backups (FS, GroupWise and Database) from one place, using one lightweight tool.
    81. 81. We save a lot of disk space by using rsync .
    82. 82. Most importantly, we achieved peace of mind. </li></ul>
    83. 83. <ul>TTP Conference 2011 </ul><ul>Celebrating 25 years of supporting Novell Solutions </ul>