rsync是一個遠程同步工具,可以在本主機,或者在遠程主機上完成數據遠程同步,基於rsync算法,檢測本主機,或者遠程主機源目標之間的數據是否相同,來完成數據同步.
特點:
1、可以鏡像保存整個目錄樹或文件系統;
2、較高的數據傳輸效率;
3、可以藉助於ssh實現安全數據傳輸;
4、支持匿名傳輸;
rsync命令的工作模式:
第一種模式:shell模式,也稱作本地模式;類似cp 命令,但是它仍然基於rsync算法做比較,效率不及cp,所以它不能完全代替cp命令
第二種模式:遠程shell模式,可以利用ssh協議承載其遠程傳輸過程;可以實現安全傳輸
第三種模式:列表模式,僅列出源中的內容,-nv
第四種模式:服務模式,此時rsync工作爲守護進程,能接收客戶端的數據同步請求;也可以爲客戶端更新數據, 能push,pull
rsync命令的選項:
-n: 同步測試,不執行真正的同步過程;
-v: 詳細輸出模式
-q: 靜默模式
-c: checksum,開啓校驗功能
-r: 遞歸複製
-a: 歸檔,保留文件的原有屬性;
-p: 保留文件的權限;
-t: 保留文件的時間戳;
-l: 保留符號鏈接
-g: 保留屬組
-o: 保留屬主
-D:保留設備文件
-e ssh: 使用ssh作爲傳輸承載;
-z: 壓縮後傳輸;
--progress: 顯示進度條
--stats: 顯示如何執行壓縮和傳輸
注意:rsync命令中,如果源路徑是目錄,且給複製路徑時末尾有/,則會複製目錄中的內容,而非目錄本向;如果末尾沒有/,則會同步目錄本身及目錄中的所有文件;目標路徑末尾是否有/無關緊要;
例1: 我們將 /etc/passwd 同步到 /tmp 下, 加 –n 選項,僅做測試
[root@mode_11 ~]# rsync -nv /etc/passwd /tmp/ 加 -n 選項,僅做測試
passwd
sent 30 bytes received 15 bytes 90.00 bytes/sec
total size is 1623 speedup is 36.07 (DRY RUN) =>顯示 DRY RUN 就表示僅做測試
[root@mode_11 ~]# ls /tmp/ =>查看 /tmp 目錄, 沒有passwd文件
my.repo
[root@mode_11 ~]# rsync -v /etc/passwd /tmp/
passwd
sent 1693 bytes received 31 bytes 3448.00 bytes/sec
total size is 1623 speedup is 0.94
[root@mode_11 ~]# ls /tmp =>去掉 n 選項後,passwd文件就同步過來了
my.repo passwd
例2, 拷貝 /etc/profile.d 目錄,看 加/ 與不加的區別
[root@mode_11 ~]# rsync -r /etc/profile.d/ /tmp/test =>源目錄加/
[root@mode_11 ~]# ls /tmp/test/ ==>很明顯,是將 /etc/profile.d 目錄下所有的文件都拷過來
colorls.csh cvs.csh glib2.csh gnome-ssh-askpass.csh lang.csh less.csh qt.csh udisks-bash-completion.sh vim.sh
colorls.sh cvs.sh glib2.sh gnome-ssh-askpass.sh lang.sh less.sh qt.sh vim.csh
[root@mode_11 ~]# rsync -r /etc/profile.d /tmp/test ==>源目錄不加 /
[root@mode_11 ~]# ls /tmp/test/
colorls.csh cvs.sh gnome-ssh-askpass.csh lang.sh profile.d udisks-bash-completion.sh which2.sh
colorls.sh glib2.csh gnome-ssh-askpass.sh less.csh qt.csh vim.csh
cvs.csh glib2.sh lang.csh less.sh qt.sh vim.sh
我們再開一臺虛擬機, 用rsync 傳輸測試一些大文件
-e ssh: 使用ssh作爲傳輸承載;
-z: 壓縮後傳輸;
--progress: 顯示進度條
例,本機是 172.16.26.6,將本機上的 /etc 目錄,遞歸併以壓縮的方式發送到 172.16.26.11主機上的/tmp/test目錄下
[root@php5_6 src]# rsync -rz /etc [email protected]:/tmp/test
[root@mode_11 ~]# ls /tmp/test/
etc
例,傳送一個大文件,演示—stats 以及 –progress 選項的效用
[root@php5_6 src]# rsync -rz -e ssh --stats --progress /tmp/all.tar.gz [email protected]:/tmp/test
[email protected]'s password:
sending incremental file list
all.tar.gz
119062528 100% 18.07MB/s 0:00:06 (xfer#1, to-check=0/1)
Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 119102576
Total bytes received: 31
sent 119102576 bytes received 31 bytes 10356748.43 bytes/sec
total size is 119062528 speedup is 1.00 ==>輸送的結果
在目標主機上查看,文件是否傳輸過來
[root@mode_11 ~]# ls /tmp/test/
all.tar.gz etc
那麼遠程傳輸到本地呢?也很簡單,我們把剛纔發送過去的 all.tar.gz文件同步回來
以壓縮的方式,並用ssh安全的將11主機上的/tmp/test/all.tar.gz 同步到本地的/root目錄下
[root@php5_6 src]# rsync -rz -e ssh --stats --progress [email protected]:/tmp/test/all.tar.gz /root/
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
receiving incremental file list
all.tar.gz
119062528 100% 22.93MB/s 0:00:04 (xfer#1, to-check=0/1)
Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 30
Total bytes received: 119102581
sent 30 bytes received 119102581 bytes 8213973.17 bytes/sec
total size is 119062528 speedup is 1.00 ==>同步回本地的結果
[root@php5_6 src]# ls /root
all.tar.gz apr-1.5.0 bincp.sh busybox-1.22.1.tar.bz2 httpd-2.4.6 install.log.syslog nginx-1.4.7 pcre-8.35
同步結果已然在目標目錄中
驗證rsync的同步工作機制
刪除11主機上的/tmp/test/etc下的兩個文件
[root@mode_11 test]# rm -f etc/man.config etc/issue
測試同步時,是否只是同步這兩個文件
[root@mode_11 test]# rsync -zr -e ssh --stats --progress [email protected]:/etc /tmp/test/
skipping non-regular file "etc/ssl/certs" ==>例如,如果目標位置,文件已存在,會顯示 skipping跳過
etc/issue ==>需要同步的,則會顯示 傳輸的進度和速率
47 100% 45.90kB/s 0:00:00 (xfer#1, to-check=1183/1227)
etc/man.config
4963 100% 4.73MB/s 0:00:00 (xfer#2, to-check=1168/1227)
rsync 的服務器模式
例,我們將172.16.26.11 作爲rsync服務器端
[root@mode_11 xinetd.d]# mkdir /data =>創建一個目錄,作爲rsync的數據同步目錄
rsync 平時訪問比較少,所以它是委託xinetd 超級守護進程監聽
yum install xinetd =>如果超級守護進程沒安裝,執行該命令安裝
如果超級守護進程已安裝,在 /etc/xinetd.d目錄下,會有一個 rsync 的配置文件
[root@mode_11 test]# cd /etc/xinetd.d/
[root@mode_11 xinetd.d]# ls
chargen-dgram daytime-dgram discard-dgram echo-dgram rsync
將 rsync 文件中的 disable 選項,改爲no,以開啓 rsync服務器模式
disable = no
2、爲rsync提供配置文件
/etc/rsyncd.conf
配置文件分兩段:
全局配置段:1個
共享配置段:多個
[SHARE_NAME]
配置示例:
# Global Settings 全局配置
uid = nobody
gid = nobody =>運行身份
use chroot = no =>是否切換根路徑運行
max connections = 10 =>最大併發連接數
strict modes = yes =>是否是嚴格模式,檢查權限是否能上傳,下載等
pid file = /var/run/rsyncd.pid =>運行的pid
log file = /var/log/rsyncd.log =>運行日誌
# Directory to be synced
[mydata]
path = /data =>共享工作目錄
ignore errors = yes => 是否忽略錯誤[如傳輸過程中,某一文件出現錯誤]
read only = no =>是否只讀
write only = no => 是否只可上傳, 別人不能看
hosts allow = 172.16.0.0/16 =>訂義能訪問的列表
hosts deny = * => 出了能匹配到的,都不允許
list = false =>是否允許列出共享目錄列表
uid = root => 共享用戶,專門針對這個共享的身份配置
gid = root =>共享組, 也是專門針對 rsync 服務訂義的
注,該服務監聽在tcp的873 端口
rsync有兩種工作模式,一種是從遠程服務器上推送數據,另一種是將數據從服務器上更新到本地
例,我們在服務端的主機上的rsync服務目錄是 /data
將本地的文件,推送到服務器上的mydata共享上
[root@php5_6 ~]# rsync bincp.sh 172.16.26.11::mydata
查看服務器上的共享目錄
[root@mode_11 ~]# cd /data/
[root@mode_11 data]# ls
a.txt bincp.sh =>OK,共享成功
那麼,要將rsync服務器上的文件同步到本地,該怎麼做呢
[root@php5_6 tmp]# rsync -a 172.16.26.11::mydata/ ./ =>將服務器上的文件同步到本地的當前目錄下,
[root@php5_6 tmp]# ls
a.txt bincp.sh ==>同步OK
如果只想同步某一指定文件,需要在共享目錄名稱後,加上具體文件名字
[root@php5_6 tmp]# rsync 172.16.26.11::mydata/a.txt ./ =>清空本地/tmp目錄, 同步遠程服務器上的 mydata共享的a.txt文件
[root@php5_6 tmp]# ls
a.txt
在服務器端,單純的以ip地址段來設定訪問權限,不靈活,也不安全,還可以實現以用戶認證的方式,來限制訪問權限
讓服務器端提供用戶認證功能
在/etc/rsyncd.conf 主配置文件中
添加如下兩行
auth users = robert,judy ==>認證用戶名單
secrets file = /etc/rsyncd.passwd ==> 配置認證用戶密碼 , 注意,認證的密碼不能超過8位數
[root@mode_11 xinetd.d]# vim /etc/rsyncd.passwd =>編輯密碼文件
robert:abcabc
judy:abcabc
密碼認證文件的權限必須是600,否則重啓服務會失敗
[root@mode_11 xinetd.d]# chmod 600 /etc/rsyncd.passwd
[root@mode_11 xinetd.d]# service xinetd restart =>重啓超級守護進程
從遠程服務器同步數據到本地
[root@php5_6 tmp]# rsync [email protected]::mydata/abc.abc ./ =>同步遠程共享目錄下的abc.abc文件到本地
Password: =>輸入正確密碼
[root@php5_6 tmp]# ls
abc.abc =>OK, 數據同步成功
本地推送數據到服務器端
[root@php5_6 tmp]# touch my.rsync =>在本地創建一個文件
[root@php5_6 tmp]# rsync my.rsync [email protected]::mydata =>推送到服務器上
Password: =>輸入正確的認證密碼
去服務器端檢查
[root@mode_11 xinetd.d]# ls /data/
abc.abc a.txt bincp.sh my.rsync ==>ok, 文件推送成功
要實現主rsync服務器的數據和 從rsync服務器的數據同步,那該怎麼辦呢?
我們可以使用一個 inotify 的工具來時時監聽 共享目錄下的數據是否發生變化,如有變化,則利用腳本,推送給從節點
[root@mode_11 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@mode_11 inotify-tools-3.14]# make && make install
安裝完成後,使用該工具監聽 /data目錄, 體驗一下 inotify的功用
[root@mode_11 bin]# /usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib /data
/data/ CREATE b.txt
/data/ ATTRIB b.txt
/data/ DELETE a.txt
另開一個終端,在/data 目錄裏,創建,刪除文件等操作, 上述監聽都能監測到
有了這個監聽保證,我們可以寫一個腳本,讓它開機自動運行,就能實現rsync作爲主服務器數據發生變化後
向從服務器推送數據了.
在主服務器 11 上生成密鑰
[root@mode_11 ~]# ssh-keygen -t rsa ==>讓輸入密碼時一路按回車[即,使用空密碼生成密鑰]
進入 /root/.ssh/查看 id_rsa.pub 文件 , 將這個文件發送到要同步的主機上,並添加到 相應的 /root/.ssh/authorized_keys文件中
將生成的公鑰文件傳到要同步的主機上
[root@mode_11 .ssh]# rsync id_rsa.pub [email protected]:/root
[email protected]'s password: =>正確輸入目標主機密碼,文件就可以傳輸過去了
將該文件的內容導入到 /root/ .ssh/authorized_keys 中
[root@php5_6 ~]# cat id_rsa.pub > .ssh/authorized_keys
[root@php5_6 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqm/kmH8IJ2aI1mw2Q1zpHTWCY3XvX4XzvRQSG4cpcp8g3uEE6kf00Wm2HaLOZ3qK1ZbgbiNzUrd8fPPDYjRjc0Pz70ehyXnmkQEIsphRM7WFMmeruVjmWe47d7JfT/5fHsqgEJLHxOaN9fTDEn1jy5CPljp0oARg8gBvKlR9TIBiE1yGmncsYBwoan99kpT5KEhkhowQTHORpSkB54bLtGdIjE8C89asF7MmTtGqAG8779aC3r9Jjw2OZQOA42WecJOUNijPm1YFWAVxLVL+mZ0/Ixb4ZKtc0JWLZ2X45JPB4h+3D1EjFHKWMWfPfaHk3jyTPf6sMIZPuejatLNebQ== root@mode_11.cc
我們去 11 主機上連接目標主機,
[root@mode_11 ~]# ssh [email protected]
Last login: Sun Aug 24 16:33:53 2014 from 172.16.26.176 =>ok,不需要輸入密碼,就能認證通過了,
OK,前期準備工作都已完成,那麼我們可以寫腳本了
[root@mode_11 ~]# vim /usr/local/inotify/bin/inotify.sh ==>編輯這個文件 內容如下
#!/bin/bash
src=/data
[email protected]:/data
/usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib $src | while read file ;do =>當inotifywait 監測到目標目錄有變化時,將執行while 循環中的語句
/usr/bin/rsync -aqz -e ssh ${src}/ ${mb_ip} && echo $file" send is ok" ==>利用ssh 協議承載傳輸,同步本地源和目標機的數據
# /usr/bin/rsync -aqz -e ssh /data [email protected]:/data
done
[root@mode_11 bin]# ./inotify.sh 運行該腳本
在172.16.26.11上的另一個終端窗口,創建一個 a.txt 文件
[root@mode_11 data]# touch a.txt
在腳本運行窗口查看
[root@mode_11 bin]# ./inotify.sh
/data/ CREATE a.txt send is ok
/data/ ATTRIB a.txt send is ok ==>監聽端顯示,發送已成功
[root@php5_6 data]# ll ==>在目標主機上查看文件
total 0
-rw-r--r--. 1 root root 0 Aug 24 17:04 a.txt ==>已同步