rsync+inotify實現文件同步

一、前言

什么是rsync,remote synchronize遠程同步簡寫。Linux系統上由rsync這個軟件包提供。rsync有幾個特點,鏡像保存整個文件目錄樹或文件系統;有較高的數據傳輸效率;可以借助ssh實現安全數據傳輸;支持匿名傳輸等。rsync同步只是針對變化的文件進行傳輸,意味著其會在源和目標之間比較文件的異同。相對與scp來說,第一次傳輸兩邊都效率都差不多。但以后傳輸相同目錄下的文件時,rsync只傳輸變化的文件,而非像scp直接覆蓋。inotify是linux的一種文件變化通知機制,用來監控文件系統的操作,linux內核2.6.13以上支持inotify。rsync和inotify經常搭配使用實現跨主機實時同步。由于rsync要對比源和目標的文件差異。在海量小文件的時候,使用起來效率低。

二、rsync基本用法

man下文檔可以發現,rysnc語法有如下

       Local:  rsync [OPTION...] SRC... [DEST]

       Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

       Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

2.1、工作模式

從中也可以看出rsync工作有3中模式

1.本地模式

2.遠程shell模式,可以利用ssh協議承載遠程傳輸過程

3.服務模式,此時rsync工作為一個守護進程,能接收客戶端的數據同步請求。rsync守護進程依賴于xinetd進程。

2.2、參數說明

sync命令的選項:

    -n    :同步測試,不執行真正的執行過程
    -v    :詳細輸出模式
    -q    :靜默模式
    -c    :checksum,開啟校驗功能
    -r    :遞歸復制
    -a    :歸檔,保留文件的原屬性
    -p    :保留文件的權限
    -t    :保留文件的時間戳
    -l    :保留符號連接
    -g    :保留屬組
    -o    :保留屬主
    -D    :保留設備文件
    -e    ssh    :使用ssh作為傳輸承載
    -z    :壓縮后傳輸
    --progress    :顯示進度條
   --stats    :顯示如何執行壓縮和傳輸
   --password-file    :指定密碼文件
   --delete    :刪除目標目錄多余的文件
注意:rsync命令中,如果源路徑是目錄,且其復制路徑時末尾有/,則會復制目錄中的內容,而非目錄本身,如果末尾 沒有/,則會同步目錄本身中的所有文件,目標路徑末尾是否有/無關緊要
更多的選項解釋請自行查看manual。

三、inotify基本用法

inotify在2.6.13內核上是默認支持的,其只是一個用C語言寫的api。如果要調用這個api需要編寫代碼調用。但是有個工具:inotify-tools工具幫我們省去了這一步驟。我們直接調用inotify-tools提供的命令便可監控文件系統的變化。inotify-tools工具epel源中有提供,否則請執行編譯安裝。Inotify-tools工具安裝后提供了兩個命令

/usr/bin/inotifywait :監控文件系統變化

  /usr/bin/inotifywatch :用來統計文件系統訪問的次數

3.1、inotifywait用法

inotifywait  [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt<fmt> ] <file> [ ... ]
-h	:幫助
-c	:輸出CSV(comma-separated values)格式
-m	:監控
-r	:遞歸
-q	:安靜模式
-e	:事件
-t	:超時
--timefmt		:設置事件格式
--format		:輸出指定格式
更多的選項解釋請自行查看manual。

四、rsync服務器搭建

rsync服務器上

[root@vm ~]# cat /etc/rsyncd.conf 
# Global Setting
uid = nobody                            #運行rsync服務器的用戶角色
gid = nobody                            #運行rsync服務器的組角色
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
[data]                                    #module name
path = /data                            #存放路徑
ignore errors = yes                    #傳輸出錯時是否中斷傳輸
read only = no                         #只讀
write only = no                        #只寫
hosts allow = 192.168.0.0/16           #允許主機范圍
hosts deny = *                         #拒絕主機范圍
uid = root                              #以什么身份角色工作于/data目錄下,可覆蓋全局配置
gid = root
auth users = leon                      #認證用戶,必須是密碼文件中的一個
secrets file = /etc/rsync.passwd       #密碼問
建立密碼文件
[root@vm tmp]# cat /etc/rsync.passwd  #密碼文件
leon:leon                                 #用戶:密碼   形式存儲
重啟服務
[root@vm ~]# service xinetd start     #啟動xinetd進程
設置iptables
[root@vm ~]# iptables -t filter -A INPUT -d 192.168.226.128 -p tcp --dport=873 -j ACCEPT        #放行策略
[root@vm ~]# iptables -t filter -A OUTPUT -s 192.168.226.128 -p tcp --sport=873 -j ACCEPT       #放行策略
mkdir /data                                                                                                 #建立存儲目錄

