snapshot最初实在块设备上实现的,例如san阵列。lvm也支持逻辑卷级别的snapshot。例如如果用san存放oracle的dat文件,在san上设置定时快照策略,例如一天一次或者几个小时一次,这样就相当于定期对数据库做一次备份,与比定期把dat文件全拷贝相比,snapshot的速度快、占用物理存储空间比较少。
快照的技术实现主要是两种方式,COW(copy on write)和ROW(redirect on write)。粗略的对比,COW简单易实现,但是写速度慢,空间利用率低。目前san阵列主流技术是ROW。
文件系统实现snapshot要比块设备复杂很多。主要原因是文件系统的元数据比块设备复杂很多,文件系统元数据的粒度较低。举个简单例子,文件系统需要考虑递归,例如对一个路径做snapshot,其实就是对路径和递归到下层的路径和文件一起做snapshot。 先不考虑递归文件,首先看下如何对单个文件做snapshot。对磁盘文件系统不是很熟悉,讨论下分布式文件系统里面的snapshot。再增加一个约束条件,就是snapshot不支持读写,这样实现会更简单。
分布式文件系统里,单个文件元数据包括三个方面:
fileid+file description,(file id相当于file handle,file description对应于磁盘文件系统里面inode的一些信息,即file feature,例如修改时间,size,属组权限等)
chunkid+chunk description