快照
HDFS快照是一个只读的基于时间点文件系统拷贝。快照可以将失效的集群回滚到之前的一个正常的时间点上。
总览
HDFS 快照是一种只读的特定时间点的文件系统的复制,快照可以对目录或者整个文件系统进行。
作用
- 防止用户的错误操作:管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行回复。
- 备份:管理员可以根据需求来备份整个文件系统,一个目录或者单一一个文件。管理员设置一个只读快照,并使用这个快照作为整个全量备份的开始点。增量备份可以通过比较两个快照的差异来产生。
- 试验/测试: 一个用户当想要在数据集上测试一个应用程序。一般情况下,如果不做该数据集的全量拷贝,测试应用程序会覆盖/损坏原来的生产数据集,这是非常危险的。管理员可以为用户设置一个生产数据集的快照(Readwrite)用于用户测试使用。在快照上的改变不会影响原有数据集。
- 灾难恢复:只读快照可以被用于创建一个一致的时间点镜像用于拷贝到远程站点作灾备冗余。
当对一个目录(或者路径)开启快照功能,那么该目录就成为了一个snapshottable的目录,snapshottable下存储的snapshots最多为65535个,保存在该目录的.snapshots下。对snapshottable的数目没有限制。管理员可以对任何目录设置为snapshottable
如果在snapshottable目录下存在snapshots,那么这个目录不能被重命名也不能被删除。
注意:
1. 快照不是数据的简单拷贝,制作差异的复制。
2. 因为不保存实际的数据,所以快照的生成往往非常的迅速.在HDFS中,如果对其中一个目录比如/A下创建一个快照,则快照文件中将会有与/A目录下完全一样的子目录文件结构以及相应的属性信息,
- 当前版本中不能设置网状的snapshottable目录,换句话说:一个目录不能被设置为snapshottable如果他的父目录或者子目录已经被设置为snapshottable。
实现了:
- Snapshot 创建的时间 复杂度为O(1),但是不包括INode 的寻找时间
- 只有当修改SnapShot时,才会有额外的内存占用,内存使用量为O(M),M 为修改的文件或者目录数
- 在datanode 上面的blocks 不会复制,做Snapshot 的文件是纪录了block的列表和文件的大小,但是没有数据的复制
- Snapshot 并不会影响HDFS的正常操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。快照数据是当前数据减去修改的部分计算出来的。
Snapshot 路径
对于一个snapshottable目录,这个目录下的“.snapshot”被用来存放snapshots,例如:/foo是一个snapshottable目录,文件/bar是它的一个文件/目录,那么当/foo有一个snapshot s0时,路径为:
/foo/.snapshot/s0/bar
作为/foo/bar的镜像copy,平常的API和CLI也可以对.snapshot路径进行操作。
例如:
hdfs dfs -ls /snapshottable目录/.snapshot
列出一个snapshottable目录下的左右的.snapshot文件。
hdfs dfs -ls /snapshottable目录/.snapshot/s0
列出一个snapshot下的文件
hdfs dfs -cp -ptopax /snapshottable目录/.snapshot/s0/bar /tmp
实现将snapshot文件拷贝出来。
Note that this example uses the preserve option to preserve timestamps, ownership, permission, ACLs and XAttrs.
Snapshot 操作
管理员操作
- Allow Snapshots
hdfs dfsadmin -allowSnapshot
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
2. Disallow Snapshot
注:与上述命令意义相反,这个snapshottable目录中的所有的snapshots在执行这个操作之前必须被删除。
hdfs dfsadmin -disallowSnapshot
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
用户操作
- Create Snapshots
在Snapshottable目录下创建一个Snapshot,这个操作要求具有所属者的权限。
hdfs dfs -createSnapshot []
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
snapshotName | 可选参数,指定snapshot的名字,当被忽略时,默认的格式为“‘s’yyyyMMdd-HHmmss.SSS”, e.g. “s20130412-151029.033”. |
2. Delete Snapshots
这个操作要求具有所属者的权限。
hdfs dfs -deleteSnapshot
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
snapshotName | snapshot的名字 |
3. Rename Snapshots
这个操作要求具有所属者的权限。
hdfs dfs -renameSnapshot
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
oldName | 旧的名字 |
newName | 新的名字 |
4. Get Snapshottable Directory Listing
当用户具有在snapshottable目录下创建snapshot的权限时,可以列出所有的Snapshottable目录下的snapshots。
hdfs lsSnapshottableDir
- Get Snapshots Difference Report
可以得出两个snapshot之间有什么不同之处,这个要求用户在两个snapshot具有读权限。
hdfs snapshotDiff
参数 | 意义 |
---|---|
path | snapshottable目录的路径 |
fromSnapshot | start snapshot |
toSnapshot | end snapshot |
结果:
标记 | 意义 |
---|---|
+ | 文件/目录被创建 |
- | 文件/目录被删除 |
M | 文件/目录被修改 |
R | 文件/目录被重命名 |
例如: