rsync的應用

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 選項的效用

image

[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文件同步回來

image

 

以壓縮的方式,並用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 的工具來時時監聽 共享目錄下的數據是否發生變化,如有變化,則利用腳本,推送給從節點

 

  image 下載安裝文件,解壓後配置安裝

[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   ==>讓輸入密碼時一路按回車[即,使用空密碼生成密鑰]

image

進入 /root/.ssh/查看 id_rsa.pub 文件 ,   將這個文件發送到要同步的主機上,並添加到 相應的 /root/.ssh/authorized_keys文件中

image

將生成的公鑰文件傳到要同步的主機上

[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 ==>已同步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章