Ceph RBD:快照 + Bluestore/Filestore快照区别

引言

创建快照就是创建当前存储卷的一个只读副本,用于进行快照回滚等数据恢复操作。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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值