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:
|
1
2
3
4
5
|
ll /proc/sys/fs/inotifytotal 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.gztar xzvf inotify-tools-3.14.tar.gzcd inotify-tools-3.14./configure --prefix=/usrmakemake 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/shSRC=/主服务器A需要同步的目录/ #记得在最后面加/不然RYNC会自动增加一层目录 DES=bbsattIP=从服务器B的IPUSER=rsync#DST=/etc/rsyncd 远程rsync模块下的目录INWT=/usr/bin/inotifywaitRSYNC=/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/inotifywaitRSYNC=/usr/bin/rsyncPASS=/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 eventdo#echo $event'-'$filecase $event inMODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; thencmd="$RSYNC -zahqzt --exclude='*' --password-file=$PASS--include=$file $dir $user@$host::$module > /dev/null 2>1&"echo $cmd$cmdfi;; MOVED_FROM|MOVED_FROM,ISDIR|DELETE,ISDIR)if [ "${file: -4}" != '4913' ] && [ "${file: -1}" != '~' ]; thencmd="$RSYNC -zahqzt --password-file=$PASS --exclude=$file$dir $user@$host::$module > /dev/null 2>1&"echo $cmd$cmdfi;;esacdone &done |
|
1
|
chmod +x /root/inotify_monitor.sh |
设置RSYNC自动登录验证密码
|
1
2
|
vi /root/rsync.pwdxxxxxx |
保存,退出
设置只有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 = apachegid = apacheuse chroot = nomax connections = 4pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log [bbsatt]path = /从服务器B本地用于存放备份的目录ignore errorsread only = nolist = falsehosts allow = 主服务器A的IPauth users = rsyncsecrets file = /etc/rsync.pas |
|
1
2
|
vi /etc/rsync.pasrsync: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的同步目录下新建一个文件试试吧.
inotify-tools+rsync实时同步文件安装和配置的更多相关文章
- linux下实现多台服务器同步文件(inotify-tools+rsync实时同步文件安装和配置)
inotify-tools+rsync实时同步文件安装和配置 注:转载https://www.linuxidc.com/Linux/2012-06/63624.htm
- CentOS7之Rsync+Inotify架构实现实时同步文件和文件夹
简介:rsync是用来同步文件和文件夹的,inotify是用来实现监听变动而自动同步的 OS:Centos7.3 服务器端:172.16.13.157 客 户 端 :172.16.13.156 目 ...
- rsync实时同步文件
http://rsync.samba.org/download.html [root@v01 src]# yum install git [root@v01 src]# git clone git:/ ...
- rsync+inotify安装配置 实时同步文件
安装 #安装inotify 工具 [root@localhost ~]# yum install inotify-tools -y 常用命令 [root@localhost ~]# inotifywa ...
- linux设置rsync+inotify实时同步文件
linux设置rsync+inotify实时同步文件 应用场景: 同步接收方:test01 接收目录:/opt/software/test/a/ 同步发起方:test02 同步目录:/opt/so ...
- CentOS 6.5 rsync+inotify实现数据实时同步备份
CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...
- sersync基于rsync+inotify实现数据实时同步
一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...
- Centos7 rsync+inotify两台服务器同步文件(单向)
注:本篇介绍的是单向同步,即A文件同步到B,但B的文件不同步到A,双向同步的在下一篇文章中. rsync与inotify不再赘述,直接进入实战. 0.背景 两台服务器IP地址分别为: 源服务器:192 ...
- 真正的inotify+rsync实时同步 彻底告别同步慢
真正的inotify+rsync实时同步 彻底告别同步慢 http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景 我们公司在用in ...
随机推荐
- C++中内存分配、函数调用和返回值问题
转载博客:http://blog.csdn.net/q_l_s/article/details/52176159(源地址找不到,就贴了这位大神的博客地址,他也是转载的,不过要是学习的话,他的博客很不错 ...
- vue-cli 安装
1 node 下载 http://nodejs.cn/download/ 安装 2 npm install vue-cli -g 3 vue init <template-n ...
- java 如何将异常Exception的信息转换为String
一般情况下,我们是通过log4j封装的api将异常打印到日志当中. logger.error("error", e); 如果我们想在程序中获得该异常的详细信息,并输出到数据库中,我 ...
- 什么是J2EE的集群?
1. 前言 现在有越来越多的关键应用和大型应用是基于J2EE 来创建的,像银行系统和帐单系统这些关键应用要求有很高的可用性,而Google 和Yahoo 这样的大型应用就需要很好的可扩 ...
- Python笔记22-----高阶函数
1.sorted(排序对象,key=):排序对象可以是类别,也可以是字符串和字典,key为自定义排序,如:[key=abs,按绝对值排序][key=lambda x:x[1],按排序对象的第二个值排序 ...
- 洛谷P1427 小鱼的数字游戏
题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的 ...
- Python面向对象之静态方法、静态方法与类方法
静态属性: 类调用函数属性时,需要先将类实例化,再将实例作为函数属性传入:类的实例调用函数属性时需要在后面加括号. class Building: def __init__(self, name, o ...
- C# List源码分析(一)
事件原因,之前在公司写代码的时候,带我的师傅建议我对List的长度最好在初始化的时候进行优化,这样对GC更加友好,所以就有了这个文章,来理解下List 容量自适应的实现. List 继承于IList, ...
- 3、用js文件写mongo命令+update命令
一.用js写一个模拟用户登录日志表的信息 var userName = "chengxiang"; //声明一个登录名 var timeStamp = Date.parse(new ...
- java陷阱之spring事物未提交和回滚导致不可预知问题
案发现场 //防止全局配置了 所以这里定义sprnig 不托管事物 @Transactional(propagation = Propagation.NOT_SUPPORTED) public boo ...