A-A+

Rsync+Inotify 触发实时同步

2015年09月22日 运维工具 暂无评论 阅读 2,578 views 次

在这里总结两种实现方式,rsync+inotify通过rsync密码文件认证、rsync+inotify+ssh认证分别实现触发式远程实时同步

系统环境:
10.1.10.20 (发布文件服务器) 源目录:/data/www/testwebsite/
10.1.10.21 (同步镜像文件服务器) 目标目录:/data/www/realwebsite/

实现目标:目录/data/www/testwebsite/ 通过Rysnc实时同步到/data/www/realwebsite/目录

 

rsync+inotify用rsync密码文件认证的方式进行同步。



一、配置Rysnc服务 ,实现文件密码文件认证传输。

首先在10.1.10.21上搭建rsync服务,设置同步的目录

1、在10.10.10.21上下载、安装rsync:

#wget http://rsync.samba.org/ftp/rsync/rsync-3.0.9.tar.gz
#tar zxvf rsync-3.0.9.tar.gz
#cd rsync-3.0.9
#./configure --prefix=/usr/local/rsync
#make
#make install

2、配置rsync server服务:

#vim /etc/rsyncd.conf
uid = root //运行RSYNC守护进程的用户
gid = root //运行RSYNC守护进程的组
use chroot = no //不使用chroot
max connections=0 // 最大连接数无限制
log file=/var/log/rsyncd.log //日志记录文件的存放位置
pid file=/var/run/rsyncd.pid //锁文件的存放位置
lock file=/var/run/rsyncd.lock //pid文件的存放位置

[realwebsite] //这里是认证的模块名,在client端需要指定
path = /data/www/realwebsite/ //需要做镜像的目录,不可缺少
comment = rsync from 10.1.10.20
read only = no // 非只读
list = on //不允许列文件
auth users = rsyncuser //认证的用户名,如果没有这行则表明是匿名,此用户与系统无关
secrets file = /etc/rsync.secrets //密码和用户名对比表,密码文件自己生成

3、设置密码文件secrets file ,编辑/etc/rsync.secrets

#vim /etc/rsync.secrets
rsyncuser:123456 //用户名和密码,用”/” 隔开

并且设置600文件属性:

#chomd 600 /etc/rsync.secrets

4、启动Rsync服务:

#/usr/local/rsync/bin/rsync --port=873 --address=10.1.10.21 –daemon

在10.1.10.20分发服务器上测试同步:

1、添加密码文件认证:

#vim /etc/rsync.secrets
123456 //对应10.1.10.21 密码即可

并且设置600文件属性:

#chomd 600 /etc/rsync.secrets

2、测试

/usr/bin/rsync -avH --delete --progress --password-file=/etc/rsync.secrets /data/www/testwebsite/ rsyncuser@10.1.10.21::realwebsite

二、安装配置inotify 服务

在源服务器10.1.10.20上搭建inotify 服务

1、下载安装

# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
# tar xzvf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.13
# ./configure --prefix=/usr/local/inotify
# make
# make install

2、创建inotify_rsync.sh脚本

# vim inotify_rsync.sh
#!/bin/sh
#author:coooz.com
#function:rysnc 10.1.10.20 to 1.10.10.21
if [ ! -f /etc/rsync.secrets ];then
echo "123456">/etc/rsync.secrets
/bin/chmod 600 /etc/rsync.secrets
fi

log=/usr/local/inotify/logs/rsync.log
src="/data/www/testwebsite/"
host="10.1.10.21"
module="realwebsite"

/usr/local/inotify/bin/inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $src | while read DATE TIME DIR FILE; do
FILECHANGE=${DIR}${FILE}
/usr/bin/rsync -avH --delete --progress --password-file=/etc/rsync.secrets $src --exclude-from="/usr/local/inotify/logs/rules.txt" rsyncuser@$host::$module &
echo "At ${TIME} on ${DATE}, file $FILECHANGE was updated via rsync" >> $log
done

相关注解如下:
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e close_write,modify,delete,create,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
/usr/bin/rsync -avH --delete --progress --password-file
-a 存档模式
-H 保存硬连接
-delete 删除于多余文件
--password-file 密码文件

具体参数可以man rsync
要排除同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加--exclude或--excludei参数,具体查看man inotifywait。
--exclude-from="/usr/local/inotify/conf/rules.txt" 可以匹配过滤文件:

如排除包括 .svn和Runtime/下的文件:

#cat /usr/local/inotify/conf/rules.txt
- *.svn*
Runtime/

inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。

赋予脚本可执行权限

#chmod +x inotify_rsync.sh

运行

#./ inotify_rsync.sh &

 

Rsync+inotify+ssh实现触发式远程实时同步

 

这种方式与上面的方式的区别在于rsync使用ssh通道传输数据。触发方式与上一种方法没有区别。
只需要在服务器之间做好免密码登陆就好了,具体的实现方式请查看http://coooz.com/2015/09/22/321/

直接上脚本:

#!/bin/bash
#Author:coooz.com
#function:update src to all dst

day=`date +"%Y%m%d"`
log=/data/logs/gmrsync/${day}-rsync.log
src="/data/www/testwebsite/"

/usr/local/inotify/bin/inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $src | while read DATE TIME DIR FILE; do

FILECHANGE=${DIR}${FILE}

while read dsthost area ;do
/usr/bin/rsync -avH --progress $src --exclude-from="/usr/local/inotify/conf/rules.txt" -e ' ssh -p 22 ' $src root@$dsthost &
echo "At ${TIME} on ${DATE}, file $FILECHANGE was update to $area via rsync" >> $log
done

done

inotify

给我留言

本站理念:

致力于运维技术的分享,运维前源技术的探讨,欢迎广大朋友一起参与,一起分享,共同成长。

交流探讨:

QQ群:26489714