Linux, in good Unix tradition, is designed to build things in pieces, which can work together. A number of Linux filesystems are designed to be layered on top of other filesystems. One such filesystem is the distributed, fault-tolerant Glusterfs (http://www.gluster.org/). You should be able to layer it on top of a number of other filesystems which can do versioning or snapshots (e.g. ZFS or Btrfs).