服务器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:
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:
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的当然.
接下来需要写两个SH脚本,inotify_init.sh和inotify_monitor.sh:
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的同步目录下新建一个文件试试吧.