inotify-tools+rsync实时同步文件的配置方法

付费节点推荐


免费节点


节点使用教程


网站的主服务器A,因为图片太多,带宽不够用,需要用图床,希望上传到A服务器的图片,能自动同步到B服务器内(图床服务器)。这样两台服务器互相配合,带宽能到60M。这样就不需要用七牛等CDN了。省去了一大笔成本费用。

然后了解到RSYNC需要CRON来定期运行SH脚本来实现同步,这样会带来一些问题.比如用户从主服务器上传上一个图片,需要最少一分钟才能从从服务器显示出来.自从Linux 2.6内核后,支持了inotify机制,当某些文件或文件夹有改变时,发出相应的事件,这样,第三方程序只要订阅这些事件,就可以处理相应的操作了.这时,只要有文件被修改,就执行一次RSNYN,把修改的文件主动地上传到另一台服务器上就可以了。

我使用的是google的inotify-tools,比较简单.国内有功能很强大的类似的程序,但是好复杂.另外需要注意的是:如果使用inotify-tools来实现实时同步,我们的主服务器–源文件服务器(也就是服务器A)实现是RSYNC的从服务器,我们的从服务器–目标同步的服务器(服务器B)才是RSYNC的主服务器.不要搞混了哦.

以下是A服务器的配置

首先从主服务器A开始,需要确定你的系统是否支持inotify:

复制代码代码如下:
ll /proc/sys/fs/inotify
total 0
-rw-r–r– 1 root root 0 Jan 4 17:56 max_queued_events
-rw-r–r– 1 root root 0 Jan 4 17:56 max_user_instances
-rw-r–r– 1 root root 0 Jan 4 17:56 max_user_watches

能输出这样的结果表示支持。

下载并安装inotify-tools:

复制代码代码如下:
wget –no-check-certificate http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar xzvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure –prefix=/usr
make
make install

完成inotify-tools的安装。

接下来需要为A服务器写两个SH脚本,inotify_init.sh  inotify_monitor.sh
inotify_init.sh 用于第一次初始化,也就是运行一次完整的RSYNC同步.

vi /root/inotify_init.sh

复制代码代码如下:
#!/bin/sh
SRC=/主服务器A需要同步的目录/ #记得在最后面加/不然RYNC会自动增加一层目录
DES=bbsatt
IP= 服务器B的IP
USER= rsync
#DST=/etc/rsyncd 远程rsync模块下的目录(还不清楚,好像没用)
INWT=/usr/bin/inotifywait
RSYNC=/usr/bin/rsync
$RSYNC -zahqt –password-file=/root/rsync.pwd $SRC $USER@$IP::$DES

保存退出.

设置可执行权限:

chmod +x /root/inotify_init.sh

接下是inotify_monitor.sh,用于订阅文件修改事件.注意,因为特别原因,我在这里做的是增量备份+实时同步,也就是说,当主服务器A上的图片被删除是,从服务器B是不会删除图片的.

vi /root/inotify_monitor.sh

复制代码代码如下:

#!/bin/bash

#sync[0]=’/主服务器需要同步的目录/,从服务器B的IP,bbsatt,rsync’ # localdir,ho st,rsync_module,auth_user

#只需要修改 sync[0]  的目录地址,和ip地址即可。逗号分开

sync[0]=’/home/wwwroot/****/wp-content/uploads/,45.43.23.12,bbsatt,rsync’
INWT=/usr/bin/inotifywait
RSYNC=/usr/bin/rsync
PASS=/root/rsync.pwd
###########################

for item in ${sync[@]}; do

dir=`echo $item | awk -F”,” ‘{print $1}’`
host=`echo $item | awk -F”,” ‘{print $2}’`
module=`echo $item | awk -F”,” ‘{print $3}’`
user=`echo $item | awk -F”,” ‘{print $4}’`

$INWT -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f %e’ –event CLOSE_WRITE, create,move $dir | while read
date time file event
do
echo $event’-‘$file
case $event in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
if [ “${file: -4}” != ‘4913’ ] && [ “${file: -1}” != ‘~’ ]; then
cmd=”$RSYNC -zahqzt –password-file=$PASS –include=$file $dir $user@$host::$mod ule”
echo $cmd >> a.log
$cmd
fi
;;

MOVED_FROM|MOVED_FROM,ISDIR|DELETE,ISDIR)
if [ “${file: -4}” != ‘4913’ ] && [ “${file: -1}” != ‘~’ ]; then
cmd=”$RSYNC -zahqzt –password-file=$PASS –exclude=$file $dir $user@$host::$mod ule”
echo $cmd >>a.log
$cmd
fi
;;
esac
done &
done

加执行权限

chmod +x /root/inotify_monitor.sh

设置RSYNC自动登录验证密码

vi /root/rsync.pwd

输入服务器密码到rsync.pwd

123456

保存,退出

设置只有ROOT才可以查看的权限.

chmod 0600 /root/rsync.pwd

以下是备从务器B的配置:

安装RSYNC

yum install rsync -y

#—-配置RSNYD服务

vi /etc/rsyncd.conf

内容如下,uid,gid修改成你运行网站的用户名,用户组

复制代码代码如下:
uid = root
gid = root
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log[bbsatt]
path = /home/wwwroot/cdn.bcoderss.com/wp-content/uploads/  #服务器B接收的目录
ignore errors
read only = no
list = false
hosts allow = 149.129.61.205   #服务器A的ip地址
auth users = rsync
secrets file = /etc/rsync.pas

服务器的密码

vi /etc/rsync.pas

rsync:123456

chmod 0600 /etc/rsync.pas

启动RSYNCD

rsync –daemon

添加开机自动启动服务:

vi /etc/rc.local

输入
rsync –daemon

回到主服务器A,

vi /etc/rc.local

添加以下内容,实时开机自动同步:

复制代码代码如下:
/root/inotify_init.sh
/root/inotify_monitor.sh

保存退出

运行:

复制代码代码如下:
/root/inotify_init.sh
/root/inotify_monitor.sh

这样就能实现实时同步图片文件了,在主服务器A的同步目录下新建一个文件测试下吧。

问题:发现必须执行/root/inotify_init.sh 才能同步,所以最后只能用crontab 每隔1分钟同步

安装crontab

yum -y install vixie-cron crontabs

使用方法:

# 查看cond 状态 service crond status

# 启动cron service crond start

# 关闭cron service crond stop

# 重启cron service crond restart

crontab –e : 修改 crontab 文件。
crontab –l : 显示 crontab 文件。
crontab -r : 删除 crontab 文件。
crontab -ir : 删除 crontab 文件前提醒用户。

添加任务,每隔一分钟执行一次

* * * * * /root/inotify_init.sh

(好像最小间隔时间是1分钟,如果想设置更低,比如10秒钟)

 * * * * * sleep 10; /root/inotify_init.sh
 * * * * * sleep 20; /root/inotify_init.sh
 * * * * * sleep 30; /root/inotify_init.sh
 * * * * * sleep 40; /root/inotify_init.sh
 * * * * * sleep 50; /root/inotify_init.sh
或者写个shell脚本,循环下。

未经允许不得转载:Bcoder资源网 » inotify-tools+rsync实时同步文件的配置方法

相关推荐

更多优质资源关注微信公众号: bcoder

bcoder
赞 (1)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册