UnixLinux 自動化管理 資料備份與同步

liypsky發表於2011-01-20
資料是 Unix/Linux 系統中最重要的組成部分 , 但是資料的備份與同步卻是最容易被忽略的任務。透過定期的資料備份與同步,可以在磁碟出現故障時,最大程度的降低資料損失。當使用者誤操作導致資料損壞或者丟失時,可以快速恢復。

資料的備份不同於整個系統備份,將不同資料按照優先順序分類,根據使用者需求,備份重要檔案。

從而使資料獨立於作業系統,降低備份成本與時間。

不同的作業系統可能使用不同的資料備份方式,本文介紹了通用的 Unix/Linux 實用程式(tar 和 cpio),標準的 AIX 實用程式 (mksysb 和 backup),以及遠端備份工具 rsync。[@more@]確定備份策略

在商業環境中,必須首先確定需要備份哪些檔案以及備份所消耗的時間。如果備份過多的檔案,會導致備份系統的成本過於龐大,從而帶來不必要的開支。如果沒有備份足夠的資料,那麼可能導致重要資料的丟失,反而帶來更大的損失。

當然,備份整個系統是簡單易行的,但是通常這樣的備份是浪費的且缺乏意義的。從減少備份系統的成本出發,只有當某些資料足夠重要,需要共享,才具有備份的必要。

基本資料一般分為以下幾類:

* 使用者資料:所有的使用者資料以及使用者目錄,及私人檔案等。
* 系統資訊:系統使用者,組,密碼,主機列表等。
* 應用程式:系統上啟動的服務,比如 web 應用程式,apache 等。
* 應用程式的配置檔案與資料:針對不同的應用程式,不同的配置引數和重要資料檔案。
* 資料庫:事實上資料庫可以單獨提供針對資料庫所有資料的備份與同步功能。

簡單的資料備份是指一次性備份所有資料,然後再備份上次備份之後所做的修改。第一次備份是指“完全備份”,後一次備份是“增量備份”。通常適用於個人或者小型網站。對於機構或者大型網站來說,需要採用“多級備份”。將完全備份設定為 0 級,增量備份的級別分別是 1,2,3 等。在每個增量備份級別上,可備份同級或上一級的上次備份以來的變動。

比如,如果我們有 1 0 盤磁帶,如果使用簡單備份進行日備份,則可恢復兩週內的資料。

如果使用多級備份,例如:

磁帶 1-2, 月備份,每月第一個星期五

磁帶 3-6, 周備份,每週星期五(排除第一週)

磁帶 7-10,日備份,每週星期一到四,則可以將備份歷史擴充套件到兩個月。



實用程式和命令

tar 命令

tar 命令是通用性較強的 Unix/Linux 歸檔命令。tar 將一個或多個檔案和目錄打包為單個檔案,並保持原始檔案的大小、擁有者、許可權、檔案型別及其在檔案系統層次結構中的位置。tar 是磁帶存檔程式 (tape archive) 的首字母縮寫,是最易用的資料備份實用程式。

表 1. tar 命令的常用引數:
引數 含義
-c 該引數會建立一個新的存檔
-v 該引數會列出每個處理的檔名稱
-f 該引數會指定存檔或裝置名稱
-z 該引數將用 gzip 對存檔進行壓縮或解壓
-x 該引數將從存檔檔案中提取一個或多個檔案

要建立 /CriticalData 的存檔檔案,使用:

# tar -czvf backup.tar.gz /CriticalData/


要恢復該目錄,使用:

# tar -xzvf backup.tar.gz /CriticalData/


tar 在提取檔案和較小的目錄方面表現不錯,如果要恢復檔案系統和卷組,我們更傾向於選用 cpio, 或是使用專用性更強的 Linux/Unix 資料備份實用程式。

cpio 命令

cpio 與 tar 類似,是通用性較強的 Unix/Linux 歸檔命令。一般被用來備份和恢復檔案及目錄結構。

表 2. cpio 命令的常用引數:
引數 含義
-o 該引數會將資料複製到檔案或裝置中
-i 該引數會將資料從檔案或裝置中還原到系統中
-v 該引數會列出每個處理的檔名稱
-z 該引數會按需要建立目錄
-x 該引數會從標準輸入讀取檔案路徑名稱,然後將這些檔案複製到指定的目錄
-d 該引數會按需要建立目錄
-p 該引數會從標準輸入讀取檔案路徑名稱,然後將這些檔案複製到指定的目錄
-B 該引數會將 I/O block 增加到 5120bytes,預設是 512bytes。加快資料備份速度
-m 該引數會保留時間屬性
-u 該引數自動將較新的檔案替換到較舊的檔案