rsync客戶端上

建立密碼文件
[root@vm ~]# cat /etc/rsync.passwd                     #建立密碼文件
leon

[root@vm tmp]# iptables -t filter -A INPUT -s 192.168.226.128 -p tcp --sport=873 -j ACCEPT    #放行策略
[root@vm tmp]# iptables -t filter -A OUTPUT -d 192.168.226.128 -p tcp --dport=873 -j ACCEPT    #放行策略

兩臺主機都設置selinux為permissive

setenforce 0

測試:在客戶端上測試

[root@vm ~]# rsync -avz --progress --delete --password-file=/etc/rsync.passwd leon@192.168.226.128::data /data
receiving incremental file list
created directory /data                        #在客戶端上把文件pull到服務器
./
aa
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=2/4)
bb
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=1/4)
tom/

sent 99 bytes  received 218 bytes  634.00 bytes/sec
total size is 0  speedup is 0.00
[root@vm ~]# ls /data
aa  bb  tom
[root@vm ~]#

在客戶端上配倉庫,監控同步腳本

[root@vm tmp]# cat /etc/yum.repos.d/epel.repo 
[epel]
name=epel
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-$releasever&arch=$basearch
enabled=1
gpgcheck=0
[root@vm tmp]# yum install -y inotify-tools
[root@vm data]# cat /tmp/rsyncInotify.sh     #此腳本利用inotify機制監控到文件變化時,通過管道的方式實現觸發功能,把文件push到服務器上
#!/bin/bash                                        
#
host='192.168.226.128'
user='leon'
monitorFile='/data/'
dest='data'
passwdFile='/etc/rsync.passwd'
inotifywait -mrq -e modify,attrib,moved_to,moved_from,move,move_self,create,delete,delete_self --timefmt='%d/%m/%y %H:%M' --format='%T %w%f %e' $monitorFile | while read chgeFile ;do
rsync -avqz --delete --progress --password-file=$passwdFile $monitorFile $user@$host::$dest &>>/var/log/messages
done

客服端測試

[root@vm data]# sh -n /tmp/rsyncInotify.sh                #檢測語法
[root@vm tmp]# nohup /tmp/rsyncInotify.sh &                #后臺運行腳本
[root@vm tmp]# jobs
[1]+  Terminated              nohup /tmp/rsyncInotify.sh
[root@vm tmp]# nohup: ignoring input and appending output to `nohup.out'

[root@vm tmp]# jobs
[1]+  Running                 nohup /tmp/rsyncInotify.sh &
[root@vm tmp]# touch /data/leon.rsyncInotify

在服務器上

[root@vm data]# ls
first.txt  first.txtf  hello  leon.rsyncInotify
查看日志
[root@vm data]# tail /var/log/messages
Oct 27 14:44:54 vm xinetd[31417]: START: rsync pid=32950 from=::ffff:192.168.226.129
Oct 27 14:44:54 vm xinetd[31417]: EXIT: rsync status=0 pid=32950 duration=0(sec)
Oct 27 14:45:49 vm xinetd[31417]: START: rsync pid=32956 from=::ffff:192.168.226.129
Oct 27 14:45:50 vm xinetd[31417]: START: rsync pid=32958 from=::ffff:192.168.226.129
Oct 27 14:45:50 vm xinetd[31417]: EXIT: rsync status=0 pid=32956 duration=1(sec)
Oct 27 14:45:50 vm xinetd[31417]: EXIT: rsync status=0 pid=32958 duration=0(sec)
[root@vm data]# tail /var/log/rsyncd.log 
2015/10/27 14:45:49 [32956] connect from UNKNOWN (192.168.226.129)
2015/10/27 14:45:49 [32956] rsync to data/ from leon@unknown (192.168.226.129)
2015/10/27 14:45:50 [32956] receiving file list
2015/10/27 14:45:50 [32956] ./
2015/10/27 14:45:50 [32958] name lookup failed for 192.168.226.129: Name or service not known
2015/10/27 14:45:50 [32958] connect from UNKNOWN (192.168.226.129)
2015/10/27 14:45:50 [32956] sent 98 bytes  received 193 bytes  total size 0
2015/10/27 14:45:50 [32958] rsync to data/ from leon@unknown (192.168.226.129)
2015/10/27 14:45:50 [32958] receiving file list
2015/10/27 14:45:50 [32958] sent 76 bytes  received 154 bytes  total size 0

