文章目录
引言
创建快照就是创建当前存储卷的一个只读副本,用于进行快照回滚等数据恢复操作。Ceph创建快照有如下特点:
- 创建快照数据卷的配置流程,不进行数据操作,创建流程速度很快。
- 快照创建后采用COW(copy on write)方式进行写时拷贝。
- 原卷写:原卷写入新数据时才把原卷此位置的数据拷贝的快照卷,然后修改原卷数据。
- 快照读:先读快照,如果没有数据,表示此位置没有经过原卷写,直接到原卷读数据。
- COW在rados层进行,对于Bluestore和Filestore快照的COW机制有差别。
- Filestore:rados对象本身对应磁盘划分的文件,在创建的时候已经分配好,因此快照对应的rados对象时固定的,因此只能在原卷写的过程中真实拷贝数据到快照中,对性能影响很大。
- Bluestore:rados对象对应磁盘映射是记录在RocksDB的映射关系,可以修改。因此Bluestore实际上是使用ROW(Redirect-on-write)的方式实现,新数据写入新的rados对象,原卷的索引指向此rados对象,快照的索引指向原卷老rados对象。这样不会带来性能损耗。
创建卷和快照
建议先阅读Ceph RBD:创建image + image元数据详解后再继续阅读本文。
创建一个卷,写入lba为0,length为8M数据,每个rados对象为4M。
[root@VM-16-10-centos data]# rbd create blockpool/vol_2 --size 100M
[root@VM-16-10-centos data]# rados -p blockpool ls
rbd_directory
rbd_id.vol_2
rbd_data.2488ba1d0ed49.0000000000000001
rbd_info
rbd_object_map.2488ba1d0ed49
rbd_header.2488ba1d0ed49
rbd_data.2488ba1d0ed49.0000000000000000
创建快照,查看rados对象,除了多了一个rbd_object_map外没有变化。
[root@VM-16-10-centos data]# rbd snap create blockpool/vol_2@vol_2_snap_1
[root@VM-16-10-centos data]# rados -p blockpool ls
rbd_object_map.2488ba1d0ed49.0000000000000004
rbd_directory
rbd_id.vol_2
rbd_data.2488ba1d0ed49.0000000000000001
rbd_info
rbd_object_map.2488ba1d0ed49
rbd_header.2488ba1d0ed49
rbd_data.2488ba1d0ed49.0000000000000000
如何找到快照?rbd_header.{原卷id}
查看header文件,可以看到创建了一个snapshot_0000000000000004的快照,快照名称为vol_2_snap_1。因此创建快照的流程就是在原卷的元数据中修改header的过程。
[root@VM-16-10-centos data]# rados -p blockpool listomapvals rbd_header.2488ba1d0ed49
access_timestamp
value (8 bytes) :
00000000 49 96 56 62 1d d5 31 10 |I.Vb..1.|
00000008
create_timestamp
value (8 bytes) :
00000000 49 96 56 62 1d d5 31 10 |I.Vb..1.|
00000008
features
value (8 bytes)