1.1Rsync介绍
1.1.1什么是rsync?
Rsync是一款开源的、快速的、多功能的、可实现增量的本地或远程数据镜像同步备份优秀工具.rsync适用于unix/linux/windows等多种平台.
官方的英文简单描述:rsync-a fast,versatile,remote(and locale)file-copying tool
1.1.2rsync简介
Rsync是一款优秀的、快速的、多功能的本地或远程数据镜像同步备份工具.适用于unix/linux/windows等多种平台.
从软件的名称rsync(remote rynchronization)可以看出来,rsync具有可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能.
在同步备份时,默认情况下,rsync通过其独特的”quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要指定参数),甚至是只同步一个文件里有变化的内容部分,所以,可实现快速的同步 数据的功能.
提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此,从性能及效率上更胜一筹.
1.1.3rsync的特性
Rsync的特性如下:
●支持拷贝特殊文件如链接,设备等
●可以有排除指定文件或目录同步的功能, 相当于打包命名tar
●可以做到保持原来文件或目录的权限、时间、软硬链接等所有属性均不改变.
●可实现增量同步,即只同步发生变化的数据,因此数据传输效率很高.
●可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socket连接.
●支持匿名的或认证的进程模式传输,方便进行数据备份或镜像.
2.1rsync工作方式
为了方便读者学习,根据使用的经验,从实际的使用功能上进行了一下划分,一般来说,rsync大致使用三种主要的方法来传输数据.分别是:1.本地数据传输;2.通过rcp,ssh等通道传输;3.以守护进程的方式传输数据.下面我们分别来加以说明.
2.1.1本地数据传输(local-only mode)
Rsync本地传输的语法为:
Rsync[option…] src…[dest]
语法说明:
- rsync为同步命令2) [option…]为同步时的参数选项;3)src为源,即待拷的分区,文件或目录等;
4) [dest]为目的分区、文件或目录等;
Rsync –avz /opt/ /tmp 同步文件,chmod –R 700 wj 查看下同步过去文件属性是否改变
上例演示了将本地/opt目录下的文件(不包含opt本身)同步到/tmp下,其中-avz就是保持目录或文件的相关属性的参数.
特别提示,请注意以下两种命令的差别:
1)rsync –avz /opt/ /tmp/ 2)rsync -avz /opt /tmp/
1)中/opt/意思是,仅把/opt/目录里面的内容同步过来,opt目录本身并不同步;而后者2)中/opt表示把opt本身及其内部内容全都同步到/tmp下,仅一个/(斜线之差),意义就大不相同,请读者注意使用的差别.
2)在下面的通过远程 shell进行数据传输的内容也会有类似的问题.
当本地的不同目录之间需要数据传输,特别是经常需要增量传输时,这个命令可以替代cp等命令,为你提升拷贝的效率.
2.1.2通过远程shell进行数据传输(remote shell mode)
通过远程shell(rcp、ssh等)传输可以分两种情况,其语法分别为
拉取pull:rsync[option][user@]HOST:SRC…[DEST]
推送push:rsync[option]SRC…[USER@]HOST:DEST
语法说明:
- Rsync为同步的命令;
- [OPTION]为同步时的参数选项;
- [USER@]HOST…为rsync同步的远程的连接用户和主机地址
- Src为源,即待拷的分区、文件或目录等,和host之间用一个冒号连接;
- [DEST]为目的分区、文件或目录等;
其中拉取(get),表示从远端主机把数据同步到执行命令的本地主机相应目录;推送(put)表示从本地主机执行命令把本地的数据同步到远端主机指定目录下.
拉取实例:
Rsync –vzrtopg –progress –e ‘ssh –p 22’ wj@10.0.0.1:/opt /tmp
关键语法说明:
1)-vzrtopg相当于上文的-avz,表示同步时文件和目录属性不变.参数细节见后文.
2)—progress显示同步的过程,可以用-P替换.
3)-e ‘ssh –p 22’,表示通过ssh的通道传输数据,-p 22可省略.
4) wj@10.0.0.1:/opt远程的主机用户,地址,路径.
5)/tmp本地的路径
推送实例:
Rsync –vzrtop –progress -e ‘ssh -p 22’ /etc wj@10.0.0.1:/tmp
通过root用户把本地的/tmp目录(不包括目录本身)推送到10.0.0.1的/opt目录
特殊说明:
- 上文的数据同步都是加密传输的,因为通过了ssh通道进行传输.
- 在传输前需要进行连接用户(一般为系统用户)密码验证,需要手工输入密码.这里我们借助前面章节的ssh key密钥免登陆验证的方式来实现,无交互式验证数据传输.
- Rsync软件必须安装在本地及远程所有机器上.
2.1.3使用守护进程的方式数据传输(daemon mode)
通过守护进程方式传输同样分为两种情况,每种情况又有两种语法写法,分别为:
拉取:①rsync[OPTION…] [USER@]HOST::SRC…[DEST]
②rsync[OPTION…] rsync://[USER@]HOST[:PORT]/SRC…[DEST]
推送:①rsync[OPTION…] SRC…[USER@]HOST:: [DEST]
②rsync[OPTION…] SRC… rsync://[USER@]HOST[:PORT]/ [DEST]
特别值得注意的是,与远程shell方式的命令不同的是,第①种语法格式,本节命令[USER@]HOST::SRC和[USER@]HOST::DEST结尾处,均为双冒号连接SRC或DEST,另外,这个SRC或DEST也不再是路径了,而是守护进程中配置的模块名称.下文会以例子详细说明.
第2种方法实例(rsync://):
拉取实践命令:
rsync -avzrtopg --progress rsync://rsync_backup@10.0.0.141:/wj/ /test/ --password-file=/etc/rsync.password
推送实践命令:
Rsync -avzrtopg --progress /test/ rsync://rsync_backup@10.0.0.141:/wj/ --password-file=/etc/rsync.password
特别说明:以上用法是个不错的方法,他在拉取和推送时的写法极其类似,尤其是后面讲守护进程服务时,第一种方法通过双冒号加模块名的方法不利于记忆,所以对于初学者,建议大家也可以记忆这种语法格式.
3.1通过rsync在本地传输数据实践
3.1.1rsync命令同步参数选项
Rsync[OPTION]SRC…[DEST]
常用参数选项说明:
-v, --verbose 详细模式输出,传输时的进度等信息
-z,--compress传输时进行压缩以提高传输效率,-compress-level=NUM可按级别压缩
-r,--recursive对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
-t,--times保持文件时间信息
-o,--owner保持文件属主信息
-p,--perms保持文件权限
-g,--group保持文件属组信息
-P,--progress显示同步的过程及传输时的进度等信息
-a,--archive归档模式,表示以递归方式传输方式,并保持所有文件属性,等于-rtopgDl
-e,--rsh=COMMAND使用的信道协议,指定代替rsh的shell程序.例如:ssh
--exclude=PATTERN指定排除不需要传输的文件模式
-D,--devices保持设备文件信息
-l,--links保留软连接
保持同步目录及文件属性
这里的-avz –progress相当于-vzrtopDl –progress(还多打了个Dl功能),生产环境常用的参数选项为-avz --progress或-vzrtopg –progress 如果时放入脚本中,也可以把-v和—progress去掉.这里的—progress可以用-P代替.
特别说明:刚开始学抓重点,相关参数还有非常多,需要时可以自行man rsync或者查看参考资料地址. https://www.samba.org/ftp/rsync/rsync.html OPTIONS SUMMARY节
3.1.2使用rsync在本地备份传输数据
实例一:将/etc下全部内容(包括etc目录本身)备份到/tmp下面
rsync –avz /etc /tmp/
第一次运行命令会由于需要扫描并同步所有文件及目录,因此时间会长一些.如果再次备份就会进行快速对比,忽略通过的文件,速度更快,如下文:
rsync –avz /etc /tmp/
我们可以看到立刻就同步完成,要传输的数据也很少了.因为rsync会比对所有文件和目录,仅同步有变化(内容,修改时间等各种属性)的文件或目录.如果换做cp命令,那么还会重新拷贝完整拷贝.浪费系统时间和时间.
当然本地备份同步不仅仅备份目录,还可以同步单个文件,设备等.
特别提示:在传输数据时,rsync命令也需要有对同步的目录拥有权限可以实现正常传输数据.
4.1借助ssh通道在不同主机之间传输数据
4.1.1借助ssh通道在不同主机之间传输数据
实例1:将10.0.0.141主机的/etc下全部内容备份到10.0.0.142主机的/tmp下面
4.1.1.1借助ssh通道从远端主机拉取数据例子实践:
拉取:rsync –avz –P –e ‘ssh –p22’ root@10.0.0.142:/etc /tmp
推送:rsync –avz –P /tmp –e ‘ssh –p22’ root@10.0.0.142:/etc
4.1.2借助ssh key密钥实现数据免登陆验证加密传输
说明,如果事先设置了ssh key密钥免登陆验证,即可用rsync通过ssh方式免登陆验证同步传输数据,这是生产场景常用的方法之一.
4.1.2.1配置ssh key密钥实现数据免登陆验证
此部分在ssh key密钥实现数据免登陆验证章节
4.1.2.2实践ssh key密钥实现数据免登陆验证传输数据
Sh –x fenfa.sh会显示执行脚本的过程
说明:我们假设已经建立好了从10.0.0.141到10.0.0.142的kkk用户的免密码验证登陆配置.
Mkdir wj cd wj/ touch test1 test2
Rsync –avz –P –e ‘ssh –p 22’ ~/wj kkk@10.0.0.142:~/表示把当前用户/wj的数据传输到10.0.0.142的kkk用户家目录中
特别提示:本文免验证连接分发文件是基于普通用户wj的,如果要实现hosts文件的推送工作,是需要root权限的,我们该怎么办呢?
方法大概有三:
法一:此时可以把wj用户配置成sudo权限用户,然后就可以实现通过sudo功能来实现普通用户推送只有root才能处理的问题了.推荐此方法
1.执行visudo开启Defaults requiretty参数
2.使用ssh的如下命令”ssh –t hostname sudo<cmd>”
more /etc/sudoers查看如下内容可知:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
报错: sudo: sorry, you must have a tty to run sudo
https://blog.youkuaiyun.com/breezehappy/article/details/38895375
法二:setuid权限位,可以把所有客户端如echo、cp、scp命令,修改为setuid位,这样在推送文件时就可以使用以上命令,来搞定了.不推荐这个方法,提出来是开拓大家的发散思维.
法三:可以配置root用户的免登陆认证,但这又会带来一定的安全问题(虽然可以防火墙封堵ssh端口),法三比使用sudo方法稍逊一筹.
更详细的说明可见ssh key的相关章节 六 分发数据免密码登陆的几点须知!
不管用什么方法,我们一定要管理好中心分发服务器A,因为它的权限很大,很重要.
如:取消中心分发服务器的外网ip,开启防火墙禁止ssh对外用户登录,并仅给某一台后端无外网机器访问.然后这台后端的服务器依然没外网ip,并且仅能通过vpn连接,这样中心分发服务器就相对安全了.发现,其中数百台服务器大并发流量的公司,还在用上面提到办法.
4.1.2.3生产环境ssh key密钥组合rsync实现数据分发的方案
5.1以守护进程的方式传输数据(重点)
5.1.1部署前的准备工作:
5.1.1.1部署环境
用vmvare虚拟机环境下linux主机进行试验.
操作系统Cat /etc/redhat-release uname –mi
内核版本:uname –r
主机名 | 网卡eth0 | 默认网关 | 用途 |
A-server | 10.0.0.141 | 10.0.0.254 | 数据备份服务器 |
B-server | 10.0.0.142 | 10.0.0.254 | 节点服务器 |
C-server | 10.0.0.143 | 10.0.0.254 | 节点服务器 |
提示:如无特殊说明,子网掩码均为255.255.255.0
5.1.1.2具体需求
要求在A-server上以rsync守护进程的方式部署rsync服务,使得所有客户端主机,可以把本地数据通过rsync的方式到数据备份服务器A-server上.本例的客户端仅以B-server、C-Server为例.
5.1.1.3备份拓扑
(rsync守护进程方式备份数据解决方案图)
5.1.2开始部署rsync服务-rsync服务器端操作过程:
5.1.2.1配置rsyncd.conf
1)配置rsyncd.conf
cat > /etc/rsyncd.conf << EOF #Rsync server #created by wj 2018-04-18 ##rsyncd.conf start## uid = rsync # rsync 对后面模块中的path路径拥有什么权限 gid = rsync # rsync 对后面模块中的path路径拥有什么权限 use chroot = no # 安全操作 max connections = 2000 # 定义连接数2000 timeout = 600 # 600秒超时 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors # 忽略错误 read only = false # false才能上传文件,true 不能上传文件 list = false # 文件列表 hosts allow = 172.16.100.0/24 hosts deny = * auth users = rsync_backup # 虚拟用户,同步时需要用这个用户 secrets file = /etc/rsync.password # 密码文件 [web] # 模块名称 comment = redhat.sx site files by sunsky 00:17 2013-06-28 # 注释 path = /data/web/redhat.sx # 模块的路径 #################################### [data] comment = redhat.sx site sit data files by sunsky 00:17 2013-06-28 path = /data/web_data/redhat.sx ##################################### EOF |
Vi /etc/rsyncd.conf #增加如下配置,/etc/rsyncd.conf为默认的rsync服务的配置文件路径及文件名,特别注意,不要落下了d,是rsyncd.conf不是rsync.conf
#rsync_config_____________________start
#created by wj 2014-6-6
##rsyncd.conf start##
uid=rsync
gid=rsync
use chroot=no
max connections=200
timeout=300
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[wj]
path=/wj/
ignore errors
read only=false
list=false
hosts allow=192.168.125.0/24
hosts deny=0.0.0.0/32
auth users=rsync_backup
secrets file=/etc/rsync.password
#rsync_config----------------------------end
2)配置文件常用参数选项说明:
Rsyncd.conf参数 | 参数说明 |
uid=rsync | #<----rsync使用的用户,缺省uid为-2,通常为nobody |
gid=rsync | #<----rsync使用的组(用户所在的组),缺省gid为-2,通常为nobody |
use chroot=no | #<---如果为true,daemon会在给客户端传输文件前”chroot to the path”这是rsync安全的一个配置,因为我们大多数都是在内网使用rsync,所以不配也可以 |
max connections=200 | #<---设置最大连接数,默认为0,意为无限制,负值为关闭这个模块. |
timeout=300 | #<---默认为0,意no timeout,建议为300-600秒(5-10分钟) |
pid file=/var/run/rsyncd.pid | #<---rsync daemon启动后将其进程pid写入此文件.如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止. |
lock file=/var/run/rsync.lock
| #<---指定lock文件用来支持”max connections”参数,使得总连接数不会超过限制,默认为/var/run/rsyncd.lock |
log file=/var/log/rsyncd.log
| #<---不设或者设置错误,rsync会使用syslog输出相关日志信息 |
ignore errors | #<---忽略I/O错误 |
read only=false | #<---指定客户端是否可以上传文件.默认对所有模块都为true,否则只能下载 |
list=false | #<---是否允许客户端可以查看可用模块列表,默认为可以 |
hosts allow=10.0.0.0/24 | #<---指定可以联系的客户端主机名和ip地址或地址段,默认情况没有此参数,即都可以连接. |
hosts deny=0.0.0.0/32 | #<---指定不可以联系的客户端主机名和ip地址或地址段,默认情况没有此参数,即都可以连接. |
auth users=rsync_backup | #<---指定以空格或逗号分隔的用户可以使用哪些模块.用户不需要在本地系统中存在.默认所有用户无密码的访问(anonymous rsync) |
secrets file=/etc/rsync.password | #<---指定用户名和密码存放的文件.格式:用户名:密码,密码不超过8位 |
[wj] | #<---这里就是模块名称,需要中括号括起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护. |
path=/wj/ | #<---在这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题. |
#exclude=a c b/2 | #<---排除的文件或目录,相对路径 |
man rsyncd.conf查看配置参数细节
特别说明:
- 模块中的参数项可以拿到全局配置中使用
- 以上配置文件中的参数,经常使用的参数.
- 以上配置文件中没有提到的参数请参考 附录一些或man rsyncd.conf查看
- 如果配置中的path=/wj/提到的路径不存在则需要创建,
命令为:mkdir –p /wj
useradd rsync –s /sbin/nologin -M
chmod –R root.root /wj #授权权限可以根据配置文件中的属主来
5.1.2.2配置用于rsync同步的账号、密码及账号文件权限
echo “rsync_back:wj”>/etc/rsync.password #<----echo命令的快速编辑用法
#<---注意:其中rsync_backup:wj中的rsync_backup为同步传输用到的虚拟账号,这个账号仅为rsync的账号,不需要是系统账号,后面的wj123为密码,不超过8为.账号和密码中间用冒号分割.
chmod 600 /etc/rsync.password #<---必须为600权限
#check
cat /etc/rsync.password #<----操作完检查是个好习惯
ll /etc/rsync.password #<----操作完检查是个好习惯
5.1.2.3启动rsync服务
以守护进程方式来启动rsync服务:
rsync --daemon #<----daemon表示以守护进程的方式启动rsync服务
拓展:rsync的进程参数选项:
----daemon #<----daemon表示以守护进程的方式启动rsync服务
----address #<---- address绑定指定ip地址提供服务
----config=FILE #<----更改配置文件路径.而不是默认的/etc/rsyncd.conf
----port=PORT #<----更改其它端口提供服务,而不是缺省的873端口
提示:以上几个选项为了解内容,生产场景使用的不多.
ps –ef|grep rsync|grep –v grep去掉grep自己查看进程
netstat –lnt|grep :873 lsof –i tcp:873
5.1.2.4设置rsync服务开机自启动
echo “/usr/bin/rsync --daemon”>>/etc/rc.local
注意:当然还可以使用chkconfig rsync on命令
#重启rsync的组合命令
pkill rsync #<----关闭rsync服务
rsync –daemon #<--启动rsync服务
ps –ef|grep rsync #<---检查rsync服务
启动服务拓展:可以写一个简单的启动脚本:
#!/bin/sh #author wj #rsync Start/Stop Rsync service #chkconfig:35 13 91 #description:this is Rsync service management shell script #processname:rsyncd #Source function library . /etc/rc.d/init.d/functions start(){ rsync --daemon if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ]; then action "Starting Rsync:" /bin/true sleep 1 else action "Starting Rsync:" /bin/false sleep 1 fi } stop(){ pkill rsync;sleep 1;pkill rsync #if [$? -eq 0 -a ‘ps -ef|grep -v grep|grep rsync|wc -l’ -lt 1]; then if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ]; then action "Stopping Rsync; `ps -ef|grep -v grep|grep rsync|wc -l` " /bin/true sleep 1 else action "Stopping Rsync; `ps -ef|grep -v grep|grep 'rsync --daemon'|wc -l`" /bin/false sleep 1 fi } case "$1" in start) start ;; stop) stop ;; restart|reload) $0 stop $0 start ;; *) echo $”Usage: $0{start|stop|restart|reload}” ;; esac |
保存成rsyncd,放到/etc/init.d/rsyncd
dos2unix /etc/init.d/rsyncd 格式化脚本windows脚本文件粘贴到linux上时
chmod 700 /etc/init.d/rsyncd
chkconfig rsyncd on
chkconfig –list|grep rsync
5.1.3开始部署rsync服务—Rsync客户端操作过程:
5.1.3.1配置rsync账号及账号文件权限
请注意与服务端的配置的区别
###client端:[10.0.0.142和10.0.0.142]分别做如下操作:
###auth
echo "wj123" >> /etc/rsync.password #<---这里仅配置了密码,不需要账号了.这是与服务端的区别.
chmod 600 /etc/rsync.password #<----必须为600权限
###for check
cat /etc/rsync.password
ll /etc/rsync.password
到此rsync服务配置大功告成!
5.1.4检查部署的rsync服务:
默认情况,以下均在rsync客户端执行操作:下面以[ip:10.0.0.142]B-Server为例说明:
5.1.4.1推送(即从客户端同步文件或目录到服务器端)
从客户端推送/etc目录到服务器端rsync指定的目录(本文档为/wj)下:
这时我们到服务端指定的rsync备份目录/wj下面,发现已经有了etc目录及文件
ls –l /wj/
du -sh /wj/etc/
以上同步传输命令拆解简要说明如下,详见本章结尾附录二:
同步命令为:rsync –avz –P /etc rsync_backup@10.0.0.141::wj/ --password-file=/etc/rsync.password
-az #<---保持文件原有属性的若干参数;(注意:-avz相当于vzrtopg多了Dl)
-v –progress #<----是指显示出详细的进度情况;
/etc #<-----要推送的本地目录
rsync_backup@10.0.0.141::wj/ #<------rsync_backup为rsync同步的虚拟用户,后面为要推送的目的地的(rsync服务端)ip及目录,注意ip和目录间有两个冒号,且双冒号后的wj是配置文件中的模块名,而非目录名.
--password-file=/etc/rsync.password #<----指定客户端本地的密码文件,确保无须交互输入验证密码.
--delete #如果客户端本地不存在的目录或文件,在推送时,服务端也把相应文件或目录删除,保持客户端与服务端真正的数据一致;这个参数,比较危险,请慎用.
推送结论:这就是-delete参数的作用,它可以使本地的目录和rsync服务端指定的目录实现完全同步,即本地有啥远端就有啥,本地没有的,远端也必须删除.确保数据一致.推送时使用—delete命令有使远端rsync服务端的目录丢失数据的分险.
5.1.4.2拉取(即从服务端同步文件或目录到客户端)
从服务器端rsync指定的目录下 拉取所有文件到 客户端本地目录/mnt:
rsync –avz –P rsync_backup@10.0.0.141::wj/ /mnt/ --password-file=/etc/rsync.password
拉取方法结论:这就是-delete参数的作用,它可以使rsync服务端指定的目录和本地的目录完全同步,即远端有啥本地就有啥,远端没有的,本地有也必须删除.确保数据一致.如果拉取到本地的目录是系统目录,例如/就超级危险了.
rsync –avz –P –delete rsync://rsync_backup@10.0.0.178:/wj/ /tmp/ --password-file=/etc/rsync.password
rsync –avz –P –delete rsync_backup@10.0.0.178::wj /tmp/ --password-file=/etc/rsync.password
实践过的脚本守护进程方式只能在客户端执行:
拉取:sudo rsync -avzP rsync_backup@192.168.125.128::wj /opt/a --password-file=/etc/rsync.password 推送: sudo rsync -avzP /opt/a rsync_backup@192.168.125.128::wj --password-file=/etc/rsync.password |
报错: @ERROR: auth failed on module wj
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
客户端密码和服务器端不一致,账号不一致,/etc/rsync.password权限为root不要改为rsync,配置文件不正确
rsync -avz -p a_2018-04-18.tar.gz rsync_backup@192.168.125.128::wj 执行这条命令的虚拟账号和服务器端的/etc/rsync.password中存的账号一致
the remote path must start with a module name not a / 将模块前的斜线去掉
no route ot host
解决:可能防火墙阻挡了.telnet ip 873检查,如果出现connection refuse字样表示防火墙阻挡或服务启动好.
Rsync+inotify实时数据同步
inotify master端的配置
特别说明:下面的配置是建立在rsync服务基础上的配置过程.
rsync –avzP –timeout=100 /data0/www/www/ rsync_backup@10.0.0.191::www/ --password-file=/etc/rsync.password
- 查看当前系统是否支持inotify
[wj@hcf ~]$ ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Sep 21 13:08 max_queued_events
-rw-r--r-- 1 root root 0 Sep 21 13:08 max_user_instances
-rw-r--r-- 1 root root 0 Sep 21 13:08 max_user_watches
2)下载inotify源码包
[wj@hcf ~]$ cd /home/wj/tools/
[wj@hcf tools]$
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 此地址失效
wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
3)编译安装inotify(在root用户下操作)
[root @hcf tools]$ tar zxf inotify-tools-3.14.tar.gz
[root @hcf tools]$ cd inotify-tools-3.14
[root@hcf inotify-tools-3.14]$ ./configure --prefix=/usr/local/inotify-tools-3.14
[root@hcf inotify-tools-3.14]# make && make install
4)编写inotify实时监控脚本
[root@hcf inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_user_watches
8192
[root@hcf inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_queued_events
16384
事件监控脚本:
vi inotify.sh
#!/bin/bash
#para
host01=10.0.0.191
src=/data0/www/www/
dst=www
user=rsync_backup
rsync_passfile=/etc/rsync.password
inotify_home= /usr/local/inotify-tools-3.14/
#judge
if [ ! –e “$src”]\
||[! –e”${rsync_passfile}” ]\
||[! –e”${inotify_home }/bin/inotifywait”]\
||[! –e “/usr/bin/rsync”];
then
echo “Check File and Folder”
exit 9
fi
${inotify_home}/bin/inotifywait –mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f’ –e close_write,delete,create,attrib $src\|while read file
do
#rsync –avzP –delete –timeout=100 –password-file=${rsync_passfile} $src $user@$host01$dst :: >/dev/null 2>&1
cd $src && rsync –aruz –R –delete ./ --timeout=100 $user@host01::$dst –password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
5)执行inotify监控脚本:
sh inotify.sh &
6)查看命令脚本的执行程序是否在执行:
ps –ef|grep inotify
7)在监控目录下面创建100个目录测试:
for n in ‘seq 100’;do mkdir /data0/www/www/$n;done
for f in`echo {101..200}`;do touch $f;done
8)在rsync服务器端验证是否成功:
tree –L 1
至此,使用rsync+inotify来实现实时远程同步完成;
vi w_inotify.sh
#!/bin/sh
count=100
while true
do
for((i=1;i<=$count;i++))
do
/bin/cp 10k.jpg /data0/www/www/$i/10k_`echo$(date)$RANDOM|md5sum |cut –c 1-8`.jpg
done
sleep 1
for((i=1;i<$count;i++))
do
/bin/cp 50k.jpg /data0/www/www/$i/50k `echo $(date)$RANDOM|md5sum |cut –c 1-8`.jpg
done
sleep 1
done
echo –en “`date+%H:%M`\t”>>/tmp/tmp.log&&tree |wc –l>>/tmp/tmp.log
[wj@hostname a]$ ll /usr/sbin/auto_rsync.sh -rw-r--r-x. 1 root root 1006 Apr 20 21:19 /usr/sbin/auto_rsync.sh 脚本内容: #!/bin/bash src1='/opt/a' #src2='/data/web_data/redhat.sx/' des1=wj #des2=data host1=192.168.125.128 #host2=192.168.125.129 user=rsync_backup allrsync='/usr/bin/rsync -rpgovz --delete --progress' /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %w %f %e' -e modify,delete,create,attrib $src1 | while read DATE TIME DIR FILE EVENT; do case $DIR in ${src1}*) $allrsync $src1 $user@$host1::$des1 --password-file=/etc/rsync.password && echo "$DATE $TIME $FILE was rsynced" &>> /var/log/rsync-$des1-$host1.log $allrsync $src1 $user@$host2::$des1 --password-file=/etc/rsync.password && echo "$DATE $TIME $FILE was rsynced" &>> /var/log/rsync-$des1-$host2.log;; #${src2}*) #$allrsync $src2 $user@$host1::$des2 --password-file=/etc/rsync.password && echo " #$DATE $TIME $FILE was rsynced" &>> /var/log/rsync-$des2-$host1.log #$allrsync $src2 $user@$host2::$des2 --password-file=/etc/rsync.password && echo " #$DATE $TIME $FILE was rsynced" &>> /var/lsg/rsync-$des2-$host2.log;; esac done 测试脚本创建10M的文件for i in {1..10};do dd if=/dev/zero of=/opt/a/$i.html bs=10M count=1 ;done |