一、块级CDP(连续数据保护)
Block based CDP Module for Linux Kernel是Red Hat学术开源项目中一个基于块的连续数据保护模块,这个模块在数据块级别提供连续数据保护能力。连续数据保护是一种备份和恢复技术,它持续地捕获所有I/O请求,并且为在这些请求打上时间戳标志。它将数据变化以及时间戳保存下来,以便恢复到过去的任意时刻。因此,这个模块支持数据的任意时刻映像。
在Linux的CDP实现中,涉及三个设备:
>主机磁盘(Host Disk)设备;
CDP仓库(Repository)设备;
CDP元数据(Metadata)设备;
CDP代码对主机磁盘设备数据块的在各个时刻所作的写操作都被记录下来,被顺序保存到CDP仓库设备中,同时对应的元数据也被保存在CDP元数据设备中。
元数据包括以下信息:
struct metadata {
int hrs, min, sec;该数据块被写入主机磁盘设备的时间;
unsigned int bisize; 该数据块的以字节为单位的长度;
sector_t cdp_sector; CDP仓库设备中对应数据块的起始扇区编号;
sector_t host_sector; 该数据块在主机磁盘设备中的起始扇区编号;
};
下图反映了主机磁盘设备和CDP仓库设备之间的关系。CDP仓库设备中按时间顺序保存了对主机磁盘设备的数据修改。A为主机磁盘设备上的一个扇区,该扇区在9:00和9:05分别进行了修改,它在CDP仓库设备中对应的扇区分别为A1和A2。
下图反映了CDP仓库设备和CDP元数据设备之间的关系,它们以写入顺序一一对应。CDP仓库设备中的一个元数据对应CDP元数据设备中一个I/O请求,实际上可能是多个扇区。具体扇区数由元数据中的bisize指定,而起始扇区位置由cdp_sector指定。
1.1 CDP仓库设备
全局变量maddr保存了下一个I/O请求在CDP仓库设备上执行的地址(起始扇区编号)。maddr的初值被定义为宏START_METADATA(0)。
unsigned int maddr = START_METADATA;
当一个写请求到来时,对应数据被写到CDP仓库设备中,这时所作的操作如下:
l 将写入CDP仓库设备的数据块起始扇区编号设置为maddr;
l 根据要写入主机磁盘设备的数据块的扇区数目增加maddr。
这时,我们要将这里写入的CDP仓库设备的数据块编号记录下来以便构造对应的元数据。
1.2 CDP元数据设备
全局变量taddr保存了下一个I/O请求对应的元数据在CDP元数据设备中保存的地址(起始扇区编号)。 taddr的初值被定义为宏START_METADATA(0)。
unsigned int taddr = START_METADATA;
当一个写请求到来时,对应的元数据被记录在CDP元数据设备中。
为了简单起见,在元数据设备上,一个扇区(512字节)只保存一个元数据信息(只有32字节),这样浪费了大量的存储空间,但对元数据设备的处理却非常简单:
将写入CDP元数据设备的元数据起始扇区编号设置为taddr,长度为1个扇区;</