2012-02-18 60 views
2

假設我每天都創建一個備份副本,並假定每個備份都是單個壓縮文件,並在其文件名中包含時間戳信息。假設備份每天都在運行,我怎樣才能保留最近1年的備份只有100個備份副本?

現在,我想編寫一個每日運行的腳本,刪除較舊的備份並只保留100個備份。但是,這100個備份分佈在1年之內,因此我仍然擁有1年的副本,但是我應該擁有更多的最近備份副本和更少的較舊備份副本,即在任何給定時刻,兩個倖存的連續備份隨着時間的推移,副本不斷增加。

算法還應該考慮到它將每天運行一次。

此外,有沒有這樣的算法的名稱 - exponential range?exponential distance?non-linear backup expiry?logarithmic something?什麼?

如果你在回答中包含代碼,我更喜歡Ruby(但不是必須的,因爲如果它是用另一種語言,我可以手動將其轉換爲Ruby)。

+2

你確定你需要將此代碼自己?像這樣的系統在諸如dirvish之類的東西中實現。它進行增量備份(所以你不會多次獲得相同的文件!),但同時有快照。它還可以定義您的到期規則(例如,最近15天,然後每週開始4周,然後開始本月等)。不確定這是否是你想要的,所以不是答案,但是看一看? http://www.dirvish.org/(我不以任何方式與dirvish,只是一個用戶有關)。 – Nanne 2012-02-18 11:39:00

回答

1

讓我描述一個非常簡單的算法,可能適合你。

首先爲每天分配一個全球日期計數器,說基督之後的天數。你想紅寶石,所以我會告訴你怎麼做,在紅寶石(這表明,今天是第七十三萬四千九百十八日)

require "Date" 
Date.today - Date.new(0) 

現在讓我來告訴你哪些文件保留:你把所有文件從過去30天,對於接下來的40個文件,每個文件的索引可以被2整除,接下來的80個文件每天保持索引可以被4整除,接下來的120個文件保存每個索引可以被8整除的文件,剩下的85/86每個文件的索引可以被16整除。因此,隨着時間的推移,你將需要檢查是否需要刪除一些存儲的文件,並且永遠不需要顯示已經擦除的文件。告訴我你是否也需要這種邏輯的代碼。

1

保留過去兩個月的所有內容以及去年的每個星期日備份都會導致超過100個文件。易於解釋,易於執行,並且事先知道備份是否存在。 未經測試:

require 'date' 
def bup_name(date=Date.today) 
    "#{date.to_s}.bup" 
end 
def delete(fname) 
    #todo: exception handling 
    File.delete(fname) if File.exist?(fname) 
end 

today = Date.today 
# make backup bupname(today) 
delete(bup_name(today << 12)) 
two_months_ago = today << 2 
delete(bup_name(two_months_ago)) unless two_months_ago.sunday? 
2

這聽起來像你正在考慮類似的Tower of Hanoi。磁帶備份系統有時使用這種方式來管理備份磁帶。維基百科文章有幾種算法。當你學習遞歸時,它經常用作編程練習。

該遊戲基於將一堆不同大小的磁盤從一個釘到另一個釘,而不需要在較小的磁盤上放置一個更大的磁盤。如果你有五套磁帶,標記爲A到E,你最終會像這樣移動它們。

ABA 
CABA 
DABACABA 
EABACABADABACABA 

最不經常使用的集合是E,所以如果你從1月1日開始,E就會像這樣結束。

E     Jan 1 
ABA     Jan 2-4 
CABA     Jan 5-8 
DABACABA    Jan 9-16 
EABACABADABACABA  Jan 17-Feb 1 

E組將在1月17日被覆蓋。1月16日的覆蓋面將會是這樣。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
E    D   C  B A 

A ruby program that solves the Tower of Hanoi puzzle

+0

維基百科有很好的表格:http://en.wikipedia.org/wiki/Backup_rotation_scheme – DataWraith 2012-02-18 13:46:32

+0

@DataWraith:Duh。我甚至沒有想過要查看備份輪換,只是TOH。 – 2012-02-18 14:44:19