將 /CriticalDate 目錄和它的所有檔案和子目錄建立存檔,使用:

# find /CriticalData/ -depth | cpio -ov > backup.cpio


要恢復該目錄,使用:

# cpio -ivdum

cpio 建立起來的歸檔檔案包括檔案頭和檔案資料兩部分。檔案頭包含了對應檔案的資訊。如檔案的 UID,GID,連線數以及檔案大小等。其好處是可以保留硬連線,在恢復時預設情況下保留時間戳,無檔名稱長度的限制。

mksysb 介紹

IBM AIX 與其它的 Unix 系統相比 , 有兩個重要的特性: LVM (logical volume manager) 和 ODM (object database manager)。一般而言 , 用 cpio 或 tar 的指令亦可以備份 volume groups ,

但並不能完全正確的備份完整的系統。利用 mksysb 來備份時,可製作一個可開機的磁帶 , 並且可以正常的還原系統的 LVM 和 ODM。

mksysb 備份一般用來在檔案中或可啟動磁帶上建立 rootvg 的可安裝映象。如果需要對使用者卷組進行備份的話,可使用 savevg。

mksysb 的格式包括:

* 基本作業系統啟動映象
* 基本作業系統安裝映象
* 虛擬目錄 (TOC)
* rootvg 上的實際資料


圖 1. mksysb 的格式

mkinsttape 映象包括以下重要檔案:

* Tapeblksz 該檔案包含執行 mksysb 前設定的磁帶驅動器的塊大小。
* bosinst.data 該檔案指定目標系統的需求以及基本作業系統安裝程式是怎樣執行
* image.data 該檔案包含安裝過程中實際安裝的映象的描述資料(檔案大小、名稱、裝入點等)。

表 3. mksysb 命令的常用引數:
引數 含義
-e 該引數將不備份 /etc/exclude.rootvg 檔案中定義的檔案
-i 該引數將呼叫 mkszfile 命令自動生成一個新的 image.data 檔案
-m 該引數將呼叫 mkszfile 命令生成對映檔案

在執行 mksysb 前,可以執行 mksysb -i 命令來自動生成一個新的 image.data 檔案。虛擬 TOC 可以確保 mksysb 磁帶中包含的映象數與基本作業系統安裝磁帶中的映象數相同。最後,rootvg 資料包含用 mksysb 命令備份的實際資料。它實際上會使用 backup 命令儲存 rootvg 中所有裝入的檔案系統的內容。

如果對使用者卷組進行備份的話,可使用下列的命令:

# savevg -if /dev/rmt0 uservg


其中,-i 引數將呼叫 mkvgdata 命令;-f 引數將資料儲存到指定裝置或檔案中。

backup 介紹

backup 是 AIX 系統提供的一種備份檔案和檔案系統的方法,其本身就可以支援增量備份和多級備份,不必藉助其它方式,其好處在此不在贅述。

表 4. backup 命令的常用引數:
引數 含義
-level 該引數指定備份級別(0-9), 預設是 9
-i 該引數將按名稱備份整個檔案系統
-f 該引數將資料備份到指定裝置中
-p 該引數在歸檔之前先打包或壓縮,且小於 2G 的檔案。適用於不活動的檔案系統
-q 該引數指可移動介質已準備就緒
-u 該引數將用檔案系統的原始裝置名稱 , 時間日期以及備份級別來更新 /etc/dumpdates 檔案
-v 該引數將在 backup 時顯示附加資訊

將 /CriticalDate 目錄和它的所有檔案和子目錄備份到指定裝置,使用:

# find /CriticalDate -depth | backup -i -f /dev/rmt0


將-level 和 -u 引數結合,可以進行多級和增量備份:

# backup -0 -uf /dev/rmt0 /home


rsync 介紹

如果將資料備份與遠端傳輸結合起來,譬如 scp,就可以實現資料的遠端備份。但通常的備份方法,都無法對本地和遠端目錄中的內容進行同步。

rsync(Remote Sync)是 Unix/Linux 系統下一款優秀的資料備份與同步工具。它可以對檔案集進行同步。然而更有價值的是,rsync 使用檔案的增量,也就是說,它在網路中僅傳送兩個檔案集合有區別的部分。這樣可以佔用更少的頻寬,並且速度更快。

