問題:
如何增量同步檔案,例如乙個文字檔案有10m,分別存放在a,b兩個地方,現在兩個檔案是完全一樣的,但是我馬上要在a上對這個檔案進行修改,b如何實現自動和a上的檔案保持一致,並且網路的傳輸量最少。
應用場景:
這樣的使用場景太多,這裡隨便列舉幾個
1.a機器為線上運營的機器,現在需要一台備份的機器b,當a發生宕機的時候,或者硬碟損壞等各種認為非人為原因導致資料不可用時,可以很快從b恢復
2.svn這樣的應用場景,不需要每次修改都向伺服器傳送並替換掉乙個檔案,而是只傳送被修改的部分
3.手機客戶端對乙個文字修改,如果那個文字有2m,難道我每次更新都需要上傳整個檔案嗎?每次2m,傻子才用!
等等....
解決方案:
一.分而治之
計算機最重要的基本演算法思路就是分而治之,在我們眼裡,乙個檔案不是乙個檔案,而是一堆儲存塊,每個儲存塊可能20byte大小,至於這個值具體多大,你可以自己設定,這裡的20byte僅提供參考。通過這樣的方法,乙個檔案被分成了很多個塊,我們只需要比對塊是否相同就可以得出哪個部分做了相應修改。
二.快速校驗
剛上面提到如何比對檔案,當然這裡肯定不會把檔案的每個塊上傳去比對,那樣做就沒有意義了。快速比對這不禁讓我想起了雜湊規則,雜湊表可以通過o(1)的複雜度查詢某個key,為什麼? 因為它通過計算hash值來初步驗證key,乙個key的hash值是唯一的。但是僅僅驗證hash值是不可靠的,因為hash值有可能會衝突,所以在驗證完hash值後,我們在進行key的比較來確定要找的值...
通過雜湊的思路,我們可以使用類似的方法來實現檔案增量同步,把每乙個儲存塊,通過md5計算其值,然後傳遞md5值到伺服器,讓伺服器比對md5來確定有沒有被修改,如若md5值不相等,則判定這個檔案塊有被修改過
為什麼是md5?
1)能夠將任意長度的字串轉換為128位定長字串(md5 16)
2)md5能夠保證絕大部分情況下不同的值hash之後其hash值不一樣,雜湊衝突比較少
這樣就可以了嗎?
no,md5的生成需要占用比較長的cpu時間,所以我們需要尋找一種更簡潔的校驗方式,這裡選用alder32 是乙個比較通用的解決方案
增量更新同步 檔案增量同步之rsync演算法
之前畢設有用到檔案增量同步,於是乎就記錄一下。在a和b兩個不同端之間有相似度很高的檔案,同時這個檔案又比較大。如果通過全量傳輸來更新,http傳輸量很大,非常不友好。那麼可以通過某些手段,只上傳修改的內容,其餘內容復用舊檔案。對於a b檔案進行同步為例,首先對a檔案進行分塊,並且對每一塊進行摘要計算...
goldengate 實現資料同步增量跟蹤
oracle goldengate有眾多解決方案,其中有乙個可用來實現資料同步增量跟蹤.比如有的業務系統需要實時的記錄某些資料的各種變化,通過ogg可以輕鬆的實現。應用場景 現需要實現對源端庫中空間資料表,資料變化進行監控。源端點空間資料表結構 create table sde point oid ...
時間戳實現增量資料同步
資料同步 1 靠記錄中本身的時間戳來增量更新 分頁獲取必須排序 時間戳 排序後也會出錯 會出現記錄跳過的情況 中途指令碼停止更是會出錯 非分頁的會出問題,指令碼中斷更會出問題 時間戳不能保證是從低到高 解決方法 1 分頁條數為1 並排序但效率不高 2 分頁採用每次獲取比當前時間戳大的的limit條數...