備份排程
使用rsync,cron程式

使用rsync,一般來講己經足夠了,但是排程是一個大問題,由於rsync可以跨平 台,因此寫一個程式來排應該不是大問題,因此我想寫一個python來排程,可以跨平台,或者也寫成視窗介面給windows使用吧?

關鍵:
備份的動作很簡單,只要套用rsync的命令就好了,但是rotate 比較煩,也就是我們將備分的檔案的檔名及目錄的移動的判斷,日,星期,月,等的檔案遞移順序

備份的時間區隔
一般的考慮是年,季,月,星期,日,但我想了一下,需要備到年嗎?應該不需要吧,本人是想一般能備份在月己經很好了,而超過月的以光碟燒起來,這樣應該不 會太誇張吧!

日備份:至於每天的要考慮上班的時間及系統檔案資料會不會變動,如一般公用的程式放在網上或是資料庫,一般只有在有人上班的時間才會有變動,但是上班時間 有1-5或1-6或每天都有人上班,因此必需讓使用者可以設定

星期備份:一個月有幾個星期4個星期左右至多5個,因此備分超過4個應該要找的就可以在月的備分中找到,因此如果保留太多的備份會重複,或是儲存空間不夠

月備份:保留上個月就好了

磁碟的備份空間
我建議是以一個全新的硬碟,所做,但是你首先要先測試
1.欲備份來源的大小
2.打包壓縮後的大小
如果以上述來說,一星期五天,四個星期再加一個月,及一個暫存壓縮檔的空間
預計要11個打包空間(如果使用壓縮bzip,我減少為原來的1/4-1/5大小)加一個來源同步的空間
例如,1Gb的資料,1+11/4=3.78,大約是4倍於預計要備份的來源檔的大小,當空間不夠時你可以縮減
以下是我認為至少有的
週-2
月-1
日-3
6/4+1=2.5


運作原理
建立一個工作目錄
建立rsync_dest_dir -昨日的備份
建立daily1,daily2,daily3.daily4,daily5,daily6,daily7 -根據你的設定5,6或7天
建立week1,week2,week3,week4
建立month
建立一個暫存目錄
昨天的備份都是放在 source
每次定時執行
1.壓縮檔案到暫存目錄
1.檢查日期是否
   A.月的第一天
   B.週的第一天
   有四種狀況
 
AB均不成立
daily最後一個目錄的資料刪除,其它的daily遞移,最後將剛壓 好的送入daily1的目錄
AB均成立
因為月的等級高週一級,所以刪除month的檔案,將壓縮檔移入 month,而日及星期不動
只A成立
同上
只B成立
因為週的等級高日一級,所以刪除week4的檔案,其它的week遞 移,最後將剛壓好的送入week1

   上述的作法不會同一個檔案備份在不同的目錄中,但是daily及week可能會缺一天或是一週,這個要記住
2.rsync更新source
  這個簡單,只是如何指定多個呢?

壓縮的檔案名稱以年-月-日,如果要跨半夜,則由使用者自己行設定

備份的目錄結構
以下是我預設的備份目錄結構,
rsync_dest_dir-昨日備份,不壓縮或打包使用rsync更新的
dialy-其內包含了1、2、3.....根據你設定一週內備份的天數
week-保留的星期數,內定4個星期
month-保留的月數
以上dialy,week,month都是使用rotate的原理如果1內放入新的則其它的會遞移,而最後一個會被丟棄掉


環境參數的設定
必須能夠設定rysnc 及排程,使用crond
目前有點懶,因此全部寫在一個python的程式中,然後特到/etc/cron.daily
至於壓縮的程式可以使用tar-(gz,bz2),或是zip


程式寫到一半覺得,都寫在一個程式 會不會太雜了一點,可不可以分成幾個小小小程式,或則是幾個程式,要不要把程式寫得很好呢?有man有-h 等等
因為我是使用crontab來排程,因此寫成幾個小程式rsync_daily,rsync_weekly,rsync_monthly
在各程式中,都會去讀取設定檔,如此寫程式就可以單純一點,但是還沒有試

目前碰到瓶頸,是否要設定如下的環 境檔,如rsyncd.conf的設定一般
[global]
定義執行的工作模組
work_modules=work1,work2,work3......workn
#定義每一個工作模組
[work1]
host=
...

[work2]
[work3]
..
[workn]

rotate的處理
是否要寫一個函式專門處理遞移的問題,由於我使用的遞移包含了用目錄
1-檔案
2-檔案
3-檔案
4-檔案
因此遞移有兩種方法,
   3目錄內的檔案->4目錄內
   2............->3....
   1............->2
2.刪除目錄4
   3目錄更名->4
   2........->3
   1........->2
如果我們使用方法2,而暫存壓縮檔在tmp內
是不是目錄tmp更名為1就可以了,然後再建一個新的tmp