五、總結

對于rsync+inotify這個方式不適宜海量文件需要同步的情況,對于小規模應用還是可以的。rsync還有許多的參數實現不同的功能可選擇,請自行查看manual。epel源中有許多可用軟件包,對比國內阿里,搜狐等鏡像還多。所以,你懂得,趕緊配一個去。

原創文章,作者:成吉思汗,如若轉載,請注明出處:http://www.www58058.com/9084

(1)
成吉思汗成吉思汗
上一篇 2015-10-31 22:22
下一篇 2015-11-04 09:55

相關推薦

  • 計算機及Linux基礎介紹

    Linux及計算機基礎介紹 計算機的組成及其功能 What:計算機的組成是什么? 計算機的主要部件: CPU:可分為運算器、控制器、寄存器、緩存等 存儲器:比如內存。執行程序時,會將程序及相關數據加載進內存,供CPU讀取 輸入設備:比如:鍵盤。用于下達指令及輸入數據。 輸出設備:比如顯示器。用戶顯示和輸出指令執行的結果等 馮諾依曼體系中提出的五大部件為:運算…

    Linux干貨 2016-09-19
  • 淺談DNS基本原理以及實現方法(一)

     DNS(Domain Name System,域名系統),是目前互聯網上最不可或缺的服務器之一,我們在互聯網從訪問一個網站,到發送一封電子郵件,再到定位域中的域控制器,無時無刻不再使用著DNS為我們提供的服務,那為什么我們會需要這樣一個服務那?帶著這樣一個疑問讓我們先來認識一下什么是DNS吧  DNS最核心的工作就是域名解析,也就是把計…

    Linux干貨 2015-12-15
  • DNS高級應用之ACL和View

    一、環境準備:     1、準備三臺主機,要求如下      (1) DNS服務器雙網卡:eth0:192.168.10.203  eth1: 172.16.2.10       (2)測試機1雙網卡: eth0: 172.16.…

    Linux干貨 2015-06-01
  • keepalived高可用lvs集群

    實驗拓撲   keepalived高可用配置 HA01和HA02的keepalived安裝及配置(安裝及配置均相同) ~]# yum -y install keepalived HA01和HA02做時間同步,crontab中添加時間同步腳本 ~]# date; ssh 192.168.150.140 'date'   …

    Linux干貨 2016-12-06
  • LB Cluster:lvs

    Linux Cluster: Cluster:計算機集合,為解決某個特定問題組合起來形成的單個系統; Linux Cluster類型: LB:Load Balancing,負載均衡; HA:High Availiablity,高可用; A=MTBF/(MTBF+MTTR) (0,1):90%, 95%, 99%, 99.5%, 99.9%, 99.99%, …

    Linux干貨 2017-06-24
  • ◆戰前宣言

    從 今 天 開 始, 到 以 后 的 很 久,我 要 努 力,努 力,努 力 的 用 盡 全 力 地 學 好 Linux。 我 知 道,這 起 碼 需 要 很 長 時 間 和 汗 水,但 我 堅 信,付 出 總 是 會 有 回 報 的~ 要記?。罕饶銉炐愕娜硕荚谂Γ氵€在彷徨什么? 最后借用一下火影忍者中李…

    Linux干貨 2016-10-24

評論列表(1條)

  • stanley
    stanley 2015-10-31 22:24

    非常贊! 已置頂! 同時如果有delete操作最好增加備份機制

欧美性久久久久