rsync 的特性:

* 能夠更新整個目錄樹和檔案系統
* 保持原檔案的許可權,時間,軟硬連結
* 安裝無需特殊許可權
* 最佳化的流程,檔案傳輸速率高
* 可以透過直接的 socket 連線傳輸檔案,或者選擇 rsh,ssh 等方式
* 支援匿名傳輸

表 5. rsync 命令的常用引數:
引數 含義
-a 該參數列示以遞迴方式傳輸檔案,並保持所有檔案屬性
-v 該引數顯示詳細的傳輸處理
-z 該引數對備份的檔案在傳輸時進行壓縮處理
-P 該引數將顯示備份過程

如果在客戶端對伺服器上的重要資料進行備份的話,可使用下列的命令:

清單 1. rsync 命令演示


#rsync – avzP rsync@Server::CriticalData /Backup

===========================
This is Critical Data Server
===========================

receiving file list ...
9 files to consider
Location/
Location/Locationlist1
97164953 13% 1.11MB/s 0:08:57


706609152 100% 1.17MB/s 0:09:37 (xfer#1, to-check=5/9)
Name/Name1
44 100% 0.16kB/s 0:00:00 (xfer#2, to-check=3/9)
Name/Name2
22 100% 0.08kB/s 0:00:00 (xfer#3, to-check=2/9)
Time/Monday
17 100% 0.06kB/s 0:00:00 (xfer#4, to-check=0/9)

sent 32111 bytes received 497214837 bytes 847820.88 bytes/sec
total size is 706609242 speedup is 1.42


首次傳輸過程進行完全備份,當再次執行該命令時,rsync 將只傳輸資料的增量。從而完成增量備份。

如果在客戶端對伺服器上的重要資料進行同步的話,可使用下列的命令:

# rsync -avzP --delete rsync@Server::CriticalData /Backup


這裡呼叫 --delete 選項,表示客戶端上的資料要與伺服器端完全一致,如果 /Backup 目錄中有伺服器不存在的檔案,則刪除。從而保持客戶端與伺服器的資料同步。

注意:謹慎使用 --delete 選項,最好不要把已經有重要數所據的目錄當做客戶端的備份目錄,否則會誤刪除重要資料。

如果用客戶端的備份資料去恢復伺服器,可使用下列的命令:

#rsync – avzPO /Backup/ rsync@Server::CriticalData


這裡需要將 rsync.conf 中 read only 設定為 false,同時使 /CirticalData 目錄具有寫許可權。

注意:也可呼叫 --delete 選項來保持客戶端與伺服器端的資料同步。在後面,將詳細介紹 rsync.conf 的配置。-O 引數用於忽略目錄的時間屬性。



資料備份與同步的自動化實現

系統管理員必須執行的資料備份與同步任務大多牽涉到某種形式的系統配置,當管轄的任務比較龐大,資料量較多,但操作一樣且有固定週期時,採用自動化指令碼就成為必然。尤其是為多個作業系統提供支援時。

要實現自動化操作,指令碼編制是必須掌握的基本技能。一個指令碼由一系列命令構成,這些命令負責執行各種各樣的任務。系統管理員在重複執行了幾遍類似的命令後,通常就能準確地掌握要點,並希望利用指令碼,將重複性的工作交給計算機去做。常用的指令碼語言有 Shell,Perl,Tcl/Expect 等。

實用命令的自動化實現

本文的示例主要是透過 Shell 來實現的。Shell 是一種“解釋性”語言,列出了管理員透過鍵盤敲入的相同命令, 並且每次執行一次這樣的命令。

例如執行一條簡單的 tar 命令,可以使用下面的一個簡單的指令碼。

清單 2. tar 自動化示例指令碼


#!/bin/sh
tar -czvf backup.tar.gz /CriticalData/


如果我們想用其它的命令來實現資料備份,可以將以上的示例指令碼中的命令部分替換掉,例如執行一條簡單的 cpio 命令,可替換為下面一個簡單的指令碼。

清單 3. mksysb 自動化示例指令碼


#!/bin/sh
find /CriticalData/ -depth | cpio -ov > backup.cpio


事實上我們可以透過 shell 中一些變數設定,條件測試以及流程控制語句來實現不同的需求。例如,管理員希望能夠在週一到週日,透過 backup 命令做多級備份。

我們可以設定 Level 變數,當變數滿足不同條件時,就可以實現多級備份。

清單 4. backup 自動化示例指令碼


#!/bin/sh

// 判讀當前系統的日期是星期幾
DATE=`date | awk '{ printf $1 }'`
case $DATE in
Mon) LEVEL=1;;
Tue) LEVEL=2;;
Wed) LEVEL=3;;
Thu) LEVEL=4;;
Fri) LEVEL=5;;
Sat) LEVEL=6;;
Sun) LEVEL=7;;
esac

