首页 > 代码库 > rsync+inotify 详解与实践

rsync+inotify 详解与实践

1 rsync 是一款数据备份工具,与scp FTP等工具备份的机制的优越性在于rsync 同步备份是先比较在拷贝变化过的数据,这样更节省资源,如有1T的数据只有1K的数据改变,则rsync 基本上备份只要同步1k 的数据而 scp 是个傻瓜式的拷贝,全部拷贝

2 inotify 工具是协助rsync的工具,rysnc同步,那么何时同步呢? 同步crontab 定时去同步吗? 这种方式同步带来的缺点是,不能数据同步实时,且当数据没改变的话,也执行rysnc 让费资源,而inotify工具就是实现了监控文件系统中文件的改变,状态,如果让两则结合起来,即inotify监控到数据的改变,触发rsync进行数据的同步!

3 rsync 服务的模式

      1 ssh方式进行同步

      2 C/S 方式,rsync 有服务器端daemon,和rsync 客户端

 

4 生产环境中,复杂一点的要求就需要使用C/S 架构

5 实例  rsync + inotify 结合一起工作

5.1 简单介绍rsync C/S 模型常用的用法

rsync [OPTION...] [USER@]HOST::SRC... [DEST]    将远端src文件下载到本地dest下

rsync [OPTION...] SRC... [USER@]HOST::DEST   将本地src文件 上传到远端host主机下的dest目录下

注意: (SRC)DEST 表示的是 服务器端的 模块名字,而不是完整的路径名

rsync的常用选项

-v  verbose

-a 递归模式,保留文件属性,等于-rlptgoD

-z,--compress 传输过程中对数据文件进行压缩,节省传输资源

--progress 显示数据传输的进度信息

--delete 删除那些仅在目标路径中存在的文件(源路径中不存在)

-u 如果目标地址中的文件比要下载的文件新,则不执行同步

--password-file=FILE 指定密码文件,将密码写入文件中,实现非交互式数据同步,避免手工数据密码

--list-only 仅列出服务器模块列表,需要rsync服务器设置为list = true

 5.2 简单介绍inotify 工具

inotify 自从linux内核2.6.13 起已经编译进了内核,inotity 可以监控文件系统中的文件的各种变化如 增删改等使文件变化的事件,利用这个内核接口,用户层软件就可以实现文件系统改变的监控和显示

1 inotify 可以监控系统的哪些事件 如modify create move delete attrib

2 uname -r 或者 ls -l /proc/sys/fs/inotify 查看系统是否支持inotify

3 下载安装第三方软件 inotify-tool,这个软件提供一个inotifywait工具,系统文件的变化

inotifywait 的使用

格式

 inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file> [ ... ]

常用选项

-m 即monitor 表示始终保持事件的监听状态,而不是默认的程序接受到一个事件后就退出

-q  数据较少的信息

-r 递归监控

-e,--event  仅监控指定的事件

--timefmt <fmt> 设定时间格式,即--format 指定的%T格式,结合--format 选项一起使用

--format <fmt> 指定信息的输出格式 一般有

   %T 数据时间

       %w 数据时间的目录

       % f 文件

       %e 何种事件

如: 我在一个终端监控,另外一个终端work 目下 操作文件 重名了和 复制/etc/passwd数据到当前目录 获得的监控信息

[root@shiyan ~]# inotifywait -mrq --timefmt ‘%y-%m-%d %H:%M‘ --format ‘%T %w%f %e‘ -e create,modify,move,delete,attrib /mnt/work/
14-11-10 01:53 /mnt/work/m MOVED_FROM
14-11-10 01:53 /mnt/work/m1 MOVED_TO
14-11-10 01:53 /mnt/work/m1 MOVED_FROM
14-11-10 01:53 /mnt/work/m MOVED_TO
14-11-10 01:53 /mnt/work/passwd CREATE
14-11-10 01:53 /mnt/work/passwd MODIFY

 

5.3 rsync+ inotify 一个常用部署环境,如图

需求:

web1 和web2 作为两个集群服务器,同时提供web 服务,但是要保证两个web下提供的页面等数据一致,此时可以构建一个数据发布平台,rsync+inotify ,监控/data/web 发布数据的目录下,一旦有数据变化,就将数据同步到两个web服务器中

