I used to use a homebrew script that implemented rsync/snapshots (that is, rsync data to a directory on another server, then "cp -al" all files to create hard links into a directory called "server-datestamp-weekly" (or daily, monthly, etc).
After running into scaling issues (esp. when needing to find a specific file that I didn't have a date or server name), I wrote (and open-sourced) Snebu. This works effectively like rsync/snapshots, but it stores the file metadata in an sqlite database (so there is very little setup complexity / maintanence), and individual files are stored compressed in a vault directory, named by the SHA1 checksum of the file. This gets cross server file-level deduplication for free. This is somewhat similar to how git stores files.
Just recently posted a 1.0 release, although I need to improve the documentation a bit and post a few more front-end scripts (and finish the in-app help pages). But would love to get some feedback on it.
The site is www.snebu.com if you are interested (this points to the Github-hosted page, the project page is github.com/derekp7/snebu).
For data retention, I keep daily backups for a couple weeks, weekly backups for 6 weeks, monthlys for a year, and yearlys for as long as I have space.