libsync網(wǎng)絡(luò)數(shù)據(jù)同步開發(fā)庫
libsync是一個(gè)用于網(wǎng)絡(luò)數(shù)據(jù)同步的開發(fā)庫。
假設(shè)現(xiàn)在有兩臺(tái)計(jì)算機(jī)Alpha和Beta ,計(jì)算機(jī)Alpha能夠訪問A文件,計(jì)算機(jī)Beta能夠訪問B文件,文件A和B非常相似,計(jì)算機(jī)Alpha和Beta通過低速網(wǎng)絡(luò)互聯(lián)。基于dedupe技術(shù)的數(shù)據(jù)同步算法大致流程與Rsync相似,簡(jiǎn)單描述如下:
1、Beta采用數(shù)據(jù)切分算法,如FSP(fixed-size partition)、CDC(content-defined chuking),將文件B分割成大小相等或不等的數(shù)據(jù)塊;
2、Beta對(duì)于每一個(gè)數(shù)據(jù)塊,計(jì)算一個(gè)類似rsync弱校驗(yàn)值和md5強(qiáng)校驗(yàn)值,并記錄數(shù)據(jù)塊長(zhǎng)度len和在文件B中的偏移量offset;
3、Beta將這將數(shù)據(jù)塊信息發(fā)送給Alpha;
4、Alpha采用同樣的數(shù)據(jù)塊切分技術(shù)將文件A切成大小相等或不等的數(shù)據(jù)塊,并與Beta發(fā)過來的數(shù)據(jù)信息進(jìn)行搜索匹配,生成差異編碼信息;
5、Alpha將差異編碼信息發(fā)送給Beta,并同時(shí)發(fā)送重構(gòu)文件A的指令;
6、Beta根據(jù)差異編碼信息和文件B重構(gòu)文件A。
上面算法描述中,有幾個(gè)關(guān)鍵問題需要解決,即文件切分、切分?jǐn)?shù)據(jù)塊信息描述、差異編碼、差異編碼信息描述、文件同步。
libsync函數(shù)庫由提供三個(gè)API,原型描述如下:
1、int file_chunk(char src_filename, char chunk_filename, int chunk_algo)
功能:對(duì)件進(jìn)行切分生成分塊描述文件。
參數(shù):src_filename為源文件,chunk_filename為生成的塊信息描述文件,chunk_algo為文件切分算法,目前支持FSP、CDC、SB三種。
2、int file_delta(char src_filename, char chunk_filename, char delta_filename, int chunk_algo)
功能:使用生成的塊描述信息對(duì)文件進(jìn)行差異編碼。
參數(shù):src_filename為待編碼文件,chunk_filename為通過函數(shù)file_chunk生成的塊描述文件,chunk_algo為文件切分算法。
3、int file_sync(char src_filename, char delta_filename)
功能:使用差異編碼文件將源文件同步至目標(biāo)文件。
參數(shù):src_filename為基本文件,delta_filename為通過函數(shù)file_delta生成的差異編碼文件。
數(shù)據(jù)同步有PULL和PUSH兩種應(yīng)用模式,PULL是將遠(yuǎn)程數(shù)據(jù)同步到本地,而PUSH是將本地?cái)?shù)據(jù)同步到遠(yuǎn)程。對(duì)應(yīng)到同步算法,主要區(qū)別在于數(shù)據(jù)分塊和差異編碼位置不同。PULL和PUSH同步模式步驟分別如下所述。
PULL同步模式流程:
1、本地對(duì)文件A進(jìn)行數(shù)據(jù)切分,生成數(shù)據(jù)塊描述文件chunk;
2、上傳chunk文件至遠(yuǎn)程服務(wù)器;
3、遠(yuǎn)程服務(wù)器對(duì)文件B進(jìn)行差異編碼,生成差異編碼文件delta;
4、下載delta文件至本地;
5、本地同步文件A至文件B,相當(dāng)于下載文件B到本地文件A。
PUSH同步模式流程:
1、遠(yuǎn)程服務(wù)器對(duì)文件B進(jìn)行數(shù)據(jù)切分,生成數(shù)據(jù)塊描述文件chunk;
2、下載chunk文件至本地;
3、本地對(duì)文件A進(jìn)行差異編碼,生成差異編碼文件delta;
4、上傳delta文件至遠(yuǎn)程服務(wù)器;
5、遠(yuǎn)程同步文件B到A,相當(dāng)于上傳文件A到遠(yuǎn)程文件B。
