Rsync+inotify實現數據同步

    本節我們來講一講如何利用rsync以及inotify來實現兩臺不同主機之間的實時數據同步,rsync雖然同步功能異常強悍,但是它不能實時的去監測、同步數據,這就是爲什麼我們要用了inotify的原因了。 好的廢話不多說,下面我們就分別對他們進行介紹。

rsync

顧名思意,它是一款實現遠程同步功能的軟件,它在同步文件的同時,可以保持原來文件的權限、時間、軟硬鏈接等附加信息。 rsync是用 “rsync 算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。

特點:

1、可以鏡像保存整個目錄樹或文件系統;

2、較高的數據傳輸效率;

3、可以藉助於ssh實現安全數據傳輸;

4、支持匿名傳輸;

 

rsync命令的工作模式:

第一種模式:shell模式,也稱作本地模式;

第二種模式:遠程shell模式,可以利用ssh協議承載其遠程傳輸過程;

第三種模式:列表模式,僅列出源中的內容,-nv

第四種模式:服務模式,此時rsync工作爲守護進程,能接收客戶端的數據同步請求;

 

rsync命令的選項:

-n: 同步測試,不執行真正的同步過程;

-v: 詳細輸出模式

-q: 靜默模式

-c: checksum,開啓校驗功能

-r: 遞歸複製

 

注意:rsync命令中,如果源路徑是目錄,且給複製路徑時末尾有/,則會複製目錄中的內容,而非目錄本向;如果末尾沒有/,則會同步目錄本身及目錄中的所有文件;目標路徑末尾是否有/無關緊要;

 

-a: 歸檔,保留文件的原有屬性;

-p: 保留文件的權限;

-t: 保留文件的時間戳;

-l: 保留符號鏈接

-g: 保留屬組

-o: 保留屬主

-D:保留設備文件

-e ssh: 使用ssh作爲傳輸承載;

-z: 壓縮後傳輸; 

--progress: 顯示進度條

--stats: 顯示如何執行壓縮和傳輸

 

rsync的服務模式

 

1、設定rsync服務器端

# yum -y install xinetd
# chkconfig rsync on

2、爲rsync提供配置文件:手動創建

/etc/rsyncd.conf

 [root@localhost ~]# vim /etc/rsyncd.conf

配置文件分兩段:

全局配置段:1

共享配置段:可以有多個

[SHARE_NAME]:名稱可以自定義

配置示例:

# Global Settings
uid = nobody               進程運行用戶身份
gid = nobody               進程運行用戶組
use chroot = no            是否啓用chroot 
max connections = 10       最大併發請求連接數
strict modes = yes         嚴格模式
pid file = /var/run/rsyncd.pid   pid文件:名字自己定義
log file = /var/log/rsyncd.log   日誌文件:名字自己定義
 
# Directory to be synced
[tools]                   
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

 

3、啓動服務

注意啓動服務之前必須修改/etc/xinetd.d/rsync 文件中的disable項,使其爲no,這樣xinetd纔會爲其開啓監聽服務。

[root@localhost ~]# vim /etc/xinetd.d/rsync 

wKiom1P4ieXA9z56AABv19nq2cg825.jpg

# service xinetd start

如果啓動成功則監聽於873/tcp:可用ss -tnl 命令查看

wKiom1P4ityBDX1ZAAFR9HS8H10009.jpg

可以看到最後一行,873端口已監聽。 

 

 用法:

讀取: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

 

測試:本機的地址爲172.16.6.20,以另一臺地址爲172.16.106.2的機子進行同步測試

wKioL1P4jC2BFL1BAABHhjCAGaM965.jpg 

可以看到同步成功,但是由於沒有驗證功能這裏不需要任何密碼


4、服務端啓用用戶認證的功能

 創建密碼文件

密碼文件創建爲/etc/rsyncd.passwd (該文件名可以自己定義,但需要與配置文件中保持一致:注意,密碼不能超過8個字符

密碼文件中的格式:username:password

 [root@localhost ~]# vim /etc/rsyncd.passwd

wKiom1P4jDbDizTfAAAjC3gPp8M049.jpg

這裏我任意寫了三個用戶mwj,james,tracy


由於此文件不能允許其它用戶有訪問權限,因此創建完成後修改下文件的權限: 

 [root@localhost ~]# chmod 600 /etc/rsyncd.passwd

 在共享定義處加認證配置

[tools]
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  
auth users = USERNAME LIST             該用戶列表爲以逗號分隔且在密碼文件中存在的用戶名
secrets file = /etc/rsyncd.passwd      密碼文件

wKiom1P4jLnz0SloAAEiL9ZO9_c660.jpg 

注意,這裏我們只給了james和tracy權限,因此理論上來說mwj沒有權限同步,那麼我們來驗證下結果。


ok,一切完畢。我們來重啓下服務並且測試下:

[root@localhost ~]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

測試:本機的地址爲172.16.6.20,還是以另一臺地址爲172.16.106.2的機子進行同步測試

[root@localhost data]# rsync [email protected]::tools/inittab  /web/data/   複製inittab文件
Password: 
@ERROR: auth failed on module tools         認證被拒絕
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
[root@localhost data]# ls
fstab                                     複製未成功                
[root@localhost data]# rsync [email protected]::tools/inittab  /web/data/ 複製inittab文件
Password: 
[root@localhost data]# ls
fstab  inittab                             複製成功
[root@localhost data]# rsync [email protected]::tools/fstab2  /web/data/   複製fstab2文件
Password: 
[root@localhost data]# ls
fstab  fstab2  inittab                     複製成功

好了,通過上述的測試驗證的我們此前的預測,認證生效。


inotify

rsync雖然也能夠使用cron來進行任務同步,但是其中還是會出現一定的時間差,如果想要解決這個問題,那麼我們就可以用inotify來解決了,Inotify 是一個 Linux 內核特性,它可以實時監控文件系統,並且及時向專門的應用程序發出相關的事件警告,比如刪除、讀、寫和卸載操作等,還可以實時跟蹤活動的源頭和目標等細節,這樣一旦同步文件發送改變,inotify就可以實時的通知客戶端到服務器端進行同步,這樣就可以實現無縫隙的數據同步。

1、安裝 (注意:此功能需要2.6.13及以上內核支持)

[root@localhost ~]# uname -r      查看一下機器的內核版本
2.6.32-431.el6.x86_64             2.6.32的內核

這裏我們兩種方式都提供:編譯安裝和yum安裝

 編譯安裝

這裏我們下載inotify的源碼包進行編譯安裝

下載地址:http://sourceforge.net/projects/inotify-tools/files/

[root@localhost ~]# wget http://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz

wKiom1P4lpOCI4HCAAYPtpL6hKk417.jpg

[root@localhost ~]# tar xf inotify-tools-3.13.tar.gz 
[root@localhost ~]# cd inotify-tools-3.13
[root@localhost inotify-tools-3.13]# ./configure       
[root@localhost inotify-tools-3.13]# make && make install

這裏只是提供一下編譯安裝的過程,具體的我還是利用下面yum安裝的操作來進行。


yum安裝

[root@localhost inotify-tools-3.13]# yum install inotify-tools
[root@localhost inotify-tools-3.13]# rpm -ql inotify-tools     查看生成了哪些文件
/usr/bin/inotifywait          指令文件:用來監視文件的變化
/usr/bin/inotifywatch         指令文件:用於收集被監控的文件系統統計數據
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz

inotify相關參數 

inotify定義了下列的接口參數,可以用來限制inotify消耗kernel memory的大小。由於這些參數都是內存參數,因此,可以根據應用需求,實時的調節其大小。下面分別做簡單介紹。 

/proc/sys/fs/inotify/max_queued_evnets     
表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。 


/proc/sys/fs/inotify/max_user_instances 
表示每一個real user ID可創建的inotify instatnces的數量上限。 


/proc/sys/fs/inotify/max_user_watches 
表示每個inotify instatnces可監控的最大目錄數量。如果想要增加此值的大小: 可直接使用echo重定向即可:
echo 1000000 > /proc/sys/fs/inotify/max_user_watches 


下面我們來看下inotifywait和inotifywatch這2個命令的用法:


inotifywait:wait for changes to files using inotify  使用inotify監控文件變化

語法格式:

 inotifywait  [-options]  <file> [ ... ]

options

-h :help

-m : --monitor,監聽

-c :輸出爲逗號分隔形式

-r :遞歸

-e  <event>:指定監聽事件,不指默認問全部

-t <seconds>:時間

--format <fmt> :格式

--timefmt <fmt>:時間格式


inotifywatch:gather filesystem access statistics using inotify收集統計數據

語法格式:

inotifywatch  [options]   <file> [ ... ]

options


-h :help

-r :遞歸

-v :輸出額外的錯誤信息

-e <event>:指定事件

-t <seconds>:時間

-a <event>:輸出時按照事件計數進行升序排序

-d <event>:輸出時按照事件計數進行降序排序


案例:

wKioL1P42WCzbVDwAAF6pdaTjbs770.jpg

172.16.6.20:作爲rsync服務器

172.16.106.2:作爲inotify服務端,rsync的客戶端,當文件改動時將改變同步到A


rsync服務器配置

這裏的配置跟上面的服務認證一樣,這裏就不多加介紹了,主要還是介紹下面的inotify的配置

 [root@localhost ~]# vim /etc/rsyncd.conf

wKiom1P4jLnz0SloAAEiL9ZO9_c660.jpg

密碼文件以及其他配置跟上面完全相同。


inotify服務端配置

這裏假設我們將監控/shared目錄下的內容,並同步到rsync服務器端。

下面編寫一個腳本

[root@localhost ~]# vim /etc/inotify.sh

#!/bin/bash
#
host1=172.16.6.20                  ##服務器端IP
src=/shared/                        ##本地數據存放目錄
dst=tools                        ##服務端數據的目錄
user=james                      ##主機A允許推送拉取數據的用戶
psd=lbj                         密碼 
/usr/bin/local/inotifywait -mrq  -e modify,delete,create,attrib $src |while read line ;
do 
    echo $psd > /usr/bin/rsync -vzrtopg --delete --progress  $src $user@$host::$dst  
 
done

[root@localhost ~]#

好了,這樣我們一個rsync+inotify的實時數據同步就OK了。直接啓動就可以用來額。

[root@localhost ~]#/etc/inotify.sh  &


好了本節就講到這裏,歡迎大家的批評指正,謝謝!

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