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