認真的測試過網上的大多數文章和版本,真正能一次性測試通過的文章太少了,需要反覆的推敲,反覆的查閱資料,才能真正的測試成功,所以,在此背景下,總結了Rsync,加上自己的理解分享出來;
1、 原理篇
Rsync,故名思議,是一個遠程數據同步工具,可以鏡像整個目錄樹和文件系統,也可以保持源文件的權限,時間和軟硬鏈接,可以優化數據,文件重複數據的刪除,也可以在LAN/WAN之間快速的同步多臺主機的數據,這主要得益於Rsync的壓縮和Rsync的核心算法,其算法,是本地和遠程兩臺主機之間的文件達到同步並保持一致,並且只傳送兩個文件的不同部分,而不是整個數據進行傳送,所以,速度非常快;
一個Rsync server能夠同時備份多個客戶端數據,也可以一個客戶端備份多個Rsync server的數據;
Rsync 支持搭配scp,ssh和daemon模式,默認端口是873,當第一次連接的時候,會對數據進行完整備份,之後的所有備份,都是進行增量備份,只備份又變化的數據;
Rsync只支持單向備份,不支持雙向,如果需要雙向同步的,可以使用Unison;如果需要實時同步的,可以結合Rsync+inotify;
Rsync服務以只讀方式提供要備份的數據,避免破壞生產環境的數據;
在這裏,有必要對Rsync的核心算法,進行講解:
假定在名爲 α 和 β 的兩臺計算機之間同步相似的文件 A 與 B,其中 α 對文件A擁有訪問權,β 對文件 B 擁有訪問權。並且假定主機 α 與 β 之間的網絡帶寬很小。那麼 Rsync 算法將通過下面的五個步驟來完成:
β 將文件 B 分割成一組不重疊的固定大小爲 S 字節的數據塊。最後一塊可能會比 S 小。
β 對每一個分割好的數據塊執行兩種校驗:一種是32位的滾動弱校驗,另一種是128位的 MD4 強校驗。
β 將這些校驗結果發給 α。
α 通過搜索文件 A 的所有大小爲 S 的數據塊(偏移量可以任選,不一定非要是 S 的倍數),來尋找與文件B 的某一塊有着相同的弱校驗碼和強校驗碼的數據塊。這項工作可以藉助滾動校驗的特性很快完成。
α 發給 β 一串指令來生成文件 A 在 β 上的備份。這裏的每一條指令要麼是對文件 B 經擁有某一個數據塊而不須重傳的證明,要麼是一個數據塊,這個數據塊肯定是沒有與文件 B 的任何一個數據塊匹配上的。
Rsync適用於linux、solaris和bsd,在windows平臺下,有cwRsync。
本文,將以Linux的Rsync和以window的cwRsync爲例講解。
2、 Rsync服務端
2.1、 安裝
源碼安裝
下載rsync服務端程序,
tar zxvf rsync-2.6.9.tar.gz
cd rsync-2.6.9
./configure --prefix=/usr/local/rsync
make
make install
rpm安裝
yum install rsync
本文以yum來安裝
2.2、 服務器運行模式
模式選擇
對於負載比較重的,選擇獨立服務啓動
對於負載比較輕的,選擇以xinet.d啓動,選擇此模式,記得要安裝xinet.d (yum install xinet.d)
獨立運行模式
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf (本例選擇此方法)
如果需要系統開機啓動,可以把上面命令加入到/etc/rc.local文件中。
2.3、 服務器配置
創建配置文件和口令文件
touch /etc/rsyncd.conf 主要配置文件
touch /etc/rsync.pas 口令文件,此文件需要注意客戶端和服務器端的格式,後續會講解
關於配置文件rsyncd.conf講解
Rsync的配置文件,分爲兩個部分,全局配置和模塊配置,
#全局設置
uid = root 指定模塊以root用戶來傳輸文件,如果匿名用戶的話,這裏填寫nobody
gid = root 指定模塊以root用戶組來傳輸文件,如果匿名傳輸的話,這裏填寫nobody
use chroot = yes 設置爲YES,表示在傳輸文件之前,定位到根目錄下,即PATH指定的目錄,這樣做,主要是出於安全考慮
pid file = /var/run/rsyncd.pid Rsync守護進程把其PID寫入的文件
lock file = /var/run/rsync.lock 指定支持max connections的鎖文件
log file = /var/log/rsyncd.log 指定Rsync守護進程產生的日誌文件,而不是傳送給syslog
#模塊設置
[Jindie] 模塊名稱,後續上傳下載文件配置時,直接使用此名稱名來指定
path = /sda1/JDdatabase 指定此模塊的根目錄,即文件上傳下載都是在此目錄下進行
ignore errors 指定在 rsync 服務器上運行 delete 操作時是否忽略 I/O 錯誤
read only = false 指定是否允許上傳,false代表允許上傳。
write only = false 指定是否允許下載,false代表允許下載。
list = true 指定當客戶請求列出可以使用的模塊,該模塊是否被列出。如果false,可以創建隱藏的模塊。
hosts allow = 192.168.1.65 指定哪些客戶端可以訪問連接此模塊,可以指定單個IP,整個網段,比如此例爲單個IP
hosts deny = 0.0.0.0/0 指定哪些客戶端不允許連接此模塊,此例爲0.0.0.0/0網段,代表整個網絡
通常表示客戶端表示方式,有如下:
單個IP:192.168.1.65
網段IP:192.168.1.0/24
可解析的主機地址:www.baidu.com
域內主機:*.wine9.com
所有主機:*
多個列表項,要用空格隔開;
auth users = xy 指定認證用戶名,通常由空格或者逗號分隔用戶名列表,只有這些用戶可以連接此模塊,用戶名和密碼,以明文形式,保存在口令文件中
syslog facility = local5 指定日誌等級,一般指發送給rsyslog的日誌等級;
secrets file = /etc/rsync.pas 指定Rsync認證口令文件,只有配置了auth users,此配置才生效,這裏要注意客戶端和服 務器端的配置格式。
ignore nonreadable 指定 rysnc 服務器完全忽略那些用戶沒有訪問權限的文件,這對於在需要備份的目錄中有些不應該被備份者獲取的文件時非常有意義
timeout 600 設置客戶端連接超時時間,確保服務器不會永遠等待一個奔潰的客戶端。
dont compress=*.gz 指定哪些文件在傳輸之前,不需要進行壓縮的文件。
max connections = 4 指定此模塊最大的併發連接數爲4,超過的告知隨後再試
exclude指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 exclude 列表中。這等同於在客戶端命令中使用 –exclude 來指定模式。
Exclude from指定一個包含 exclude 規則定義的文件名,服務器從該文件中讀取 exclude 列表定義
include指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 include 列表中。這等同於在客戶端命令中使用 –include 來指定模式
Include from指定一個包含 include 規則定義的文件名,服務器從該文件中讀取 include 列表定義
2.4、 建立Rsync口令文件
創建口令文件
touch /etc/rsync.pas #口令文件,保存Rsync用戶和密碼驗證信息,不需要是系統賬號;
vi /etc/rsync.pas
xy:abc123 #格式爲 用戶名:口令,此賬號不用是系統賬號
注意與後面的客戶端口令文件的格式進行比較,相較兩者不同點,這一點,有很多童鞋容易弄錯了,重要的事情說三遍,注意格式,注意格式,注意格式。
2.5、 口令文件權限
口令文件,需要設置口令文件權限,這一步同樣非常重要,Rsync對權限的要求還是比較敏感的。
#chown root:root /etc/rsync.pas #root:root 指的是當前啓動此服務的用戶,並設置爲屬主
#chmod 600 /etc/rsync.pas #指定啓動此Rsync服務的用戶的權限爲只讀權限,也就是前面提到的屬主的權限。
3、 Rsync客戶端
客戶端本例,選擇windows的cwrsync工具,安裝不用多說。
3.1、 創建口令文件
新建rsync.pas文件,添加內如如下:
因爲我使用的用戶名是xy,此設置的密碼,必須跟服務器端rsync.pas口令文件中設置的密碼一樣,比如本例口令爲abc123;
那麼,本例中設置爲:
abc123
3.2、 口令文件權限
windows口令文件的權限一定要設置正確,否則驗證無法通過,應將口令文件c:\rsync.pas的權限加入系統登錄的賬號讀取權限以及設置其爲該文件的所有者(這裏跟服務器端有點不同,正常來說,無論windows還是liunx,服務器端的這個用戶名,應該是啓動Rsync服務的用戶名,但是對於windows客戶端來說,一般都是系統登錄賬號)
定位到cwRsync客戶端安裝目錄,C:\Program Files (x86)\cwRsync\bin
chmod 600 /cygdrive/c/rsync.pas
chown administrator /cygdrive/c/rsync.pas #如果沒有chown.exe文件,可以從服務器端的安裝目錄的bin目錄下直接複製過來就可以使用,
注:Rsync對路徑的書寫格式,與windows不同,它是遵循,postfix書寫格式,
3.3、 同步文件
Rsync同步的六種格式
當Rsync已經做好服務器端和客戶端的配置之後,接下來就是通過Rsync命令,像服務器發起命令請求,來完成文件的同步操作,Rsync的功能非常強大,提供了六種格式,來支持Rsync的六種工作方式;
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
對於以上六種命令格式,
1) rsync [OPTION]... SRC DEST
拷貝本地文件,當SRC和DEST路徑信息都不包含有單個冒號“:“,就啓動此工作模式,
rsync.exe –vzrtopg /data /backup
2) rsync [OPTION]... SRC [USER@]HOST:DEST
使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啓動該模式。如:rsync -avz *.c foo:src
3) rsync [OPTION]... [USER@]HOST:SRC DEST
使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啓動該模式。如:rsync -avz foo:src/bar /data
4) rsync [OPTION]... [USER@]HOST::SRC DEST
從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含"::"分隔符時啓動該模式。如:rsync -av [email protected]::www /databack,其中www是在rsync配置文件中,指定的模塊的名稱。
5) rsync [OPTION]... SRC [USER@]HOST::DEST
從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啓動該模式。如:rsync -av /databack [email protected]::www,其中www是在rsync配置文件中,指定的模塊的名稱。
6) rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
列遠程機的文件列表。這類似於rsync傳輸,不過只要在命令中省略掉本地機信息即可。如:rsync -v rsync://172.16.78.192/www
上傳同步文件
rsync.exe -vzrtopg --progress --delete /cygdrive/c/test/*.txt [email protected]::Jindie --password-file=/cygdrive/c/rsync.pas
解釋:
rsync.exe 即rsync命令
vzrtopg 指定參數,傳輸的詳細信息;
--delete 刪除哪些在DST中存在,而SRC中沒有存在的文件或者目錄
/cygdrive/c/test/*.txt 注意這裏的格式,不能使用windows的格式,必須使用POSTFIX標準格式;
[email protected]::Jindie xy是有權訪問服務器的用戶名,192.168.31.13是服務器地址,Jindie是服務器端配置文件中指定的模塊,這個模塊中指定用戶信息和同步路徑;服務器地址和模塊之間,用兩個冒號隔開。
--password-file=/cygdrive/c/rsync.pas 口令文件,當中含有xy賬號的密碼,要與服務器端配置文件rsyncd.conf中指定的口令文件中設置的密碼相同。
下載同步文件
rsync.exe -vzrtopg --progress --delete [email protected]::Jindie /cygdrive/c/test --password-file=/cygdrive/c/rsync.pas
通常,因爲上傳和下載的方向性不同,直接調換源文件路徑和目標地址的路徑,即可。
4、 定時同步備份
把上面的命令寫入到批處理器文件中,比如test.bat,通過任務計劃來實現定時備份。
C:\Program Files (x86)\cwRsync\bin
rsync.exe -vzrtopg --progress --delete /cygdrive/c/test/*.txt [email protected]::Jindie --password-file=/cygdrive/c/rsync.pas
複製上面命令,保存到test.bat文件中,
開始 -- 所有程序-- 附件--系統工具--任務計劃程序
展開 任務計劃程序庫--Microsoft,右擊 “創建基本任務“
創建基本任務嚮導,輸入 ”名稱”
點擊 “下一步”
任務觸發器,根據實際需要,設置每日,每週,每月同步,這裏,我選擇每日備份,可以減少帶寬壓力。
設置,每日啓動的時間,這裏設置每日,凌晨1點,點擊 “下一步”
選擇 “啓動程序“
瀏覽,選擇 腳本文件
點擊 ”完成 “
到此,部署,已經全部完成。