目录
引入:Linux中快照原理
几个概念:
元数据:文件存储的基本信息都被称为元数据(Meta data),元数据通常包含数据的基本信息,比如硬盘中的位置、权限、创建者、时间等等,而且元数据都是非常的小;文件与Inode号的对应关系存放在当前文件夹下。Linux中使用 ls -i 就可以查看Inode号
Inode号:在Linux中每个文件都有相对应的Inode号,通过Inode号就可以找到元数据在硬盘上的位置,进而得到具体数据。数据的基本单位为数据块。
原理:
当拍摄完快照时,其实也就是对元数据进行了复制,因为非常小的缘故,所需时间非常短;快照就是将复制的元数据同数据块对应起来,这样当启用快照时就可以通过读取复制的元数据,来找到数据块的位置,当文件数据没有发生改变时,读取的数据也就是快照时的数据。但是当文件信息发生变化时,系统首先会将原来的数据块复制到快照的数据块中,再取消快照的元数据与初始的数据块之间的对应关系,最后将快照的元数据指向快照的数据块空间中(这个过程只针对发生改变的数据)。
注:快照是一个过程,在拍摄快照时开始,一直会持续到恢复快照;在此期间,如果数据发生变化,快照元数据和快照数据块就会发生相应的改变。当恢复快照时,没有发生变化的数据块,不用进行操作,只对进行变化的数据块进行覆盖操作。
1、快照概述
定义:快照是指源数据在某个时间点的一致性数据副本。快照生成后可以被主机读取,也可以作为某个时间点的数据备份。
快照的主要特点包括:
- 瞬间生成:存储系统可以在几秒钟内生成一个快照,获取源数据的一致性副本。
- 占用存储空间少:生成的快照数据并非完整的物理数据拷贝,不会占用大量存储空间。所以即使源数据量很大,也只会占用很少的存储空间。
快照不但能够快速生成源卷在某个时间点的一致性副本,还提供了恢复源卷数据的机制。当源卷的数据遭到人为意外删除、破坏或病毒入侵时,通过快照回滚可以快速将源LUN的数据恢复到快照激活时间点的数据,减少源卷数据的丢失量。
2、相关名词
中文 | 英文 | 中文定义/描述 |
源卷 | source volume | 需要进行快照操作的源数据所在的卷,对用户而言表现形式为LUN。源卷包括Meta Volume和Data Volume。 – Meta Volume:记录源数据在源卷中的存在位置。 – Data Volume:记录源卷中存放的数据。 |
COW数据 空间 | COW data space | 快照生成并激活后,发生写前拷贝时,从存储池分配的存储空间,用于保存源卷在激活时间点的数据。同一个源卷对应的所有快照卷共享同一个COW数据空间。 |
快照卷 | snapshot volume | 对源卷创建快照后,逻辑上生成的数据副本。对用户而言表现形式为快照LUN。 |
快照回滚 | snapshot rollback | 将快照LUN的数据复制给源LUN,从而使源LUN的数据恢复成生成快照LUN时刻的数据。 |
映射表 | mapping table | 映射表用于记录源卷数据和快照卷数据的在某个时间点的改变情况以及改变后的存储位置,分为共享部分和独享部分。 |
未激活状态 | inactive | 快照的一种状态,在这种状态下快照不可用,需要进行激活操作后可用。 |
- COW(Copy over Write):写前拷贝,即在主机写快照源LUN之前,先将源LUN的被保护数据拷贝到其他地方,拷贝完成后,主机IO才继续写源LUN。
- COW数据空间:源LUN在做写前拷贝时,用于存放源LUN被保护的数据的空间。该空间无用用户配置,源LUN做写前拷贝时才向存储池申请该空间,不占用源LUN数据空间。激活快照后,若没有向源LUN下发IO,源LUN不会有写前拷贝动作,该Cow数据空间实际使用大小为0。
- 共享映射表:激活快照后,快照源LUN上发生的变更统一存放在共享映射表上。一个源LUN上的所有快照共同使用该映射表。
- 独享映射表:激活快照后,快照卷上写入的数据都记录在独享映射表上。每个快照都有自己的一张独享映射表。
2.1 映射表
用于表示快照数据映射关系,形象的说就是“指针”。
- 映射项的左项为源地址,作为查找键值;
- 右项记录资源块的地址;
- 可以对表中的项进行添加和删除;
- 使用B+树方式保存。
映射表用来表示快照的实际数据所在。映射表分为两类:独享映射表和共享映射表。其原理是相同的,不同的地方在于独享映射表记录写快照发生的数据变更,共享映射表记录的是写源LUN发生的变更。
2.2 COW技术
当快照被激活时(此时刻称为快照时间点),主机读写的具体操作如下:
- 激活快照后,源LUN有数据写入。
- 首先将查询快照映射表,如果映射表中对应该地址的映射项不存在时,需要进行copy-on-write(写前拷贝),写前拷贝完成后在映射表中记录备份的源LUN数据信息。如果映射项存在,则直接覆盖写入源LUN的对应位置。
- 写前拷贝,即读取源LUN对应位置的数据写入COW卷的空间。
- COW卷空间与源LUN空间分布在同一个POOL中,写入COW卷即写入POOL的空间区域。
- 写前拷贝完成后,再将主机数据写入源LUN所在的POOL空间。
3、快照功能原理
- 快照创建并激活后,会生成与源卷一致的数据副本。存储系统在源卷中划分出COW数据空间并自动生成快照卷。
- 由于对源卷没有写操作,COW Meta区域和COW Data区域中均没有记录。
- 快照激活后,当应用服务器对源卷有数据写入请求时,存储系统不会立即写入新数据。存储系统利用写前拷贝机制先将写前拷贝数据拷贝到COW数据空间中,并修改映射表中的映射关系,然后将新数据写入源卷。
- 说明:在一个快照周期内,同一位置的数据只执行一次写前拷贝,根据映射表中相应值确定。再次写入数据时,将直接覆盖。例如:对于数据“DataX”,查询到 映射表中相应值为“1”,表示已经进行过一次写前拷贝;如再有写数据请求,将直接写入,不再将“DataX”拷贝到COW数据空间中。
- 快照激活后,应用服务器可以对快照卷进行写操作。应用服务器下发的写请求后,数据将直接写入快照卷,并在映射表(独享部分)中记录数据在快照卷中的存放位置。
- 快照激活后,应用服务器可以对快照卷(快照卷已写入数据)进行读操作。 应用服务器下发读快照请求后,通过映射表(独享部分)确定快照数据的存放位置,并读取数据;当快照卷未写入数据时,应用服务器下发读快照请求后,通过映射表(共享部分)确定快照数据的存放位置,并读取数据。
快照数据写入
- 应用服务器在Time 1之后下发写源LUN的请求:“Data1”修改为“DataX”。
- 利用写前拷贝机制将“Data1”拷贝到COW数据空间中。
- 更新映射表中的映射关系,“Data1”的存放位置变更为COW数据空间中的“go”。
快照数据读取
应用服务器有读取快照数据的请求时,存储系统会根据如下流程处理:
1、查询独享映射表,确定数据在快照LUN中的存放位置。
- 如果快照LUN中有对应的数据,直接将快照LUN中的数据读出并返回给应用服务器。
- 如果快照LUN中没有对应数据,则查询共享映射表。
2、查询共享映射表,确定数据在COW数据空间和源LUN中的位置。
- 如果映射表中的值为0,从源LUN读取相应的数据。
- 如果映射表中的值为1,从COW数据空间中读取相应的数据。
4、配置流程
5、应用场景
直接使用快照进行数据备份。使用快照备份可以在以下场景中迅速恢复数据:
- 病毒感染。
- 人为误操作。
- 恶意篡改。
- 系统宕机造成的数据损坏。
- 应用程序BUG造成的数据损坏。
- 存储系统BUG造成的数据损坏。
- 存储介质损坏(只有基于split mirror技术的快照能够恢复数据)。