// 備份命令
backup -$LEVEL -uf /dev/rmt0 /home


雖然各種實用程式和命令以及引數各不相同,但 shell 自動化指令碼的基本思路是類似的。如果系統管理員需要連續地定期地執行指令碼,可以藉助 Unix/Linux 系統的 crontab 功能。

rsync 的自動化實現

由於 rsync 在資料備份與同步上的優秀表現,本文將主要介紹用 rsync 來實現資料的備份與同步。

要使用 rsync,只需要將主伺服器安裝並配置成為 rsync 伺服器,將另外一臺裝有 rsync 的機器作為備份客戶端。在對 rsync 伺服器配置結束以後,就可以在客戶端發出 rsync 命令來實現將伺服器端的檔案備份到客戶端來。在客戶端建立自動化指令碼,並啟用 cron 服務,就可以定期對主伺服器的資料進行自動備份與同步。

1. 在伺服器端手動建立 rsync 配置檔案

建立 rsync.conf 作為伺服器配置檔案

假設我們在伺服器端,設定需要備份的目錄 /CriticalData, 但不需要備份 /CriticalData 目錄下的 Common 目錄。

先建立一個目錄,用於存放 rsync 相關配置檔案

# mkdir /etc/rsyncd


建立 rsync.conf

#touch /etc/rsyncd/rsyncd.conf


編輯 rsyncd.conf

清單 5.rsyncd.conf 配置檔案


清單 5.rsyncd.conf 配置檔案


gid = users
read only = true
use chroot = true
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.0.0/255.255.255.0
max connections = 5
timeout = 300
motd file = /etc/rsyncd/rsyncd.motd

[CriticalData]
path = /CriticalData
list = true
ignore errors
comment =This is Critical Data
auth users = rsync
secrets file = /etc/rsyncd/rsyncd.secrets
exclude = Common/


rsync.conf 中主要分為全域性變數和模組兩部分。模組用 [ ] 表示,模組之前的為全域性變數。

重要引數說明:

path
指定該模組所定義的備份目錄的路徑,該引數是必須指定的。

exclude
用來指定多個由空格隔開的多個檔案或目錄 ( 相對路徑 ),並將其新增到 exclude 列表中。這等同於在客戶端命令中使用 --exclude 引數。一個模組只能指定一個 exclude 選項。但是需要注意的一點是該選項有一定的安全性問題,客戶端很有可能繞過 exclude 列表,如果希望確保特定的檔案不能被訪問,那就最好結合 uid/gid 選項一起使用。

auth users
該選項指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連線該模組。這裡的使用者不一定是客戶端存在的使用者。如果"auth users"被設定,那麼客戶端發出對該模組的連線請求時,需要對使用者身份進行驗證。使用者的名和密碼以明文方式存放在"secrets file"選項指定的檔案中。預設情況下無需密碼就可以連線模組 ( 也就是匿名方式 )。

建立 rsync.secrets 作為使用者密碼檔案

#touch /etc/rsyncd/rsyncd.secrets
#chmod 600 /etc/rsyncd/rsyncd.secrets


編輯 rsyncd.secrets, 格式為“使用者 : 密碼”

rsync:passwd


注意:rsync是伺服器上存在的使用者,同時將/CriticalData的使用者改為rsync

#chown -R rsync /CriticalData/


建立 rsync.motd 作為登入訊息檔案

此檔案是選擇性配置檔案,也可以不建立。

#touch /etc/rsyncd/rsyncd.motd


編輯 rsyncd.conf

============================
This is Critical Data Server
=============================



2. 啟動 rsync

將 rsync 啟動

#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf


可以將這個命令寫入 /etc/rc.d/rc.local 中,當系統啟動時,自動執行 rsync。
3. 建立指令碼

在客戶端建立一個 /root/rsync/ 目錄用來存放自動化指令碼和其它檔案。

建立 /root/rsync/rsync.sh 自動化指令碼,保證許可權為 755。


