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)查看参数:
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源安装
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)创建脚本文件夹:
mkdir ~/script cd ~/script
2)创建同步监视脚本
vim isync.sh
A方案输入如下内容:
#!/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方案输入一下内容:
#!/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)手动启动
sh ~/script/isync.sh
2)自动启动
echo "sh ~/script/isync.sh" >> /etc/rc.local
3.3.3 查阅脚本日志
tail /var/log/isync.sh.log
参阅文档:
=======================================
read命令的使用:
http://www.linuxidc.com/Linux/2013-01/77875.htm
yum源地址:
http://repoforge.org/use/
官方wike:
https://github.com/rvoicilas/inotify-tools/wiki#getting
关于rsyun的进程锁:
http://pakey.net/blog/rsync-lock.html
没有评论