文章目录
引言
创建快照就是创建当前存储卷的一个只读副本,用于进行快照回滚等数据恢复操作。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) :
00000000 3d 00 00 00 00 00 00 00 |=.......|
00000008
modify_timestamp
value (8 bytes) :
00000000 e3 bc 56 62 3c bf bd 14 |..Vb<...|
00000008
object_prefix
value (26 bytes) :
00000000 16 00 00 00 72 62 64 5f 64 61 74 61 2e 32 34 38 |....rbd_data.248|
00000010 38 62 61 31 64 30 65 64 34 39 |8ba1d0ed49|
0000001a
order
value (1 bytes) :
00000000 16 |.|
00000001
size
value (8 bytes) :
00000000 00 00 40 06 00 00 00 00 |..@.....|
00000008
snap_seq
value (8 bytes) :
00000000 04 00 00 00 00 00 00 00 |........|
00000008
snapshot_0000000000000004
value (70 bytes) :
00000000 08 08 40 00 00 00 04 00 00 00 00 00 00 00 0c 00 |..@.............|
00000010 00 00 76 6f 6c 5f 32 5f 73 6e 61 70 5f 31 00 00 |..vol_2_snap_1..|
00000020 40 06 00 00 00 00 00 00 00 00 00 00 00 00 00 01 |@...............|
00000030 01 04 00 00 00 00 00 00 00 e2 cd 56 62 69 7e c4 |...........Vbi~.|
00000040 17 00 00 00 00 00 |......|
00000046
创建快照流程
了解了元数据,快照创建流程可以概述为:
- image::OpenRequest:打开原卷
- SnapshotCreateRequest:创建快照,主要是创建相应的rados对象。
- ImageState:更新原卷header对象。
- image::CloseRequest:关闭原卷
具体可以参考代码中注释的流程。
/**
* Snap Create goes through the following state machine:
*
* @verbatim
*
* <start>
* |
* v
* STATE_SUSPEND_REQUESTS
* |
* v
* STATE_SUSPEND_AIO * * * * * * * * * * * * *
* | *
* v *
* STATE_APPEND_OP_EVENT (skip if journal *
* | disabled) *
* (retry) v *
* . . . > STATE_ALLOCATE_SNAP_ID *
* . | *
* . v *
* . . . . STATE_CREATE_SNAP * * * * * * * * * * *
* | * *
* v * *
* STATE_CREATE_OBJECT_MAP (skip if * *
* | disabled) * *
* | * *
* | v *
* | STATE_RELEASE_SNAP_ID *
* | | *
* | v *
* \----------------> <finish> < * * * * *
*
* @endverbatim
*
快照的数据在哪里?
Bluestore
创建卷写入8M数据
引言中介绍快照数据是在原卷写的时候产生的,我们写入一个lba为0,length为5k的数据看一下。
[root@VM-16-10-centos ~]# 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
创建快照
查看rados对象发现并没有新生成的rados对象。其实数据在原卷的rados对象中。查看rbd_data.2488ba1d0ed49.0000000000000000
对象数据,可以看到最新的数据head写入了4M的数据,快照4,写入了4M的数据,两块数据之间没有overlap。
[root@VM-16-10-centos ~]# rados -p blockpool listsnaps rbd_data.2488ba1d0ed49.0000000000000000
rbd_data.2488ba1d0ed49.0000000000000000:
cloneid snaps size overlap
4 4 4194304 []
head - 4194304
原卷写5M数据后查看rados对象
查看rados对象rbd_data.2488ba1d0ed49.0000000000000001
数据,可以看到最新的数据head写入了4M的数据,快照4虽然也写入4M,看从offset 1M开始的3M数据是跟head overlap的,也就是说快照数据只有1M。
[root@VM-16-10-centos ~]# rados -p blockpool listsnaps rbd_data.2488ba1d0ed49.0000000000000001
rbd_data.2488ba1d0ed49.0000000000000001:
cloneid snaps size overlap
4 4 4194304 [1048576~3145728]
head - 4194304
查看快照数据在磁盘的文件
Bluestore数据在盘上的具体位置如何查看待具体分析。
Filestore
创建卷写入8M数据
参考前面步骤,在Filestore池中创建卷vol_3,写入8M数据。查看rados对象。
[root@VM-16-10-centos data]# rados -p blockpool1 ls
rbd_data.326d6d922639e.0000000000000001
rbd_directory
rbd_id.vol_3
rbd_object_map.326d6d922639e
rbd_info
rbd_data.326d6d922639e.0000000000000000
rbd_header.326d6d922639e
查看对应的磁盘文件。
[root@VM-16-10-centos data]# find / -name "*326d6d922639e*"
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.1bb_head/DIR_B/DIR_B/DIR_3/DIR_7/rbd\uheader.326d6d922639e__head_144D73BB__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.128_head/DIR_8/DIR_2/DIR_D/DIR_6/rbd\udata.326d6d922639e.0000000000000001__head_15E36D28__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.15d_head/DIR_D/DIR_5/DIR_1/DIR_0/rbd\udata.326d6d922639e.0000000000000000__head_DDF2015D__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.ca_head/DIR_A/DIR_C/DIR_A/DIR_D/rbd\uobject\umap.326d6d922639e__head_C188DACA__4
创建快照
创建快照vol_3_snap_1。
[root@VM-16-10-centos data]# rados -p blockpool1 ls
rbd_data.326d6d922639e.0000000000000001
rbd_directory
rbd_id.vol_3
rbd_object_map.326d6d922639e
rbd_info
rbd_object_map.326d6d922639e.0000000000000004
rbd_data.326d6d922639e.0000000000000000
rbd_header.326d6d922639e
原卷写5M数据后查看rados对象
原卷写5M数据。依然没有新增rados对象,数据在原对象快照部分。
[root@VM-16-10-centos data]# rados -p blockpool1 ls
rbd_data.326d6d922639e.0000000000000001
rbd_directory
rbd_id.vol_3
rbd_object_map.326d6d922639e
rbd_info
rbd_object_map.326d6d922639e.0000000000000004
rbd_data.326d6d922639e.0000000000000000
rbd_header.326d6d922639e
[root@VM-16-10-centos data]# rados -p blockpool1 listsnaps rbd_data.326d6d922639e.0000000000000001
rbd_data.326d6d922639e.0000000000000001:
cloneid snaps size overlap
4 4 4194304 [1048576~3145728]
head - 4194304
查看快照数据在磁盘的文件
查看对应磁盘文件,可以看到多了两个文件,因此可以说明filestore的快照在COW时是真正将原卷数据拷贝到了快照中。
[root@VM-16-10-centos data]# find / -name "*326d6d922639e*"
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.1bb_head/DIR_B/DIR_B/DIR_3/DIR_7/rbd\uheader.326d6d922639e__head_144D73BB__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.128_head/DIR_8/DIR_2/DIR_D/DIR_6/rbd\udata.326d6d922639e.0000000000000001__head_15E36D28__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.128_head/DIR_8/DIR_2/DIR_D/DIR_6/rbd\udata.326d6d922639e.0000000000000001__4_15E36D28__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.15d_head/DIR_D/DIR_5/DIR_1/DIR_0/rbd\udata.326d6d922639e.0000000000000000__head_DDF2015D__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.15d_head/DIR_D/DIR_5/DIR_1/DIR_0/rbd\udata.326d6d922639e.0000000000000000__4_DDF2015D__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.ca_head/DIR_A/DIR_C/DIR_A/DIR_D/rbd\uobject\umap.326d6d922639e__head_C188DACA__4
/data/cos/osd/osd.DATASTOR_SSD_C/current/4.171_head/DIR_1/DIR_7/DIR_B/DIR_0/rbd\uobject\umap.326d6d922639e.0000000000000004__head_1F7F0B71__4