linux实现多台服务器文件同步
inotify-tools+rsync实时同步文件安装和配置
Linux+Nginx+PHP+MySQL+MemCached+eaccelerator安装优化记录(见 http://www.linuxidc.com/Linux/2012-06/63622.htm ).服务器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
-rw-r--r-- root root Jan : max_queued_events
-rw-r--r-- root root Jan : max_user_instances
-rw-r--r-- root root Jan : max_user_watches
能输出这样的结果表示支持.

下载并安装inotify-tools:
这样就完成了inotify-tools的当然.
接下来需要写两个SH脚本,inotify_init.sh和inotify_monitor.sh:
inotify_init.sh 用于第一次初始化,也就是运行一次完整的RSYNC同步.
1 vi /root/inotify_init.sh
vi /root/inotify_init.sh
内容如下:
1 #!/bin/sh
2 SRC=/主服务器A需要同步的目录/ #记得在最后面加/不然RYNC会自动增加一层目录
3
4 DES=bbsatt
5 IP=从服务器B的IP
6 USER=rsync
7 #DST=/etc/rsyncd 远程rsync模块下的目录
8 INWT=/usr/bin/inotifywait
9 RSYNC=/usr/bin/rsync
10
11 $RSYNC -zahqt --password-file=/root/rsync.pwd $SRC $USER@$IP::$DES
#!/bin/sh
SRC=/主服务器A需要同步的目录/ #记得在最后面加/不然RYNC会自动增加一层目录
3
DES=bbsatt
IP=从服务器B的IP
USER=rsync
#DST=/etc/rsyncd 远程rsync模块下的目录
INWT=/usr/bin/inotifywait
RSYNC=/usr/bin/rsync
10
$RSYNC -zahqt --password-file=/root/rsync.pwd $SRC $USER@$IP::$DES
保存退出.
设置可执行权限:
1 chmod +x /root/inotify_init.sh
chmod +x /root/inotify_init.sh
接下是inotify_monitor.sh,用于订阅文件修改事件.注意,因为特别原因,我在这里做的是增量备份+实时同步,也就是说,当主服务器A上的图片被删除是,从服务器B是不会删除图片的.
1 vi /root/inotify_monitor.sh
1 #!/bin/bash
2
3 ###########################
4 sync[0]='/主服务器需要同步的目录/,从服务器B的IP,bbsatt,rsync' # localdir,host,rsync_module,auth_user
5
6 INWT=/usr/bin/inotifywait
7 RSYNC=/usr/bin/rsync
8 PASS=/root/rsync.pwd
9 ###########################
10
11 for item in ${sync[@]}; do
12
13 dir=`echo $item | awk -F"," '{print $1}'`
14 host=`echo $item | awk -F"," '{print $2}'`
15 module=`echo $item | awk -F"," '{print $3}'`
16 user=`echo $item | awk -F"," '{print $4}'`
17
18 $INWT -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' \
19 --event CLOSE_WRITE,create,move $dir | while read date time file 21 event
20 do
21 #echo $event'-'$file
22 case $event in
23 MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
24 if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; then
25 cmd="$RSYNC -zahqzt --exclude='*' --password-file=$PASS \
26 --include=$file $dir $user@$host::$module > /dev/null 2>1&"
27 echo $cmd
28 $cmd
29 fi
30 ;;
31
32 MOVED_FROM|MOVED_FROM,ISDIR|DELETE,ISDIR)
33 if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; then
34 cmd="$RSYNC -zahqzt --password-file=$PASS --exclude=$file \
35 $dir $user@$host::$module > /dev/null 2>1&"
36 echo $cmd
37 $cmd
38 fi
39 ;;
40 esac
41 done &
42 done
1 chmod +x /root/inotify_monitor.sh
vi /root/inotify_monitor.sh
#!/bin/bash ###########################
sync[]='/主服务器需要同步的目录/,从服务器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}" != '' ] && [ "${file: -1}" != '~' ]; then
cmd="$RSYNC -zahqzt --exclude='*' --password-file=$PASS \
--include=$file $dir $user@$host::$module > /dev/null >&"
echo $cmd
$cmd
fi
;; MOVED_FROM|MOVED_FROM,ISDIR|DELETE,ISDIR)
if [ "${file: -4}" != '' ] && [ "${file: -1}" != '~' ]; then
cmd="$RSYNC -zahqzt --password-file=$PASS --exclude=$file \
$dir $user@$host::$module > /dev/null >&"
echo $cmd
$cmd
fi
;;
esac
done &
done
chmod +x /root/inotify_monitor.sh
设置RSYNC自动登录验证密码
1 vi /root/rsync.pwd
2 xxxxxx
vi /root/rsync.pwd
xxxxxx
保存,退出
设置只有ROOT才可以查看的权限.
1 chmod 0600 /root/rsync.pwd
chmod /root/rsync.pwd
以下是备从务器B的配置:
安装RSYNC
1 yum rsync -y
配置RSNYD服务:
1 vi /etc/rsyncd.conf
内容如下,需要把Apache修改成你运行网站的用户名,我的是因为原来使用apache,虽然现在用Nginx,也一直没改用户名:
1 uid = apache
2 gid = apache
3 use chroot = no
4 max connections = 4
5 pid file = /var/run/rsyncd.pid
6 lock file = /var/run/rsync.lock
7 log file = /var/log/rsyncd.log
8
9 [bbsatt]
10 path = /从服务器B本地用于存放备份的目录
11 ignore errors
12 read only = no
13 list = false
14 hosts allow = 主服务器A的IP
15 auth users = rsync
16 secrets file = /etc/rsync.pas
1 vi /etc/rsync.pas
2 rsync:xxxxxx
1 chmod 0600 /etc/rsync.pas
uid = apache
gid = apache
use chroot = no
max connections =
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 /etc/rsync.pas
启动RSYNCD
1 rsync --daemon
rsync --daemon
添加开机自动启动服务:
1 vi /etc/rc.local
vi /etc/rc.local
添加以下内容:
1 rsync --daemon
rsync --daemon

