●导语●
快照一般是指数据存储的某一时刻的状态记录,类似于给数据按下快门拍了一张照片,所以也叫snapshot。而存储系统的快照在云计算中广泛使用,比如块存储的快照。很多其他高级功能基本都要依赖快照来实现,比如备份、热迁移等。而对于快照,我们经常会问的一个问题就是快照的数据是不是完整的,会不会出现快照回滚之后数据丢失。其实这也就是我们常说的快照数据一致性问题。
下面主要分以下几点进行讨论:
(1) 一致性的分类
(2) Ceph中一致性的实现
●一致性分类●
快照这里我们主要是讲用在虚拟机块存储上的快照,首先看一下下面这张图
从上面的图可以看出,我们的数据会经过应用层、文件系统层最后到达块设备层。每个层次可能会有一部分缓存,比如应用层里面的程序会有读写缓存,文件系统层会有page cache,块设备层有块设备的缓存。
根据这三层一致性主要分为以下几种:
1)奔溃一致性快照
奔溃一致性其实没有做特殊的保障,这时候快照存储的数据就相当于虚拟机突然掉电时候块设备上存储的数据状态,对于我们云计算中的块存储可能上图中的三个层中的缓存脏数据都没有刷到块设备。
2)文件系统一致性快照
文件系统一致性快照是在做快照前,文件系统被暂时冻结,文件系统层的缓存脏数据刷到块设备中,冻结用于拒绝用户层应用的IO请求。
3)应用一致性快照
应用一致性快照是在做快照前,应用被暂时冻结,并把应用层缓存的脏数据刷到块存储。
从上面三种快照一致性的分离中我们发现我们没有对块设备的缓存持久化进行归类,其实根据不同的存储系统有些可以归到奔溃一致性快照里面。这里我们不细介绍应用层和文件系统层了,主要介绍一下存储系统块设备层的数据快照一致性做法,下面我们来看看Ceph中的rbd块设备是如何维护着一致性的。
●Rbd的快照●在做块存储快照的时候,我们最希望的就是rbd快照没有io再过来、内部飞行的io都回调完成、rbd缓存中的脏数据都已经刷到磁盘上,那这时候做快照,无论使用什么姿势,数据肯定是完整没问题的。我们看一下rbd快照前做了什么,如下是12.2.10 L版的代码。
* <start> * | * v * STATE_SUSPEND_REQUESTS * | * v * STATE_