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