資料鏡像備份工具:rsync
什麼是rsync ?
rsync 是Linux/UNIX系統下的檔案同步工具和資料傳輸工具,它采用:“rsync算法”使一個客戶機和遠端檔案伺服器之間的檔案同步。
rsync傳輸的範圍:通過rsync可以将同一個伺服器的資料從一個分區備份到另一個分區,也可以将本地系統的資料通過網絡傳輸方式備份到任何一個遠端主機上;
rsync可以在中斷之後恢複傳輸;rsync隻傳輸源檔案和目标檔案之間不一緻的部分;
rsync可以執行完整備份或增量備份
rsync的特性:
1、可以鏡像儲存整個目錄樹和檔案系統
2、可以增量同步資料、檔案傳輸效率高,因而同步時間短
3、可以保持原有檔案的權限、時間等屬性
4、加密傳輸資料,保證資料的安全性
5、可以使用rcp、ssh等方式來傳輸檔案,當然也可以直接通過Socket連接配接傳輸檔案。
6、支援匿名傳輸
rsync的首頁位址為:http://rsync.samba.org/
rsync的應用模式:
第一種:shell應用模式,也稱為本地shell模式;
第二種:遠端shell應用模式,是利用SSH執行底層連接配接和加密傳輸;
第三種:是查詢(也叫清單)模式,與ls指令實作的功能類似;
最後一種是伺服器模式,平時所說的架設rsync伺服器是指這種模式。
下面來說一下這四模式的應用:
1、本地shell模式
本地shell模式主要用于複制指定目錄到另外一個目錄,例如:
[root@localhost ~]# rsync -av /var /tmp // -a 表示以遞歸的方式傳輸檔案,并保持所有檔案的屬性;-v 表示輸出詳細資訊。
....
.....
var/www/usage/webalizer.png
var/yp/
var/yp/nicknames
var/yp/binding/
sent 65435260 bytes received 20012 bytes 43636848.00 bytes/sec
total size is 65359881 speedup is 1.00
[root@localhost ~]# ls /tmp
var
這時在/tmp下裡有一個var目錄
[root@localhost ~]# rsync -av /var/ /tmp
www/usage/webalizer.png
yp/
yp/nicknames
yp/binding/
sent 65435223 bytes received 20011 bytes 43636822.67 bytes/sec
account cache crash cvs db empty games gdm lib local lock log mail nis opt preserve racoon run spool tmp tux var www yp
這時在/tmp下有很多目錄,這些目錄是var下的所有目錄。
[root@localhost ~]# rsync -av /var /tmp
[root@localhost ~]# rsync -av /var/ /tmp
對于上面這兩個指令所不同之處就是在var後面有沒有那個斜杠,
對于第一個指令是就是将指定的源目錄複制到指定的目的目錄;
對于第二個指令就是複制指定源目錄中的内容到目的目錄中,而不是目錄本身。
而對于目标參數的後面是否有斜杠沒有任何作用
2、遠端shell模式
通過遠端shell模式,rsync可以把指定的本地目錄複制到另一個系統中。例如:
[root@localhost ~]# rsync -av /var 192.168.35.4:test
[email protected]'s password:
如果以root使用者身份來執行此指令,rsync會提示輸入遠端主機192.168.35.4的root密碼。完成密碼驗證後,會在遠端主機的root使用者根目錄下建立test目錄,如果所指定的目錄存在則不建立。在預設情況下,rsync使用Secure Shell(SSH)作為傳輸機制。
3、rsync清單模式
在這個模式下,rsync與ls指令有些相似的功能。例如,檢視本地系統中/tmp/var/目錄的内容,
[root@localhost ~]# rsync -a /tmp/var
... ...
-rw-r--r-- 3714 2012/06/20 10:26:41 var/www/usage/index.html
-rw-r--r-- 1478 2006/07/13 10:18:28 var/www/usage/msfree.png
-rw-r--r-- 2056 2012/06/20 10:26:41 var/www/usage/usage.png
-rw-r--r-- 29976 2012/06/20 10:26:41 var/www/usage/usage_201206.html
-rw-r--r-- 1253 2006/07/13 10:18:28 var/www/usage/webalizer.png
drwxr-xr-x 4096 2012/06/19 17:08:19 var/yp
-rw-r--r-- 185 2006/07/13 13:00:59 var/yp/nicknames
drwxr-xr-x 4096 2009/04/15 17:03:41 var/yp/binding
也可以來檢視遠端主機的
[root@localhost ~]# rsync -a 192.168.35.4:test/var
[email protected]'s password:
4、伺服器模式
這種模式是基于C/S模式的,這種模式下,rsync在背景啟用了一個守護程序,這個程序在rsync伺服器永久的運作,用于接收檔案傳輸請求,是以,用戶端既可以把檔案發送給守護程序,也可以向守護程序請求檔案。rsync的伺服器模式非常适合于異地的中心備份伺服器或資料異地存儲庫來使用。關于伺服器模式的使用方法。
下面來針對這種模式做一個實驗:
有兩台伺服器:A和B 所用的系統是Linux,A 系統作為網站伺服器,B作為A的遠端容災備份機,是以A就是rsync的伺服器端,B是rsync的用戶端。
所用的Linux版本是:Red Hat Enterprise 5.4
核心版本:2.6.18-164.el5
A系統的ip位址:192.168.35.3 255.255.255.0
B系統的ip位址:192.168.35.4 255.255.255.0
在兩台伺服器上分别下載下傳安裝上rsync這個軟體,安裝過程:
下載下傳位址:http://rsync.samba.org/,這裡用的是:rsync-3.0.9 下面進行編譯安裝:
# tar zxvf rsync-3.0.9.tar.gz
# cd rsync-3.0.9
# ./configure
# make
# make install
這樣就完成了rsync的安裝
下面來為實驗做一些配置
1、在A系統上配置rsync
rsync的配置檔案為/etc/rsyncd.conf 在安裝完rsync時預設是沒有這個檔案的,手動建立一個就行了。rsync.conf 檔案由一個或多個子產品結構組成的。
配置檔案如下:
uid = nobody
gid = nobody
-------------這兩項是指定當該子產品傳輸檔案時守護程序應該具有的使用者ID群組ID,預設值是“nobody”------------
use chroot = no
max connections = 10
--------這項是指定子產品的最大并發連接配接數量,以保護伺服器。如果是0說明沒有限制-------
strict modes = yes
----------這項是指定是否檢查密碼檔案的權限,yes為是,no為否,如設定yes,密碼檔案的權限必須是root使用者的權限---------
pid file = /var/run/rsyncd.pid
----rsync守護程序對應的PID檔案路徑-----------
lock file = /var/run/rsync.lock
-----------用來支援 max connections的鎖檔案,預設值是 /var/run/rsyncd.lock--------
log file = /var/log/rsyncd.log
----日志檔案輸出檔案路徑-----
--------下面定義的是一個子產品,也是要複制的内容和一些所要用到的檔案定義-----
[ixdba]
path = /var -------指定要複制的檔案或者目錄,是必須要設定的項------
comment = ixdba file
ignore errors
--------忽略一些無關的I/O的錯誤--------
read only = no -----設定為no表示客戶可以上傳檔案,設定為yes表示隻讀------
write only = no -----設定為no表示客戶可以下載下傳檔案,設定為yes表示不能下載下傳----
hosts allow = 192.168.35.4 ---設定可以連接配接rsync伺服器的主機,也可以設定為 “*” 表示允許連接配接任何主機-----
hosts deny = 172.16.0.1 ---表示拒絕連接配接的主機---
list = false ----設定當客戶請求可以可以使用的子產品清單時,該子產品是否被列出來。預設值true,設定為false為隐藏的子產品--------
uid = root
gid = root
auth users = backup -----用來定義可以連接配接該子產品的使用者名,多個使用者可以用逗号或者空格隔開。需要注意的是,這裡的使用者和Linux系統使用者沒有任何關系。-------
secrets file = /etc/server.pass ------------------這個一個檔案的路徑,這個檔案是用來定義使用者名和密碼的。 這個與auth users配合使用的,隻有在auth users被定義時,該檔案才起作用。這個檔案也要自己來建立---------
完整的配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[ixdba]
path = /var
comment = ixdba file
ignore errors
read only = no
write only = no
hosts allow = 192.168.35.4
hosts deny = 172.16.0.1
list = false
uid = root
gid = root
auth users = backup
secrets file = /etc/server.pass
下面來建立/etc/server.pass檔案
# vim /etc/server.pass 添加如下内容即可:
backup:ixdba123
還要改變一下這個檔案的權限:
# chmod 600 /etc/server.pass
2、在A系統上啟動rsync守護程序
執行如下指令啟動rsync守護程序:
# /usr/local/bin/rsync --daemon
來檢視一下
[root@localhost ~]# ps aux | grep rsync
root 1498 0.0 0.1 4184 552 ? Ss 15:57 0:00 /usr/local/bin/rsync --daemon
說明程序啟動了,再來看一下873端口是否打開了。
[root@localhost ~]# netstat -tlnp | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1498/rsync
tcp 0 0 :::873 :::* LISTEN 1498/rsync
873端口也打開了。這樣在A上就配置完成了,下面來B上來做一些工作。
3、在B伺服器上配置rsync
在備份機上是不用做太的多設定的,隻要執行rsync同步操作即可。為了不在同步的過程中不用輸入密碼,隻要在B伺服器上建立一個檔案就行了也就相當于A上的server.pass檔案
# vim /etc/server.pass
在裡面隻要有一個密碼就行了。
ixdba123 ---這個密碼一定要于A伺服器上的server.pass檔案中寫的密碼相同不然會出錯的。
下面來執行同步操作:
[root@localhost ~]# /usr/local/bin/rsync -vzrtopg --delete --progress --exclude "*access*" --exclude "debug*" [email protected]::ixdba /ixdba.net/ --password-file=/etc/server.pass
在這個指令中參數的含義如下:
在 “-vzrtopg”選項中,v 是詳細模式輸出;z表示即在傳輸時對備份的檔案進行壓縮處理;r表示遞歸模式處理;t是用來保持檔案時間資訊;o是用來保持檔案屬主資訊;p用來保持檔案權限;g是用來保持檔案的屬組資訊。
--delete 指定以rsync伺服器端為基準進行資料鏡像同步,也就是要保持rsync伺服器端目錄與用戶端目錄的完全一緻。在這裡是A為基準進行同步的。
--progress 用于顯示資料鏡像同步的過程
--exclude 用于排除不需要傳輸的檔案類型。
“[email protected]::ixdba”表示對伺服器192.168.35.3中的ixdba子產品進行備份,也就是指定備份的子產品。backup表示使用“backup”這個使用者對子產品進行備份。
“/ixdba.net”用于指定備份檔案在用戶端機器上的存放路徑,也就是将備份的檔案放在備份機的/ixdba.net目錄下。
--password-file=/etc/server.pass 用來指定客戶機上存放密碼檔案的位置,這樣在用戶端執行同步指令就無需輸入互動密碼。
其實,rsync作為用戶端工具,還有很多的選項和參數,更多詳細可以man rsync 一下,來檢視。
在用戶端執行這個指令時可能會出現一些,意想不到的錯誤,這些錯誤的解決方法在網上都能找到,在這裡也貼出一些常見的錯誤。
Rsync同步常見問題:
錯誤一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
解決:這是因為密碼設定錯了,無法登入成功,檢查一下rsync.pwd,看客服是否比對。還有伺服器端沒啟動rsync 服務也會出現這種情況。
錯誤二:
password file must not be other-accessible
continuing without password file
Password:
解決:這是因為rsyncd.pwd rsyncd.sec的權限不對,應該設定為600。如:chmod 600 rsyncd.pwd
錯誤三:
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
解決:這是因為你在 rsync.conf 中設定的 path 路徑不存在,要建立目錄才能開啟同步。
錯誤四:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
解決:對方沒開機、防火牆阻擋、通過的網絡上有防火牆阻擋,都有可能。關閉防火牆,其實就是把tcp udp 的873端口打開。
我在執行這個指令時出現了最後一種錯誤,把iptables關閉後,指令就執行成功了。
在用戶端也可以定義一個任務計劃來實作自動備份也就是加入crontab
# crontab -e
或 # vim crontab
*/5 * * * * root /usr/local/bin/rsync -vzrtopg --delete --progress --exclude "*access*" --exclude "debug*" [email protected]::ixdba /ixdba.net/ --password-file=/etc/server.pass
儲存退出,就執行了。
也可以寫成一個腳本來執行。
以上方法是實作了rsync的遠端熱備份,但不是實時備份,伺服器端和用戶端的資料有可能存在不一樣,因為在備份的時候有一段時間間隔。
很好的是,Linux 2.6.13以後的核心提供了inotify檔案系統監控機制,通過rsync與inotify的組合,可以實作rsync伺服器端和用戶端資料的實時同步。
這個會在下一篇文章中出現。
本文轉自 ZhouLS 51CTO部落格,原文連結:http://blog.51cto.com/zhou123/904097