服务器A:论坛的主服务器,运行DZ X2论坛程序;服务器B:论坛从服务器,须要把X2的图片附件和MySQL数据实时从A主服务器实时同步到B服务器.MySQL同步设置会在下一编中说到.如下是用于实时同步两台服务器的图片.git
由于通常的RSYNC须要CRON来按期运行SH脚原本实现同步,这样会带来一些问题.好比用户从主服务器上传上一个图片,须要最少一分钟才能从从服务器显示出来.自从Linux 2.6内核后,支持了inotify机制,当某些文件或文件夹有改变时,发出相应的事件,这样,第三方程序只要订阅这些事件,就能够处理相应的操做了.这时,只要有文件被修改,就执行一次RSNYN,把修改的文件主动地上传到另外一台服务器上就能够了.github
我使用的是google的inotify-tools,比较简单.国内有功能很强大的相似的程序,可是好复杂.另外须要注意的是:若是使用inotify-tools来实现实时同步,咱们的主服务器--源文件服务器(也就是服务器A)实现是RSYNC的从服务器,咱们的从服务器--目标同步的服务器(服务器B)才是RSYNC的主服务器.不要搞混了哦.shell
好了,开始吧!apache
首先从主服务器A开始,bash
须要肯定你的系统是否支持inotify:服务器
1
2
3
4
5
|
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:ui
1
2
3
4
5
6
|
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的固然.google
接下来须要写两个SH脚本,inotify_init.sh和inotify_monitor.sh:spa
inotify_init.sh 用于第一次初始化,也就是运行一次完整的RSYNC同步.
1
|
vi
/root/inotify_init
.sh
|
内容以下:
1
2
3
4
5
6
7
8
9
10
11
|
#!/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
|
保存退出.
设置可执行权限:
1
|
chmod
+x
/root/inotify_init
.sh
|
接下是inotify_monitor.sh,用于订阅文件修改事件.注意,由于特别缘由,我在这里作的是增量备份+实时同步,也就是说,当主服务器A上的图片被删除是,从服务器B是不会删除图片的.
1
|
vi
/root/inotify_monitor
.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#!/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
|
1
|
chmod
+x
/root/inotify_monitor
.sh
|
设置RSYNC自动登陆验证密码
1
2
|
vi
/root/rsync
.
pwd
xxxxxx
|
保存,退出
设置只有ROOT才能够查看的权限.
1
|
chmod
0600
/root/rsync
.
pwd
|
如下是备从务器B的配置:
安装RSYNC
1
|
yum
rsync
-y
|
配置RSNYD服务:
1
|
vi
/etc/rsyncd
.conf
|
内容以下,须要把Apache修改为你运行网站的用户名,个人是由于原来使用apache,虽然如今用Nginx,也一直没改用户名:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
|
1
2
|
vi
/etc/rsync
.pas
rsync
:xxxxxx
|
1
|
chmod
0600
/etc/rsync
.pas
|
启动RSYNCD
1
|
rsync
--daemon
|
添加开机自动启动服务:
1
|
vi
/etc/rc
.
local
|
添加如下内容:
1
|
rsync
--daemon
|
回到主服务器A,
1
|
vi
/etc/rc
.
local
|
添加如下内容,实时开机自动同步:
1
2
|
/root/inotify_init
.sh
/root/inotify_monitor
.sh
|
保存退出
运行
/root/inotify_init.sh
1
|
/root/inotify_monitor.sh
|
好了,这样就能实现实时同步图片文件了.随便在主服务器A的同步目录下新建一个文件试试吧.