原理
快照是源数据在某一时间点生成的数据副本,由源LUN、COW数据空间和快照LUN三部分组成。快照具有执行速度快、占用存储空间小等特点。
相关概念
- 数据组织形式
存储系统采用虚拟化存储技术。存储池中创建的LUN包含了元数据卷(Meta Volume)和数据卷(Data Volume)两部分组成。
- 元数据卷(Meta Volume):记录LUN中数据组织形式及其属性的卷,结构形式为树形。
- 数据卷(Data Volume):存放LUN中的实际数据的卷,数据读取和写入都以Extent为单位。
- 源卷
需要进行快照操作的源数据所在的卷,对用户而言表现形式为源LUN。源LUN包括Meta Volume和Data Volume:
- Meta Volume:记录源数据在源LUN中的存在位置。
- Data Volume:记录源LUN中存放的业务数据。
- 快照卷
对源LUN创建快照后,逻辑上生成的数据副本。对用户而言表现形式为快照LUN。快照LUN包括Snapshot Meta Volume和Snapshot Data Volume:
- Snapshot Meta Volume:快照元数据卷。每生成一份快照,就会建立一个Snapshot Meta Volume。
- Snapshot Data Volume:与Snapshot Meta Volume对应的数据卷。记录的是写快照LUN时产生的数据。
在未对快照LUN进行写操作时,Snapshot Meta Volume和Snapshot Data Volume中均没有记录。
- 写前拷贝(COW,Copy-on-write)
快照实现的核心技术,用于保存源LUN中变化的数据。快照创建并激活后,如果应用服务器对源LUN有写数据请求,存储系统首先将被写入位置的原数据(写前拷贝数据)拷贝到COW数据空间中,然后修改写前拷贝数据的映射关系,记录写前拷贝数据在COW数据空间中的新位置,最后再将新数据写入到源LUN中。
- COW数据空间
快照生成并激活后,存储系统在源LUN所在的存储池中动态划分一部分存储空间,用于保存写前拷贝数据。同一个源LUN对应的所有快照LUN共享同一个COW数据空间。COW数据空间包括COW Meta区域和COW Data区域:
- COW Meta区域:同一个源LUN下所有快照共用的元数据区。用于存放写源LUN时所有快照LUN所产生的写前拷贝映射项,即写前拷贝数据与其在COW Data区域中存放位置的对应关系。
- COW Data区域:与COW Meta区域对应的数据空间。用于存放写源LUN时产生的写前拷贝数据。
- 映射表
映射表用于记录源LUN数据和快照LUN数据的在某个时间点的改变情况以及改变后的存储位置。映射表分为共享映射表和独享映射表:
- 共享映射表存放在COW Meta区域中,用于记录写源LUN时产生的写前拷贝数据与其在COW Data区域中存放位置的映射关系。
- 独享映射表存放在每个快照LUN的Snapshot Meta Volume中,用于记录写快照LUN所产生的数据与其在快照LUN中存放位置的映射关系。
- 快照副本
对快照进行复制,获得多份激活时间点快照副本的技术。即使快照进行写操作,快照中的数据发生了改变,快照副本中的数据仍然与快照激活时间点的快照数据一致。
快照创建及激活流程
快照创建并激活后,会生成与源LUN一致的数据副本。存储系统在源LUN所在的存储池中动态划分COW数据空间并自动生成快照LUN。
- 由于对源LUN没有写操作,COW Meta区域和COW Data区域中均没有记录。
- 由于对快照LUN没有写操作,Snapshot Meta Volume和Snapshot Data Volume中均没有记录。
快照创建并激活的初始状态如图1-1所示。
源数据写入流程
快照激活后,当应用服务器对源LUN有数据写入请求时,存储系统不会立即写入新数据。存储系统利用写前拷贝机制先将写前拷贝数据拷贝到COW数据空间中,并修改映射表中的映射关系,然后将新数据写入源LUN。数据写入源LUN后快照状态如图1-2所示。
新数据写入源LUN的过程如下:
- 应用服务器在Time 1之后下发写源LUN的请求:“Data1”修改为“DataX”。
- 利用写前拷贝机制将“Data1”拷贝到COW数据空间中。
- 更新映射表中的映射关系,“Data1”的存放位置变更为COW数据空间中的“g0”。
- 将“DataX”写入源LUN,完成数据更新。
在一个快照周期内,同一位置的数据只执行一次写前拷贝,根据映射表中相应值确定。再次写入数据时,将直接覆盖。例如:对于数据“DataX”,查询到映射表中相应值为“1”,表示已经进行过一次写前拷贝;如再有写数据请求,将直接写入,不再将“DataX”拷贝到COW数据空间中。
如果源LUN的同一位置在不断写入数据并保存新的快照,那么共享映射表将随时间标识数据的变化情况。例如,在“DataX”写入源LUN后,又对源LUN创建并激活了一个新的快照,此时数据写入源LUN的过程如图1-3所示。
- 应用服务器在Time 2之后下发写源LUN的请求:“DataX”修改为“DataY”。
- 利用写前拷贝机制将“DataX”拷贝到COW数据空间中。
- 更新映射表中的映射关系,“DataX”的存放位置变更为COW数据空间中的“g0”,共享映射表的(g0,Time 2)位置将被标识为“1”。
- 将“DataY”写入源LUN,完成数据更新。
读快照时,将共享映射表的时间点(例如Time 2)与COW数据空间的时间戳(例如Time 2)进行对比,识别出该快照所对应的数据块。
快照LUN写入流程
快照激活后,应用服务器可以对快照LUN进行读写操作。应用服务器下发写请求后,数据将直接写入快照LUN,并在独享映射表中记录数据在快照LUN中的存放位置。数据写入快照LUN后快照状态如图1-4所示。
数据写入快照LUN的过程如下:
- 应用服务器在Time2之后下发写快照LUN的请求:写入数据“Data a”,并将该数据直接写入快照LUN中。
- 在独享映射表中记录“Data a”在快照LUN中的存放位置“g'0”。
快照数据读取流程
应用服务器有读取快照数据的请求时,存储系统会根据如下流程处理:
- 查询独享映射表,确定数据在快照LUN中的存放位置。
- 如果快照LUN中有对应的数据,直接将快照LUN中的数据读出并返回给应用服务器。
- 如果快照LUN中没有对应数据,则查询共享映射表。
- 查询共享映射表,确定数据在COW数据空间和源LUN中的位置。
- 如果映射表中的值为0,从源LUN读取相应的数据。
- 如果映射表中的值为1,从COW数据空间中读取相应的数据。
- 应用服务器下发读快照请求。
- 通过独享映射表确定快照数据的存放位置。
- 应用服务器读取到的快照数据为“Data a”。
- 应用服务器下发读快照请求。
- 通过共享映射表确定快照数据的存放位置。
- 应用服务器读取到的快照数据为“Data 0”、“Data 1”、“Data 2”、“Data 3”。
快照回滚流程
快照不但能够快速生成源LUN在某个时间点的一致性副本,还提供了快速恢复源LUN数据的机制。当源LUN的数据遭到人为意外删除、破坏或病毒入侵时,通过快照回滚可以快速将源LUN的数据快速恢复为某个时间点快照的数据,减少源LUN数据的丢失量。快照回滚的示意图如图1-7所示。
快照回滚是将源LUN恢复成与快照相同的数据映像。对快照进行写操作后,快照不再是激活时间点的数据。如果需要将源LUN数据恢复到快照激活时间点的数据,需要先对快照创建快照副本,然后使用快照副本进行回滚。