实现:

web1 192.168.7.204 rsync deamon

web2 192.168.7.205 rsync deamon

rsync客户端+inotify 192.168.7.95   

 

web上的配置,rsync服务器的配置

1 软件 rsync

yum -y install rsync

2 rsync配置文件,默认不存在 /etc/rsync.conf

 

[root@host_7-205 web]# cat /etc/rsyncd.conf
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/lock/subsys/rsyncd
port = 873
uid = nobody
gid = nobody
use chroot = no
read only = no
max connections = 10

[web]     # 模块的名字
comment = web content
path = /data/web 
auth users = test
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.7.95
hosts deny = *
list = false

3 创建密码文件

echo "test:123456" > /etc/rsyncd.secrets

chmod 600 /etc/rsyncd.secretes  # 注意密码文件权限只能是600,如果文修改,客户端同步数据时候会提示出错

4 web 服务器的文件目录

mkdir -pv /data/web

chmod -R nobody.nobody /data/web     # 设定文件组为nobody 避免没有权限同步数据进来

 5 开启rsyncd 进程

rsync --daemon 

echo "`which rsync` --daemon" >> /etc/rc.local

 

rsync 客户端上的验证和inotify的配置

首先建立非交互式的rsync环境,即创建密码文件

echo "123456" > /etc/rsync.pass  客户端使用test 账号连接rsync服务器的密码文件,密码为12356

chmod 600 /etc/rsync.pass  # 注意密码文件一定要让其他用户没有任何访问权限,否则执行rsync会出错

测试是否正确

[root@shiyan web]# rsync -avz --password-file=/etc/rsync.pass /data/web/* test@192.168.7.205::web
sending incremental file list
testfile

sent 73 bytes received 27 bytes 200.00 bytes/sec
total size is 4 speedup is 0.04

测试通过 rysnc C/S 架构已经没问题,注意web是模块名

 

配置inotify 的环境

1 安装inotify-tool软件

  yum install -y inotify-tools.x86_64

 

2 编写一个监控脚本,实现一直监控,一旦监控到被监控的目录下文件改变则同步数据到rsync 服务器上(web)

[root@shiyan log]# cat /mnt/notify_rsync.sh
#!/bin/bash
#This rsync script based on inotify.
#version 1

SRC=http://www.mamicode.com/data/web
# the remote rsyncd module name
DEST=web
CIP=192.168.7.205
USER=test
PASSFILE=/etc/rsync.pass
LOG_INOTIFY=/var/log/web_inotify.log
LOG_RSYNC=/var/log/web_rsync.log
[ ! -e $PASSFILE ] && echo "Please give Password file " && exit 2
# Wait for change and rsync data

inotifywait -mrq --timefmt ‘%y-%m-%d %T‘ --format ‘%T %w%f %e‘ -e modify,create,move,delete,attrib $SRC | while read LINE
do
echo $LINE >> ${LOG_INOTIFY} 2>&1
rsync -avz --delete --progress --password-file=$PASSFILE $SRC ${USER}@${CIP}::$DEST >> $LOG_RSYNC 2>&1
done &

 

3 为了启动能立即运行

chmod +x /mnt/notify_rsync.sh

echo "/mnt/notify_rsync.sh" >> /etc/rc.local

 

测试

运行 sh /mnt/notify_rsync.sh

ps aux | grep sh 可以查看脚本在后台运行

在 rsync客户端上创建一个文件删除一个文件,验证,查看日志

[root@shiyan log]# cat web_inotify.log
14-11-10 03:27:43 /data/web/dir DELETE,ISDIR
14-11-10 03:28:30 /data/web/dir CREATE,ISDIR
14-11-10 03:29:41 /data/web/2 ATTRIB
14-11-10 03:29:42 /data/web/3 CREATE
14-11-10 03:29:42 /data/web/3 ATTRIB
[root@shiyan log]# cat web_rsync.log
sending incremental file list

sent 100 bytes received 10 bytes 220.00 bytes/sec
total size is 4 speedup is 0.04
sending incremental file list
web/dir/

 

一切OK

 

rsync+inotify 详解与实践