名词解释:
重删 —— 块级重复数据删除;
重删率 —— 任务级测试产生的相对数值,与重删目标和重删场景选择有密切联系;
重删场景 —— 依据切块粒度可分为卷级,文件级,块级重删等。根据重删目标特性选择;
重删指纹库 —— 重删过程中产生的关键数据集合,依据应用场景分为全局,任务级等;
重删切块算法 —— 常用切块算法有,固定块算法,滑动窗口算法,内容相关算法等;
功能概述:
一种数据缩减技术,通常用于基于磁盘的备份系统,旨在减少存储系统中使用的存储容量与缩减通讯中数据量传输的开销。 它的工作方式是在备份业务周期内查找不同文件中不同位置的重复可变大小数据块,重复的数据块用特定指示符取代。
利用多种算法与模型混合方案来检测备份目标中的重复数据块。 使用可变长块方案来存放被指纹算法切割后的数据,并使用高效的散列算法为所有数据块创建唯一标识,通过高命中率的过滤模型找出所有冗余数据块,最终达到维护所备份数据单一副本的目标。
原理原型:
该系统包括一个数据块切割器、 块散列计算引擎、 冗余块消除器,还有存储单元以及其相关的元数据与指纹辅助文件。
数据块切割器 把原备份文件分割成长度不等的数据块,该方案中是可变大小的数据块,它能提供了更好的文件更新弹性。
将以上数据块送至 块散列计算引擎 后将计算各数据块的散列值,高效计算出的散列哈希值将成为每个数据块的唯一标识符。
将唯一标识的数据块送至 冗余块消除器 后会将已在存储单元中的数据块命中并过滤,然后只将未存储过的数据块真实存入存储单元。 并对已存在的数据块仅做标识与引用计数等处理操作,为后续可以恢复出正确的备份数据做铺垫。
业务原型:
当前重删业务原型的架构设计,只有备份业务支持重删特性,恢复业务中没有重删的介入。
重删备份流程:
- backupServer给backupClient发送备份任务;
- backupClient接收到备份数据后交给dedupClient处理;
- dedupClient将备份数据根据指纹算法切分成chunk数据块;
- dedupClient根据切块数据为每个chunk产生唯一的指纹标签;
- localDedup过程中,dedupClient将所有指纹进行去重操作,但并不存储;
- dedupClient将本地去重后的备份指纹集发送给dedupServer进行remoteDedup;
- dedupServer在进行二次remoteDedup之后将备份指纹集保存至fingerprintLib指纹库;
- dedupServer将remoteDedup结果再次发送给dedupClient;
- dedupClient根据两次去重后的结果将相应的chunk与matedate由backupClient发送 至backupServer进行暗数据保存;
重删恢复流程:
恢复文件的索引与合成均在服务器端完成,再将合并后的恢复文件发送给备份客户端;
接口定义与内容:
backupclient <-> dedupclient
/***********************************************************
* dedupMissionStartC 重删任务开始,指定本次任务指定的文件(目录)及相关信息
* params:
* Input:
* char* sFilePath 本次重删任务指定的文件(或目录)
* char* sTimeStamp 当前任务唯一时间戳
* int nJobId 本次任务序号
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int dedupMissionStartC(char* sFilePath, int nJobId , char* sTimeStamp)
/***********************************************************
* dedupBuildFrameC 重复调用,获取计算所得指纹及指纹序号。
* params:
* Output:
* char* sDedupFrame 计算所得指纹及指纹序号,之后由backupclient发送给dedupserver
* Return value:
* 1 此时dedupframe未获取完毕
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int dedupBuildFrameC(char* sDedupFrame)
/***********************************************************
* dedupSendValidLabelNumC 给dedupclient传入经过dedupsrever传回的不重复的指纹序号进行处理
* params:
* Input:
* int nLabelNum[] 由dedupserver检索后回传不重复的指纹序号数组
* int nLenth 数组长度
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int dedupSendValidLabelNum(int nLabelNum[],int nlenth)
/***********************************************************
* dedupGetChunkC 重复获取data,由backupclient发送给server进行落盘保存
* params:
* Output:
* char* buffer chunk+metadata 由backupclient发送给server保存,每次任务保存唯一一个文件
* Return value:
* 1 未到最后一包,还有后续数据
* 0 正常结束
* -1 失败
* (待补充)
************************************************************/
int dedupGetChunkC(char* buffer)
backupserver <-> dedupserver
/***********************************************************
* initDedupFingerprintLib 初始化指纹库信息
* params:
* InPut:
* int dedup_fp_mode 指纹库节点个数
* Output:
* struct dedup_task *dedupTask 多节点指纹库
* Return value:
* true
* false 失败
* (待补充)
************************************************************/
bool initDedupFingerprintLib(struct dedup_task *dedupTask, int dedup_fp_mode)
/***********************************************************
* destroyDedupFingerprintLib 销毁指纹库信息
* params:
* InPut:
* struct dedup_task *dedupTask 多节点指纹库
* Output:
*
* Return value:
* (待补充)
************************************************************/
void destroyDedupFingerprintLib(struct dedup_task *dedupTask)
/***********************************************************
* dedupParseFrameS 传入指纹及序号由dedupserver进行二次重删,返回非重复指纹序号
* params:
* InPut:
* char *sDedupFrame 指纹及序号 (num=fingerprint&num=fingerprint...)
* int bloomType bloom类型,使用某个bloom或者同时使用多个
* struct dedup_task *dedupTask 储存server使用的指纹库
* Output:
* int nLableNum[] dedup所得非重复标签序号
* Return value:
* >0 非重复的标签个数
* -1 失败
* (待补充)
************************************************************/
int dedupParseFrameS(int nLableNum[], struct dedup_task *dedupTask, char* sdedupFrame, int bloomType)
/***********************************************************
* chunkStorage 文件数据块落盘
* params:
* InPut:
* char* sFilename 文件名,由backupserver组装
* char *pChunkBuf buf内容
* int pos buf在文件中的位置偏移量
* int pChunkSize buf大小
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int chunkStorage(char *sFilename, char *pChunkBuf, int pos, int pChunkSize)
/***********************************************************
* chunkRecvInit 文件数据块恢复初始化
* params:
* InPut:
* dedupRecv *deduprecv 结构体储存单次恢复任务信息
* const char *sFpPath 暗数据文件路径
* const char *sjobId 备份任务jobid,用于找到指定备份文件
* const char *sTimeStamp 备份任务时间戳,用于找到指定备份文件
* int filesNum 指定恢复的文件个数,不指定时传0
* char **filesExtract 指定恢复的文件名称,不指定时传空
* unsigned int bz 是否压缩标记
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int chunkRecvInit(dedupRecv *deduprecv, const char *sFpPath, const char *sjobId, const char *sTimeStamp, int filesNum, char **filesExtract, unsigned int bz);
/***********************************************************
* chunkRecv 文件数据块恢复(整体任务)
* params:
* InPut:
* dedupRecv *deduprecv 结构体储存单次恢复任务信息
* char *chunkBuf 恢复数据块
* int *bufSiz 恢复数据块大小
* const char *sTimeStamp 备份任务时间戳,用于恢复指定备份文件名
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int chunkRecv(char *chunkBuf, int *bufSize, dedupRecv *deduprecv, const char *sTimeStamp);
/***********************************************************
* undedupRegfile 文件数据块恢复(单个文件)
* params:
* InPut:
* dedupRecv *deduprecv 结构体储存单次恢复任务信息
* char *chunkBuf 恢复数据块
* int *bufSiz 恢复数据块大小
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
int undedupRegfile(char *chunkBuf, int *bufSize, dedupRecv *deduprecv);
backupclient < - > backupserver
/***********************************************************
* DedupStartBackup 备份任务开始
* params:
* InPut:
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
RETURN_CODE DedupStartBackup()
/***********************************************************
* dedupGetSettings 设置参数
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool dedupGetSettings()
/***********************************************************
* DedupRegFileAndBuildFrameC 开始调用dedup备份操作
* params:
* InPut:
* char *subpath 备份文件路径
* int nFPos 偏移量,相对路径时使用
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
RETURN_CODE DedupRegFileAndBuildFrameC(char *subpath, int nFPos)
/***********************************************************
* DedupGetValidLabel 向服务端发送指纹信息并获取需要发送的指纹信息
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool DedupGetValidLabel()
/***********************************************************
* DedupSendChunk 向服务端发送真实的数据块
* params:
* InPut:
* int chunkSize 需要发送的数据块个数
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
RETURN_CODE DedupSendChunk(int chunkSize)
/***********************************************************
* DedupBackupEnd 完成一次重删备份
* params:
* InPut:
* Output:
* Return value:
* 0 成功
* -1 失败
* (待补充)
************************************************************/
RETURN_CODE DedupBackupEnd()
/***********************************************************
* dedupRestoreStart 重删恢复任务开始
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool dedupRestoreStart()
/***********************************************************
* dedupSendRestoreCmd 通知客户端恢复任务开始,并且开始读取数据块发送给客户端
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool dedupSendRestoreCmd()
/***********************************************************
* dedupRestoreFileStat 单个文件恢复完成后,恢复文件属性信息
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool dedupRestoreFileStat()
/***********************************************************
* dedupRestoreEnd 恢复任务完成
* params:
* InPut:
* Output:
* Return value:
* true 成功
* false 失败
* (待补充)
************************************************************/
bool dedupRestoreEnd()
附图: