本節我們來講一講如何利用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
# service xinetd start
如果啓動成功則監聽於873/tcp:可用ss -tnl 命令查看
可以看到最後一行,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的機子進行同步測試
可以看到同步成功,但是由於沒有驗證功能這裏不需要任何密碼
4、服務端啓用用戶認證的功能
創建密碼文件
密碼文件創建爲/etc/rsyncd.passwd (該文件名可以自己定義,但需要與配置文件中保持一致):注意,密碼不能超過8個字符
密碼文件中的格式:username:password
[root@localhost ~]# vim /etc/rsyncd.passwd
這裏我任意寫了三個用戶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 密碼文件
注意,這裏我們只給了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
[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>:輸出時按照事件計數進行降序排序
案例:
172.16.6.20:作爲rsync服務器
172.16.106.2:作爲inotify服務端,rsync的客戶端,當文件改動時將改變同步到A
rsync服務器配置
這裏的配置跟上面的服務認證一樣,這裏就不多加介紹了,主要還是介紹下面的inotify的配置
[root@localhost ~]# vim /etc/rsyncd.conf
密碼文件以及其他配置跟上面完全相同。
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 &
好了本節就講到這裏,歡迎大家的批評指正,謝謝!