回到主服务器A,
1 vi /etc/rc.local
vi /etc/rc.local
添加以下内容,实时开机自动同步:
1 /root/inotify_init.sh
2 /root/inotify_monitor.sh
/root/inotify_init.sh
/root/inotify_monitor.sh

保存退出
运行
/root/inotify_init.sh
1 /root/inotify_monitor.sh
/root/inotify_monitor.sh
好了,这样就能实现实时同步图片文件了.随便在主服务器A的同步目录下新建一个文件试试吧.
注:转载https://www.linuxidc.com/Linux/2012-06/63624.htm
linux实现多台服务器文件同步的更多相关文章
- linux下两台服务器文件实时同步方案设计和实现
inux下两台服务器文件实时同步方案设计和实现 假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器 有目录 /opt/test/ 192.168.0.2 目标服务器 有目录 /o ...
- Windows Server 2012 两台服务器文件同步
下载cwRsyncServer软件安装(这是Windows下的文件同步软件) 一.(1)在文件客户端服务器安装该软件,找到安装位置下的rsyncd.conf,修改配置文件(注意在Windows下输入位 ...
- linux下两台服务器文件实时同步方案实现-乾颐堂
假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器 有目录 /opt/test/ 192.168.0.2 目标服务器 有目录 /opt/bak/test/ 实现的目的就是保持这两 ...
- CentOS7通过rsync+crontab实现两台服务器文件同步
centos7系统中已经默认安装rsync 1:主服务器配置 (1)修改rsyncd.conf 配置文件 [root@localhost app]# vi /etc/rsyncd.conf motd ...
- Linux下利用rsync实现多服务器文件同步
windows做为文件服务器,使用rsync的windows服务版本,然后配置好就可以了.需要的朋友可以参考下. windows做为文件服务器,使用rsync的windows服务版本:cwRsyncS ...
- 使用rsync+inotify同步两台服务器文件
目标功能:将B服务器文件同步到A服务器 A服务器rsyncd.conf配置 权限600 A服务器rsyncd.pas文件配置 权限600 同步文件路径 /data/wwwroot/shen/ 权限 ...
- BAT实现服务器文件同步
服务器文件同步有很多工具,例如 GoodSync.rsync.BitTorrent Sync等……其实WINDOWS下自带了一个文件同步利器:ROBOCOPY.它是一个命令行的目录复制命令,自从Win ...
- Linux下 两台机器文件/文件夹 相互拷贝
Linux下 两台机器文件/文件夹 相互拷贝 设有两台机器 :A:*.101及 B:*.102. 把A下的.temp/var/a.txt拷贝到B机器的/text/目录下: 进入B机器:scp root ...
- 两台Linux服务器文件同步
在给公司或者学校做系统部署的时候,为了数据安全往往我们至少需要两台服务器,接下来请看: 我们要实现的是把客户端(192.168.0.1)的复制到目标服务器(192.168.0.2) 一.目标服务器 1 ...
随机推荐
- 【项目发起】千元组装一台大型3D打印机全教程(一)前言
前言 最近又碰到了大尺寸模型打样的需求,我这台17cm直径的kossel mini就捉襟见肘了.怎么办呢,这个时候kossel的好就体现出来了,随意扩展,那么就自己做个kossel-max吧.为了向前 ...
- CentOS笔记-系统概述
Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管 ...
- struts2 过滤器
Chain.doFilter的作用就是继续请求的传递,可传递给下一个filter也可传递给目标页面 如左侧传递给filter2,但fiter2使用上面或者下面的方法将倾情重定向到一个新的页面,而不再传 ...
- js遍历map
//火狐控制台打印输出: Object { fileNumber="文件编号", fileName="文件名称"} console.log(map); for( ...
- FZU2150 Fire Game —— BFS
题目链接:https://vjudge.net/problem/FZU-2150 Problem 2150 Fire Game Accept: 2702 Submit: 9240 Time Li ...
- topcoder 的一些输入输出格式
自从上年的11月份参加过TC的比赛后,就再也没有参加了,因为它的输入输出格式比较难接受,还有它的页面字体比较小,看得我很辛苦...藉口藉口--懒而已!不过以后我会尽量去参加的,为了提高自己的编程能力. ...
- jsp项目上传到服务器
我们通过Myeclipse完成一个Java web项目时只能通过本地访问来查看,但是我们想把它上传到服务器上使用外网访问应该怎么做呢,首先肯定是要有一台服务器 个人调试项目试手的话我建议去买阿里云的云 ...
- os、sys和shutil模块
运行环境:python3 OS模块:os 模块提供了一个统一的操作系统的接口函数 下面的path指路径的意思 os.stat(file) #查询文件属性操作 os.sep #取代操作系统特定的路径分隔 ...
- putty与emacs
win环境下putty登录到linux并使用emacs时,需要折腾好配置才能正常工作.下面是折腾过程中碰到的问题与解决步骤: 1)要在putty控制台中启用鼠标,只需要在.emacs配置文件中启用xt ...
- [存档]获取通讯录信息并写到SD卡上
下面是代码,不过没有字母表的顺序排列: package com.example.getcontacts; import java.io.FileWriter; import java.io.IOE ...