1、前言
我们系统架构中有时候需要实现所谓的复制存储,实现复制存储的方案有很多种,现在我们来尝试inotify基于事件触发同步的复制存储方案。
2、理论部分
2.1、工具的介绍
Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools
是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:
-- inotifywait
命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
-- inotifywatch
命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
2.2、帮助信息
1)查看参数:
1
|
inotifywait -h
|
2)部分参数翻译:
inotifywait命令参数
-m 是要持续监视变化。
-r 使用递归形式监视目录。
-q 减少冗余信息,只打印出需要的信息。
-e 指定要监视的事件列表。
--timefmt 是指定时间的输出格式。
--format 指定文件变化的详细信息。
可监听的事件:
-- access访问,读取文件。
-- modify修改,文件内容被修改。
-- attrib属性,文件元数据被修改。
-- move移动,对文件进行移动操作。
-- create创建,生成新文件
-- open打开,对文件进行打开操作。
-- close关闭,对文件进行关闭操作。
-- delete删除,文件被删除
3、实践部分
3.1、主机信息
inotifywait_a:
hostname=inotifywait_a
ipaddress=10.168.0.161
inotifywait_b:
hostname=inotifywait_b
ipaddress=10.168.0.162
3.2、yum源安装
1
2
3
|
yum
install
-y
rsync
expect
yum
install
-y http:
//pkgs
.repoforge.org
/rpmforge-release/rpmforge-release-0
.5.3-1.el6.rf.x86_64.rpm
yum
install
-y inotify-tools
|
3.3、配置
3.3.1、创建脚本
In inotifywait_a:
1)创建脚本文件夹:
1
2
|
mkdir
~
/script
cd
~
/script
|
2)创建同步监视脚本
vim编辑isync.sh
A方案输入如下内容:
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
|
#!/bin/bash
desUser=root
#目标服务器的用户名
desPwd=
'rootpw'
#目标服务器的密码
desIP=10.168.0.162
#目标服务器的IP
desDir=
/files/
#目标服务器的路径
souDir=
/files/
#源服务器的路径
dt=$(
date
+
"%Y-%m-%d %H:%M:%S"
)
fn=$(
echo
$0 |
awk
-F
'/'
'{print $NF}'
)
lf=
"/var/log/$fn.log"
echo
"$dt $fn is start"
>> $lf
auto_rsync () {
expect -c "
set
timeout -1;
spawn
rsync
-azP --delete $5 $2@$3:$4;
expect {
*assword:* {send -- $1\r;
expect {
*denied* {
exit
2;}
eof
}
}
eof {
exit
1;}
}
"
return
$?
}
inotifywait -mrq -e create,move,delete,modify $souDir |
while
read
m1 m2 m3
do
auto_rsync $desPwd $desUser $desIP $desDir $souDir
dt=$(
date
+
"%Y-%m-%d %H:%M:%S"
)
echo
"$dt $fn $m2 $m1$m3"
>> $lf
done
|
B方案输入一下内容:
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
|
#!/bin/bash
desUser=root
#目标服务器的用户名
desPwd=
'rootpw'
#目标服务器的密码
desIP=10.168.0.162
#目标服务器的IP
desDir=
/files/
#目标服务器的路径
souDir=
/files/
#源服务器的路径
dt=$(
date
+
"%Y-%m-%d %H:%M:%S"
)
fn=$(
echo
$0 |
awk
-F
'/'
'{print $NF}'
)
lf=
"/var/log/$fn.log"
af=
"/tmp/af.sh"
#生成启动日志
echo
"$dt $fn is start"
>> $lf
#清理旧模块
if
[ -f $af ];
then
rm
-rf $af
fi
#生成自动传输模块
if
[ ! -f $af ];
then
echo
'#!/usr/local/bin/expect -f'
> $af
echo
'set timeout 1'
>> $af
echo
"spawn rsync -azP --delete $souDir $desUser@$desIP:$desDir"
>> $af
echo
'sleep 2'
>> $af
echo
'expect "password:"'
>> $af
echo
'send "'
$desPwd
'\r"'
>> $af
echo
'interact'
>> $af
fi
#传输模块权限设置
if
[ -f $af ];
then
chown
root:root $af
chmod
600 $af
fi
#监控并触发传输
inotifywait -mrq -e create,move,delete,modify $souDir |
while
read
m1 m2 m3
do
/usr/bin/expect
$af
dt=$(
date
+
"%Y-%m-%d %H:%M:%S"
)
echo
"$dt $fn $m2 $m1$m3"
>> $lf
done
|
注:以上代码二选一即可
3.3.2、启动脚本
1)手动启动
1
|
sh ~
/script/isync
.sh
|
2)自动启动
1
|
echo
"sh ~/script/isync.sh"
>>
/etc/rc
.
local
|
3.3.3、查阅脚本日志
1
|
tail
/var/log/isync
.sh.log
|