我目前所了解的快照有两种,第一种是COFW 写时拷贝,在修改数据块时将原来数据原封不动的拷贝到快照资源存储空间,已达到保护的目的,第二种,就是我将要说的写时重定向ROW,他跟COFW不同的时在保护数据的时候不会发生数据拷贝,只需要在原存储空间申请新的数据块,用户读数据时会重定向到新的数据块,不需要做拷贝。
这种重定向的快照基于一种特殊的lun,精简LUN,简单介绍下这种LUN。有两个存储区,物理区和私有区,私有区用来存储管理信息,地址映射,而物理区真正的存储数据。
当用户首次写原Lun的时候,假设从0位置起始开始写数据,大小为一个数据块8k,原理图如下:
首先,根据用户所写的范围大小,产生一个逻辑地址,这里也叫lba,标志用户写数据的位置。物理区也会产生一个标志哪个数据块的物理地址pba,这个pba与lba通过私有区一一映射,也即,一个数据块有lba和pba且一一对应。二元组是用来记录所保护的数据,有两个值一个lba,一个pba,表示lba数据块的数据修改前的数据存放在pba的位置。
用户刚开始写的时候,发现原Lun 是没有数据的,此时要给第一个数据块写A。它会先去根据写的位置lba=0读地址映射,查改lba对应的pba,发现未映射过,pba为全ff,此时要去保护写A之前的数据,写A之前没数据,所以lba=0,pba = ff;再把A写到lba=0,pba=0的位置。
同理有数的lun也是如此:
用户给A位置写A',查地址映射发现A的地址映射存在且为0,即pba = 0;这时,会在物理区新分配一个数据块,并把A'写进去,同时把之前映射A的地址修改为映射A',二元组中存放的是lba =0,pba= 0;用户下次来读lba=0的位置会读到A',而A被保护在二元组中,要想回到A,需要会滚到该时间点之前。