清單 6. rsync 自動化示例指令碼


#!/bin/sh

export RSYNC_PASSWORD=passwd
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

// 設定遠端伺服器與需要備份的目錄
SERVER=rsync@Server
DIR=CriticalData

// 設定客戶端上的用於備份的目錄
BDIR=/Backup
BASE=Current
INCREMENTDIR=`date +%Y-%m-%d`

// 在客戶端靈活使用 exclude 功能;設定日誌
EXCLUDES=/root/rsync/excludes
LOG=/tmp/rsync.log

// 引數設定,呼叫 backup-dir 將伺服器端的增量檔案儲存到 INCREMENTDIR 目錄下
OPTS="-avz--force --delete --delete-excluded --exclude-from=$EXCLUDES -b
--backup-dir=$BDIR/$INCREMENTDIR --ignore-errors"

// 確保客戶端上的用於備份的目錄存在
install -d $BDIR/$BASE

// 實現資料備份與同步,將日誌郵寄給 root 使用者
run_rsync()
{
echo "==========Begin rsync: `date`===========" >>$LOG 2>&1
du -s $BDIR/* >>$LOG 2>&1
rsync $OPTS $SERVER::$DIR $BDIR/$BASE >>$LOG 2>&1
echo "==========End rsync: `date`===========" >>$LOG 2>&1
mail root -s "Backup Report" < $LOG
rm $LOG
}

// 條件測試,執行程式
if [ -f $EXCLUDES ]; then
if [ -d $BDIR ]; then
run_rsync
else
echo "cant find $BDIR"; exit
fi
else
echo "cant find $EXCLUDES"; exit
fi


執行完 rsync.sh 後,可以檢視 /Backup 目錄來檢查資料的正確性。將有兩種目錄,一個是 Current 目錄,用於存放當前伺服器端備份和同步後的資料。在指令碼執行過程中,進行增量傳輸。另外還有一個類似於 2009-06-16 的目錄,用於存放已在伺服器端刪除的增量資料。目錄的名稱將根據指令碼執行的日期定義。

# pwd
/Backup
# ls
2009-06-16 Current



4. 啟用 cron 服務,實現定期自動備份

如果系統管理員需要連續地定期地執行指令碼,那麼就需要藉助 Unix/Linux 系統的 crontab 功能,使系統可以定期地呼叫 rsync.sh 指令碼。

使用命令“crontab -e”編輯 crontab,新增一條類似於以下的項:

0 0 * * * /root/rsync/rsync.sh 2>&1>>/root/rsync/rsync_cron.log


重新啟動 cron 服務,並用“crontab – l” 檢視任務是否新增成功。也可以定期檢視 /root/rsync/rsync_cron.log 來監控 cron 服務的執行情況。
5. 監控指令碼的執行過程

如果配置正確 , rysnc.sh 的執行過程將會郵寄給 root 使用者,透過 mail 命令可讀取這些郵件。


清單 7. 使用 mail 命令讀取監控輸出

# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root@cdlf2ler02.clus Tue Jun 16 16:53 32/1050 "Backup Report"
&


敲入回車,可顯示具體的郵件內容。類似於:


清單 8. 郵件內容


Message 1:
From root@cdlf2ler02.clusters.com Tue Jun 16 16:53:35 2009
Date: Tue, 16 Jun 2009 16:52:14 -0400
From: root
To: root@cdlf2ler02.clusters.com
Subject: Backup Report

==========Begin rsync: Tue Jun 16 16:52:14 EDT 2009===========
16 /Backup/Current
===========================
This is Critical Data Server
===========================


receiving file list ... done
deleting b/
./
Location/
Name/
Name/Namelist1

sent 214 bytes received 317 bytes 1062.00 bytes/sec
total size is 3 speedup is 0.01
==========End rsync: Tue Jun 16 16:52:14 EDT 2009===========




小結

本文介紹了在 Unix/Linux 上廣泛應用的實用命令和程式。隨著磁碟的容量變得越來越大,要想跟蹤所有的資料更加困難。只有更好的瞭解資料組成,進行資料分類,分析重要資料,結合工具的使用,才能低成本,高效率的進行資料備份與同步。自動化的實現同時也為資料備份與同步提供了很大的方便性,是另一種節省時間和精力並減少人工錯誤的方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/678020/viewspace-1044922/,如需轉載,請註明出處,否則將追究法律責任。

相關文章