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=/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