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

服务器A:

论坛的主服务器,运行DZ X2论坛程序;服务器B:论坛从服务器,需要把X2的图片附件和MySQL数据实时从A主服务器实时同步到B服务器.MySQL同步设置会在下一编中说到.以下是用于实时同步两台服务器的图片。

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

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

首先从主服务器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的安装。

接下来需要写两个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,host,rsync_module,auth_user

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 –exclude=* –password-file=$PASS \

–include=$file $dir $user@$host::$module > /dev/null 2>1&”

echo $cmd

$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::$module > /dev/null 2>1&”

echo $cmd

$cmd

fi

esac

done &

done

chmod +x /root/inotify_monitor.sh

设置RSYNC自动登录验证密码

vi /root/rsync.pwd

xxxxxx

保存,退出

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

chmod 0600 /root/rsync.pwd

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

安装RSYNC

yum rsync -y

#—-配置RSNYD服务

vi /etc/rsyncd.conf

内容如下,需要把Apache修改成你运行网站的用户名,我的是因为原来使用apache,虽然现在用Nginx,也一直没改用户名:
复制代码 代码如下:

uid = apache

gid = apache

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 = /从服务器B本地用于存放备份的目录

ignore errors

read only = no

list = false

hosts allow = 主服务器A的IP

auth users = rsync

secrets file = /etc/rsync.pas

vi /etc/rsync.pas

rsync:xxxxxx

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的同步目录下新建一个文件测试下吧。

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:使用 Velero 备份还原 Kubernetes 集群

2023-3-18 15:39:48

建站知识

小知识:Kong和Konga在K8s部署真的很难吗?

2023-3-18 15:54:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索