很多人會想要自己架部落格,想說感覺比較特殊,但是自己架部落格真有那麼好?我有時候自己都還會思考搞那麼麻煩幹嘛?反正好處與壞處一言難盡啦!有一點好處就是可以保全自己的資料,但是這可能也是唯一的壞處,因為若你不懂備份又遇到意外什麼都沒了,辛苦地努力的結晶就都荒廢啦~因此像我部落格寫那麼久了,沒什麼東西比資料更重要的!

部落格資料主要分為三塊,第一塊為主程式,第二塊為資料庫,第三塊為檔案與圖片,今天要和大家分享的就是檔案與圖片的備份,其實這一塊備份沒有絕對的技術與方法,反正只要資料消失時能還原就好!我目前所管的網站大概快用掉4GB的空間,若是自己電腦硬碟就算是小空間啦,但是在虛擬主機的話空間也佔用不少,而目前這些資料到底有幾份呢?主站一份是毫無疑問的,但是大家可能都不知道你從網路讀取的資料都不在主站,兩台NB加上一台桌機利用DROPBOX同步資料,所以這樣就有五份了!

但是電腦裡的資料是原始資料,不會套用在真正的網頁架構下,而網頁架構下的資料結構才是最後要備份的,因為還原才可以最快速,我會把這些資料同步到不同的主機,每次部落格更新後這些資料將會傳到五部不同的主機,而這五份資料可以讓我透過.htaccess隨意的切換流量,而同步的方法就是透過SSH+RSYNC。(這樣算下來我的資料有10份ㄟ!)
我知道很多虛擬主機根本沒有開放SSH的權限,所以要用上SSH+RSYNC就不用談了~只能透過FTP SYNC的方式慢慢同步啦!

RSYNC本來就是一個檔案同步的工具,而我備份的方式就是透過ssh來達到RSYNC,我最常用的方式如下:
rsync -e "/usr/bin/ssh" -avzl --delete 來源路徑 遠端主機:遠端路徑

其實就這麼簡簡單單一行而已,然後重複五行我就可以把資料同步到不同主機了,而我只帶出-e ssh透過ssh的方式,特殊的ssh port以及帳號名稱我都不會帶入,因為我會把ssh設定寫在config內,這樣RSYNC的command看起來比較簡單啦!再搭配上ssh的認證,只要網站檔案有更新,同步檔案不過是幾秒鐘的事情。

RSYNC的使用最重要還是在於參數的控制,因為參數真的還不少,同步資料時是要都保持一致?還是資料只增不減?或是有什麼目錄需要過濾?這些都要透過一些參數調整才可以。

像我常用的 -avzl --delete 包含了:
  • -a:使用 archive 模式,保持原有的檔案屬性與權限,相當於-rlptgoD參數。
  • -v:顯示出過程。
  • -z:傳輸時壓縮資料。
  • -l:包含link。
  • --delete:若本地檔案有刪除,遠端也刪除。
最基本的同步檔案這樣就很足夠使用囉!反正就是資料維持一致。

-h , --help     顯示rsync求助資訊.
--version      顯示rsync版本.
-v , --verbose    複雜的輸出訊息.
-q , --quiet      安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.
-I, --ignore-times   通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.可以透過此參數關閉此快速檢查.
--size-only     rsync只檢查檔案大小是否改變,不管時間存取點是否改變.通常用在mirror,且對方時間不太正確時.
-c, --checksum    在傳送之前透過檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)
-a, --archive    archive mode 權限保存模式,相當於 -rlptgoD 參數.保存幾乎所有的權限設定,除了硬式連結(透過-H設定).
-r, --recursive    複製所有下層的資料(遞迴)
-R, --relative      使用相對路徑.
-b, --backup    目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
--backup-dir=DIR 設定備份的資料夾.
--suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).
-K, --keep-dirlinks  接收方將連結到資料夾的檔案視為資料夾處理
-l, --links       複製所有的連結
-H, --hard-links    保留硬式連結
-p, --perms     保留檔案權限
-o, --owner     保留檔案擁有者(root only)
-g, --group      保留檔案群組
-D, --devices     保留device資訊(root only)
-t, --times     保留時間點
-n, --dry-run    不實際執行傳送,只顯示將會有的傳輸動作
-S, --sparse    嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.
-W, --whole-file     複製所有的檔案,不額外作檢查.
--no-whole-file  關閉 --whole-file 參數
-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)
-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce
-e  --rsh=COMMAND 定義所使用的remote shell
--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑
--existing     只比對更新目的端已經存在的檔案
--ignore-existing    忽略目的端已經存在的檔案(也就是不更新)
--delete        刪除傳送端已經不存在,而目的端存在的檔案
--delete-excluded  除了把傳送端已經不存在,而目的端存在的檔案刪除之外,也刪除 --exclude 參數所包含的檔案.
--delete-after    rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.
--ignore-errors    忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.
--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.
--partial      rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.在某種狀況下保留那些部分傳送的檔案是令人高興的.你可以透過 --partial 參數達到這個目的.
--partial-dir=DIR  在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案寫入定義的資料夾,而非直接寫入目的端.需要注意的是,此資料夾不應該被其他使用者可以寫入.(如:/tmp)
--force       當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,即使該資料夾不是空的.
--numeric-ids      不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid
--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.預設為0,也就是沒有定義逾時時間.
-T, --temp-dir=DIR   定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.預設是直接在接收端資料夾直接產生暫存檔案.
--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.
--link-dest=DIR   與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.
-z, --compress       壓縮模式,當資料在傳送到目的端進行檔案壓縮.
-P           -P參數和 --partial --progress 相同.只是為了把參數簡單化.
-C, --cvs-exclude      排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS  CVS.adm  RCSLOG  cvslog.*  tags  TAGS  .make.state
.nse_depinfo  *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.
--exclude=PATTER   符合PATTERN(規則表示式)樣式的檔案不進行傳送
--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.執行時,透過此參數讓rsync讀取.(#開頭的行列或空白行會被rsync忽略)
--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.
--include-from=FILE  和--include參數相同,只不過把要包含的檔案寫到某一檔案.
--files-from=FILE     把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
--version      顯示版本訊息.
--daemon       定義rsync以daemon型態執行.
--no-detach       當以daemon型態執行時,不要進行分裂且變成背景程序.
--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)
--config=FILE    定義所要讀取的設定檔rsyncd.conf位置(daemon限定) 預設值為 /usr/local/etc/rsyncd.conf
--port=PORT     定義rsyncd(daemon)要執行的port(預設為tcp 873)                 
--blocking-io     使用blocking I/O連結遠端的shell,如rsh , remsh
--no-blocking-io     使用non-blocking連結遠端的shell,如ssh (預設值)
--stats       顯示檔案傳送時的資訊狀態
--progress     顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)
--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)
--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼
--bwlimit=KBPS    定義傳輸頻寬的大小(KBytes/秒)
--write-batch=FILE  把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)
--read-batch=FILE  透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)
--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)
-4, --ipv4       使用IPv4協定
-6, --ipv6       使用IPv6協定

更多資訊請參考:
最新超值旗艦機開箱
比螺旋燈泡還省電的迷你 NAS
26800mAh筆電行動電源