rsync+inotify實時數據同步單目錄實戰linux
inotify是一個強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起加入了inotify支持,經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類事件,利用這個內核接口,第三方軟件能夠監控文件系統下文件的各類變化狀況,而inotify-tools正是實施監控的軟件。git
inotify配置是創建在rsync服務基礎上的配置過程github
操做系統bash
主機名 | 網卡eth0 | 默認網關 | 用途 |
root@58server1 | 192.168.1.111 | 192.168.1.1 | Rsync服務端 |
root@58client | 192.168.1.121 | 192.168.1.1 | Rsync 節點 |
子網掩碼均爲255.255.255.0服務器
具體需求:併發
要求在58server1上以rsync守護進程的方式部署rsync服務,使得root@58client的 rsync節點客戶端主機,能夠把本地數據經過rsync的方式備份到數據備份服務器58server1上,本例的客戶端僅以58client爲例異步
1、在配置inotify前己經把root@58server1 Rsync服務端的rsync服務部置好post
如今在58client服務器中安裝部置inotify監控服務測試
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
[root@58server1 ~]# cat /etc/rsyncd.conf
#Rsync server
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
uid = root
gid = root
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.1.1/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[dingjian]
comment = bbs by dingjian 14:18 2012-1-13
path = /dingjian
|
配置rsync服務略ui
2、開始安裝inotify
在安裝inotify-tools前請先確認你的linux內核是否達到了2.6.13,而且在編譯時開啓CONFIG_INOTIFY選項,
1) 查看當前系統是否支持inotify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@58client ~]# uname -r
2.6.18-308.el5
[root@58client ~]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 4 22:33 max_queued_events
-rw-r--r-- 1 root root 0 May 4 22:33 max_user_instances
-rw-r--r-- 1 root root 0 May 4 22:33 max_user_watches
#顯示這三個文件則證實支持
|
2)下載inotify源碼包
1
2
3
4
5
|
[root@58client ~]# mkdir /home/Mr.Xing/tools/ -p
[root@58client ~]# cd /home/Mr.Xing/tools/
[root@58client tools]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
|
3)編譯安裝inotfiy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@58client tools]# ls
inotify-tools-3.14.tar.gz
[root@58client tools]# tar zxf inotify-tools-3.14.tar.gz
[root@58client tools]# cd inotify-tools-3.14
[root@58client inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14
[root@58client inotify-tools-3.14]# make
[root@58client inotify-tools-3.14]# make install
[root@58client inotify-tools-3.14]# cd ..
[root@58client tools]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotfiy
[root@58client tools]# ls -l /usr/local/|grep inotify
lrwxrwxrwx 1 root root 30 May 4 22:42 inotfiy -> /usr/local/inotify-tools-3.14/
drwxr-xr-x 6 root root 4096 May 4 22:41 inotify-tools-3.14
|
參數:
--prefix=PATH 指定編譯安裝的路徑
提示:更多的編譯參數能夠使用./configure –h 查看,編譯成功後會生成4個目錄,
小軟件通常規範安裝到同一個目錄,通常爲/usr/local中
創建一個軟連接
進入安裝inotify的目錄
1
2
3
4
5
6
7
8
9
10
11
|
[root@58client tools]# ls -l /usr/local/inotify-tools-3.14/
total 16
drwxr-xr-x 2 root root 4096 May 4 22:41 bin #inotfiy執行命令(二進制)
drwxr-xr-x 3 root root 4096 May 4 22:41 include #inotfiy程序所需用的頭文件
drwxr-xr-x 2 root root 4096 May 4 22:41 lib #動態連接的庫文件
drwxr-xr-x 4 root root 4096 May 4 22:41 share #幫助文件
|
查看是否編譯成功,
使用echo $? 返回0表示成功
只關注下面兩個文件
bin
|-- inotifywait
`-- inotifywatch
./bin/inotifywait –help
4) 編寫inotify實時監控腳本
事件相關參數大小:
默認:
[root@58client inotify]# cat /proc/sys/fs/inotify/max_user_watches
8192
[root@58client inotify]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@58client inotify]# cat /proc/sys/fs/inotify/max_user_instances
128
併發大時能夠修改增大這些參數
開始編寫inotify腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
[root@58client inotify]# mkdir /server/scripts/ -p
[root@58client inotify]# cd /server/scripts/
[root@58client scripts]# vi inotify.sh
[root@58client scripts]# cat inotify.sh
#!/bin/bash
#para
host01=192.168.1.111
src=/dingjian
dst=dingjian
user=rsync_backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify-tools-3.14/
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Folder"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
# rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
|
host rsync服務器地址
src本地目錄 dst模塊 要和/etc/rsyncd.conf中的模塊名對應
user 用戶
rsync_passfile密碼文件
inotify_home inotify定義inotifywait的目錄
#jude下面的內容是檢查上面參數是否存在
1
|
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
|
判斷$src目錄的變化等參數
while reade file死循環,經過|管道實時讀取上面事件的變化,一講取到就循環執行如下命令進行推送
1
|
cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
|
通過測試,每秒200個文件併發,數據同步幾乎無延盡(小於1秒)
5) 測試rsync是否成功推送
[root@58server1 backup]# rsync -avz -P --delete /backup rsync_backup@192.168.1.111::backup/ --password-file=/etc/rsync.password
通常添加了腳本後要格式化一次腳本
1
2
3
|
[root@58client scripts]# dos2unix inotify.sh
dos2unix: converting file inotify.sh to UNIX format ...
|
6) 在客戶端運行腳本
sh -x inotify.sh
使腳本在後臺運行
[root@58client scripts]# sh inotify.sh &
[root@58client dingjian]# for n in `seq 10000`;do /bin/cp /bin/cat /dingjian/cat$n;done
服務端
[root@58server1 dingjian]# ls -l /dingjian|wc -l
查看客戶端58client後臺運行的inotify腳本進程
[root@58client scripts]# ps -ef|grep inotify