块级重复数据删除技术

名词解释:

重删 —— 块级重复数据删除;

重删率 —— 任务级测试产生的相对数值,与重删目标和重删场景选择有密切联系;

重删场景 —— 依据切块粒度可分为卷级,文件级,块级重删等。根据重删目标特性选择;

重删指纹库 —— 重删过程中产生的关键数据集合,依据应用场景分为全局,任务级等;

重删切块算法 —— 常用切块算法有,固定块算法,滑动窗口算法,内容相关算法等;

功能概述:

        一种数据缩减技术,通常用于基于磁盘的备份系统,旨在减少存储系统中使用的存储容量与缩减通讯中数据量传输的开销。 它的工作方式是在备份业务周期内查找不同文件中不同位置的重复可变大小数据块,重复的数据块用特定指示符取代。

        利用多种算法与模型混合方案来检测备份目标中的重复数据块。 使用可变长块方案来存放被指纹算法切割后的数据,并使用高效的散列算法为所有数据块创建唯一标识,通过高命中率的过滤模型找出所有冗余数据块,最终达到维护所备份数据单一副本的目标。

原理原型:

        该系统包括一个数据块切割器、 块散列计算引擎、 冗余块消除器,还有存储单元以及其相关的元数据与指纹辅助文件。

        数据块切割器 把原备份文件分割成长度不等的数据块,该方案中是可变大小的数据块,它能提供了更好的文件更新弹性。

        将以上数据块送至 块散列计算引擎 后将计算各数据块的散列值,高效计算出的散列哈希值将成为每个数据块的唯一标识符。

        将唯一标识的数据块送至 冗余块消除器 后会将已在存储单元中的数据块命中并过滤,然后只将未存储过的数据块真实存入存储单元。 并对已存在的数据块仅做标识与引用计数等处理操作,为后续可以恢复出正确的备份数据做铺垫。

业务原型:

当前重删业务原型的架构设计,只有备份业务支持重删特性,恢复业务中没有重删的介入。

重删备份流程:

  1. backupServer给backupClient发送备份任务;
  2. backupClient接收到备份数据后交给dedupClient处理;
  3. dedupClient将备份数据根据指纹算法切分成chunk数据块;
  4. dedupClient根据切块数据为每个chunk产生唯一的指纹标签;
  5. localDedup过程中,dedupClient将所有指纹进行去重操作,但并不存储;
  6. dedupClient将本地去重后的备份指纹集发送给dedupServer进行remoteDedup;
  7. dedupServer在进行二次remoteDedup之后将备份指纹集保存至fingerprintLib指纹库;
  8. dedupServer将remoteDedup结果再次发送给dedupClient;
  9. 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()

附图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Capricorn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值