rbd的image快照与Pool快照

前言

这个问题是不久前在ceph社区群里看到的,创建image的时候,当时的报错如下:

2016-12-13 23:13:10.266865 7efbfb7fe700 -1 librbd::image::CreateRequest: pool not configured for self-managed RBD snapshot support

rbd: create error: (22) Invalid argument

这个错我之前也没见过,并且因为很少用到快照,所以可能也就没有触发这个问题,在查看了一些资料以后,明白了原因,这里就梳理一下

Ceph实质上有两种Snapshot模式,并且两种Snapshot是不能同时应用到同一个Pool中。

Pool Snapshot: 对整个Pool打一个Snapshot,该Pool中所有的对象都会受影响

Self Managed Snapshot: 用户管理的Snapshot,简单的理解就是这个Pool受影响的对象是受用户控制的。这里的用户往往是应用如librbd。

上面这段话引用自 麦子迈:解析ceph-snapshot

本篇就将讲述下用两种的互斥是如何实现的,又如何解决

实践

我们创建两个存储池

1
2
3
4
[root@lab8106 ~]# ceph osd pool create testpool1 8
pool 'testpool1' created
[root@lab8106 ~]# ceph osd pool create testpool2 8
pool 'testpool2' created

我们在testpool1当中创建一个image,testpool2保留为空

1
[root@lab8106 ~]# rbd -p testpool1 create testimage --size 4000

我们检查下存储池

1
2
3
4
5
6
[root@lab8106 ~]# ceph osd dump
···
pool 5 'testpool1' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 85 flags hashpspool stripe_width 0
removed_snaps [1~3]
pool 6 'testpool2' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 82 flags hashpspool stripe_width 0
···

创建了image的存储池多了一个标记 removed_snaps [1~3] ,而没有创建的存储池没有这个标记

我们现在来对两个存储池创建快照

1
2
3
4
[root@lab8106 ~]# ceph osd pool mksnap testpool1 testpool1-snap
Error EINVAL: pool testpool1 is in unmanaged snaps mode
[root@lab8106 ~]# ceph osd pool mksnap testpool2 testpool2-snap
created pool testpool2 snap testpool2-snap

可以看到创建了image的存储池无法创建存储池的快照,因为存储池当前已经为unmanaged snaps mode了,而没有创建image的 就可以做存储池快照

我们再继续创建image,看下会发生什么

1
2
3
4
[root@lab8106 ~]# rbd -p testpool1 create testimag2 --size 4000
[root@lab8106 ~]# rbd -p testpool2 create testimag3 --size 4000
2016-12-13 23:31:58.105932 7fd9cb7fe700 -1 librbd::image::CreateRequest: pool not configured for self-managed RBD snapshot support
rbd: create error: (22) Invalid argument

可以看到做了存储池快照的存储池无法创建image了,并且提示了没有配置成self-managed RBD snapshot,创建的时候会去检查是否是自管理模式

这个地方有个配置项目是

rbd_validate_pool = true

我们把这个参数改成false,然后再次创建

1
[root@lab8106 ~]# rbd -p testpool2 create testimag3 --size 4000

就可以创建了

本篇共出现了两次抛错,所以,这个是需要我们去做好选择的,总结下大概是这样的

此处输入图片的描述

总结

本篇总结了快照的两个出错的原因,尽量提前做好规划,再去选择哪种