一、rsync相关知识
1.1.什么是rsync
官方网址:http://sersync.sourceforge.net/
rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。
在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。
1.2.rsync的特性
Rsync的特性如下:
支持拷贝特殊文件如链接,设备等
可以有排除指定文件或目录同步的功能,相当于打包命令tar
可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。
1.3.rsync核心算法介绍
假定在名为α和β的两台计算机之间同步相似的文件 A 与 B ,其中α对文件 A 拥有访问权,β对文件 B 拥有访问权。并且假定主机α与β之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:
1.β将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
2. [endif]β对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。
3. [endif]β将这些校验结果发给α。
4. [endif]α通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5. [endif]α发给β一串指令来生成文件 A 在β上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
-------------------------------------小结------------------------------------------------
rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。
-----------------------------------------------------------------------------------------
1.4.rsync拉和取只能在客户端操作(重要)
在有rsync配置文件的情况下,拉和取都只能在客户端操作,如
web(rsync client) àbackup(rsync master)
web(rsync client) ßbackup(rsync master)
以上命令行的推送和拉取操作都是在web上进行的。
为什么呢?
很简单,如果推送和接取都在rsync客户端操作的话,试想一下,如果有一组web要备份到备份服务器中,那么所有的web服务器都要配置rsync服务端,为成了“1客户端多服务端”
会不会感觉很怪?!
再说每台web配置rsync服务端,还是在1台备份服务器配置一次rsync服务端,那种效率高?!当然是在备份服务器只配置一次啦!
再从资源占用上rsync客户端相对服务器端占用少,从安全角度还不会像服务端开放端口
如果是使用rsync命令直接同步,没有接配置文件的,在哪端执行都行。
如:rsync-ar [email protected]:/disk1/tools/* /disk1/tools/
1.5.rsync认证方式
rsync有两种常用的认证方式,一种是rsync-daemon方式,另外一种是ssh方式。在平时使用过程,我们使用最多的是rsync-daemon方式。
注意:在使用rsync时,服务器和客户端都必须安装rsync程序。
#1.rsync-daemon认证
rsync在rsync-daemon认证方式下,默认监听TCP的873端口。
rsync-daemon认证方式是rsync的主要认证方式,这个也是我们经常使用的认证方式。并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。
注意:rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。客户端启动不启动rsync服务,都不影响同步的正常进行。
#2.ssh认证
rsync在ssh认证方式下,可通过系统用户进行认证,即在rsync上通过ssh隧道进行传输,类似于scp工具。此时同步操作不在局限于rsync中定义的同步文件夹。
注意:ssh认证方式,不需要服务器和客户端配置rsync配置文件,只需要双方都安装rsync服务,并且也不需要双方启动rsync。
若rsync服务端SSH为标准端口,此时rsync使用方式如下:
rsync -avz /root/test [email protected]:/root/
1.6. rsync命令同步参数选项
常用参数选项说明:
参数完整参数说明
-v--verbose详细模式输出,传输时的进度信息
-z--compress传输时进行压缩以提高传输效率, --compress-level=NUM可按级别压缩
-a--archive归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl
-r--recursive对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
-t--times保持文件时间信息
-o--owner保持文件属主信息
-p--perms保持文件权限
-g--group保持文件属组信息
-P--progress显示同步的过程及传输时的进度等信息
-D--devices保持设备文件信息
-l--links保持软链接
-e--rsh=COMMAND使用的信道协议,指定替代rsh的shell程序,例如ssh
--exclude=PATTERN指定排除不需要传输的文件模式
--exclude-from=FILE从文件中读取指定排除不需要传输的文件模式
保持同步目录及文件属性:
这里的-avz --progress相当于-vzrtopgDl --progress(还多了个Dl功能),生产环境常用的参数选项为-avz --progress或-vzrtopg --progress 如果放入脚本中,也可以把-v和--progress(-P)去掉。
二、实验环境
2.1.实验环境
拓扑图:
2.2.centos6.5环境设置
#1.关闭iptables及selinux
setenforce off
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config
/etc/init.d/iptables stop
chkconfig iptables off
#2.设置时间同步
yum install ntp -y
/usr/sbin/ntpdate pool.ntp.org
echo '#time sync by hua'>>/var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1'>>/var/spool/cron/root
crontab -l
#3.其它
#1)修改主机名
vi /etc/sysconfig/network
#设置HOSTNAME=有机名
#rsync服务端所在主机,主机名修改为backup
sed -i "/HOSTNAME/s/`hostname`/backup/" /etc/sysconfig/network
grep 'HOSTNAME' /etc/sysconfig/network
#rsync客户端所在主机是跑web服务器,故主机名改为web
sed -i "/HOSTNAME/s/`hostname`/web/" /etc/sysconfig/network
grep 'HOSTNAME' /etc/sysconfig/network
#重启
shutdown -r now
#2)安装epel源(安装inotify)
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
三、rsync服务端安装及配置(备份服务器上操作)
3.1.rsync安装(yum)
#1.安装rsync
##rsync是靠xinetd管理的,也可以直接用“rsync
--daemon”后台运行
#xintetd为rsync 守护进程管理工具
yum install -y rsync xinetd
#2.查看安装目录
#从下面的目录中看,除了前两个其它的都不重要,一个是rsync配置,一个是rsync命令
#rsync是靠xinetd管理的
[root@backup ~]# rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.0.6
…
/usr/share/doc/rsync-3.0.6/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
#3.创建rsync用户及密码
useradd -s /sbin/nologin -M rsync id rsync
3.2.创建rsync配置文件
rsync服务器端需要两个配置文件:rsyncd.conf、rsyncd.password。其中rsyncd.conf默认存放在/etc/目录下,同时它也是rsync服务器的主配置文件。该文件配置了rsync服务器的控制认证、访问、日志记录等等。而rsyncd.password主要用于存储rsync用户名和密码。但是在rsync安装完毕后后是不会生成以上这两个配置文件的,需要我们手工进行创建。
#1.创建主配置文件rsyncd.conf
配置帮助:man rsyncd.conf,也可以看文章的“附一”
#在创建配置文件的时间,值得注意的是不要在参数同行后面加“#”号注解,这时会被
#认为是“#”是符号而非注解!
例如:authusers = test #虚拟用户,将会认为密码是“test #虚拟用户”而非test,会报
#“@ERROR: auth failed on module tools”,排得你头都大!!
cat>>/etc/rsyncd.conf<
#rsync_config______________________start
#created by oldboy
##rsyncd.conf start##
# 用户远端的命令使用rsync访问共享目录
uid = rsync
# 用户组
gid = rsync
# 安全相关
use chroot = no
# 最大连接数
max connections = 200
# 超时时间
timeout = 300
# 进程对应的进程号文件
pid file = /var/run/rsyncd.pid
# 锁文件
lock file =
/var/run/rsyncd.lock
# 日志文件
log file = /var/log/rsyncd.log
# 忽略错误
ignore errors
# 可写
read only = false
# 不能列表
list = false
# 允许连接的服务器
hosts allow = 192.168.3.0/24
# 后勤组连接的服务器
hosts deny = 0.0.0.0/32
# 虚拟用户,可以不存在
auth users = test
# 虚拟用户对应的用户和密码文件
secrets file =
/etc/rsync.password
# 模块名称
[web76_tools]
# 服务端提供访问的目录
path = /disk1/backup/76/disk1_tools
#rsync_config______________________end
EOF
cat /etc/rsyncd.conf
#修改目录权限,使它能读写操作
mkdir -p /disk1/backup/76/disk1_tools
chown rsync.rsync -R /disk1/backup/76/disk1_tools
#2.创建密码文件rsync.password
配置密码文件的格式为“用户名:密码”,密码文件权限必须为600
echo 'test:123456'
>/etc/rsync.password
cat /etc/rsync.password
chmod 600 /etc/rsync.password
3.启动rsync服务
#1.启动rsync服务
rsync --daemon
#拓展:rsync的进程参数选项
--daemon 表示以守护进程的方式启动rsync服务
--address 绑定指定的IP地址提供服务
--config=FILE 更改配置文件路径,而不是默认的/etc/rsyncd.conf
--port=PORT 更改其它端口提供服务,而不是缺少的873端口
提示:以上几个选项为了解内容,生产场景使用不多
ps -ef |grep rsync
netstat -antlp|grep rsync
#2.设置rsync服务开机启动
方法一:
echo '/usr/bin/rsync --daemon'
>>/etc/rc.local
tail -1 /etc/rc.local
#重启rsync组合命令
pkill rsync
pkill rsync
sleep 2
ps -ef |grep rsync
rsync --daemon
ps -ef |grep rsync
netstat -antlp|grep rsync
方法二:
#也可以使用xinetd启动,进行会显示为xinetd而非rsync
cd /etc/xinetd.d/
cp rsync rsync.orig
vim rsync
#修改如下:只需“disable = no”其它不变,user不要改为rsync否则手工测试会报
# “@ERROR: failed toopen lock file”错误
/etc/init.d/xinetd start
netstat -ntlp|grep 873
#注意,此处的进程是xinetd,并非是rsync
ps -ef |grep xinetd
#xinetd默认是开机启动的,所以不用chkconfig
xinetd on设置
chkconfig --list xinetd
四、rsync客户端安装及配置(web服务器上操作)
4.1.rsync安装(yum)
#1.安装rsync
##rsync是靠xinetd管理的,也可以直接用“rsync
--daemon”后台运行
yum install -y rsync xinetd
#2.创建rsync用户及密码
useradd -s /sbin/nologin -M rsync id rsync
4.22.创建密码文件rsync.password
客户端不需要用到/etc/rsyncd.conf配置文件,故不用生成。
#注意客户端的rsync.password只有密码,是不是“用户名:密码”!!
echo '123456' >/etc/rsync.password
cat /etc/rsync.password
#权限一定要为600
chmod 600 /etc/rsync.password
ll /etc/rsync.password
4.3.手工测试
登陆客户端,测试一下拉取命令
#建立测试目录,建立一个t1.txt文件,建立hua目录,建立一个软链接
mkdir -p /disk1/tools
cd /disk1/tools
echo "76 /disk1/tools/t1.txt"> t1.txt
echo 'web /disk1/tools/hua/1.txt' >hua/1.txt
echo 'web /disk1/tools/hua/2.txt' >hua/2.txt
ln -s /etc/nginx nginx
#手工测试rsync,记住要在客户端上操作
#rsync接模块用“用户@IP::模块”方式
rsync -avP /disk1/tools/* [email protected]::web76_tools--password-file=/etc/rsync.password
#从上面的图来看是推送成功了,去备份服务器查看一下,如图说明rsync支持软链接
ll /disk1/backup/76/disk1_tools/
cd /disk1/backup/76/disk1_tools
cat t1.txt
cat hua/1.txt
cat hua/2.txt
五、inotify+rsync实时同步
5.1.rsync的优点与不足
rsync在Linux/Unix下是一个比较重要和实用的服务,大家应该已经知道rsync具有安全性高、备份迅速、支持增量备份等优点。
通过rsync可以解决对实时性要求不高的数据备份需求,例如:定期备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据安全性和可靠性也提出了更高的要求,rsync在高端业务系统中也逐渐暴露出它的不足。
[if !supportLists]l [endif]首先,rsync在进行同步数据时,需要先扫描所有文件后进行比对,然后再进行差量传输。如果文件数量达到百万甚至千万级,扫描所以文件将是非常耗时的。而且发生变化的往往是其中很少的一部分文件,这是非常低效的方式。
[if !supportLists]l [endif]其次,rsync不能实时地去监测、同步数据。虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作之间一定会有时间差。这样就可能会导致服务端和客户端数据出现不一致的情况,无法在应用出现故障时完全恢复数据。
基于以上原因,所以就考虑采用rsync与inotify集成的方式来解决这些问题。
5.2.innotify介绍
#1.inotify是什么
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制。
Linux内核从2.6.13(2005年8月)起,加入了对inotify的支持,通过inotify可以监控文件系统中的添加、删除、修改、移动等各种细微事件。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样一个第三方软件。
在上面章节中,我们讲到,rsync可以实现触发式的文件同步。它是通过crontab守护进程方式触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变化时,就触发rsync同步,这就刚好解决了数据同步实时性的问题。
#2.inotify相关参数详解
inotify定义了三个接口参数,可以用来限制inotify消耗kernel
memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求实时的调节其大小。下面分别做简单介绍:
/proc/sys/fs/inotify/max_queued_evnets
表示请求events数的最大值,超出这个值的事件将被丢弃。该值默认为16384。
注意:max_queued_events是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。
如果你在日志中看到Event Queue
Overflow,说明max_queued_events太小需要调整参数后再次使用。
/proc/sys/fs/inotify/max_user_instances
表示每个user可创建的instances数量上限。该值默认为128。
/proc/sys/fs/inotify/max_user_watches
表示可监控目录的最大数。该值默认为8192。
要修改以上默认值,我们可以使用以下类似手段修改。如下:
echo30000000>/proc/sys/fs/inotify/max_user_watches
#安装inotify,“yum install inotify-tools”后就可以查看
#3.inotify监控的文件事件类型
inotify可监控的文件系统事件类型,如下:
IN_ACCESS:文件被访问。
IN_MODIFY:文件被write。
IN_ATTRIB:文件属性被修改,如chmod、chown等。
IN_CLOSE_WRITE:可写文件被close。
IN_CLOSE_NOWRITE:不可写文件被close。
IN_OPEN:文件被open。
IN_MOVED_FROM:文件被移出被监控目录,如mv。
IN_MOVED_TO:文件被移入被监控目录,如mv、cp。
IN_CREATE:文件/文件夹被创建。
IN_DELETE:文件/文件夹被删除,如rm。
IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除自己。
IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动自己。
IN_UNMOUNT:宿主文件系统被umount。
IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。
IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。
注意:上面所说的文件也包括目录。
#4.inotify-tools是什么
inotify仅仅是一个API,需要通过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。这些命令行工具可用于通过命令行或脚本对某些文件系统的事件进行监控。
inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。
notify不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,并且会产生一个umount事件。
inotify既可以监视文件,又可以监视目录。
4) [endif]inotify使用系统调用而非SIGIO信号来通知文件系统事件。
inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select和poll来监视文件系统的变化。
#5.inotify-tools与rsync集成
inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync客户端,而rsync服务器端正需要按照正常的配置进行即可。
注意:该集成的主要目的是把rsync客户端需要备份的文件实时推送到rsync服务器上。
5.3.实验拓扑
在文章第一至第三章中,如果要实现rsync同步,需要添加定时任务才可以完成,每次还要rsync对比一下,这样的效率低下且实时性差,有没有更好的方法呢,当然有!可以使用与inotify结合使用。实验的拓扑如下:
#3.inotify监控的文件事件类型
inotify可监控的文件系统事件类型,如下:
IN_ACCESS:文件被访问。
IN_MODIFY:文件被write。
IN_ATTRIB:文件属性被修改,如chmod、chown等。
IN_CLOSE_WRITE:可写文件被close。
IN_CLOSE_NOWRITE:不可写文件被close。
IN_OPEN:文件被open。
IN_MOVED_FROM:文件被移出被监控目录,如mv。
IN_MOVED_TO:文件被移入被监控目录,如mv、cp。
IN_CREATE:文件/文件夹被创建。
IN_DELETE:文件/文件夹被删除,如rm。
IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除自己。
IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动自己。
IN_UNMOUNT:宿主文件系统被umount。
IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。
IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。
注意:上面所说的文件也包括目录。
#4.inotify-tools是什么
inotify仅仅是一个API,需要通过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。这些命令行工具可用于通过命令行或脚本对某些文件系统的事件进行监控。
[if !supportLists]1) [endif]inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。
[if !supportLists]2) [endif]inotify不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,并且会产生一个umount事件。
[if !supportLists]3) [endif]inotify既可以监视文件,又可以监视目录。
[if !supportLists]4) [endif]inotify使用系统调用而非SIGIO信号来通知文件系统事件。
[if !supportLists]5) [endif]inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select和poll来监视文件系统的变化。
#5.inotify-tools与rsync集成
inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync客户端,而rsync服务器端正需要按照正常的配置进行即可。
注意:该集成的主要目的是把rsync客户端需要备份的文件实时推送到rsync服务器上。
5.3.实验拓扑
在文章第一至第三章中,如果要实现rsync同步,需要添加定时任务才可以完成,每次还要rsync对比一下,这样的效率低下且实时性差,有没有更好的方法呢,当然有!可以使用与inotify结合使用。实验的拓扑如下:
从上面拓扑知道,当要监控的目录发生变化的时候,就会触发innotify调用rsync同步。
5.4.inotify安装及配置(rsync客户端上操作)
#1.inotify安装
yum install -y inotify-tools
#查看安装目录,从目录看出这个工具很小,就2个命令其它的都没用!
[root@web inotify]# rpm -ql
inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
注意:inotify-tools主要是通过inotifywait和inotifywatch,这两个命令进行工作。特别是inotifywait命令,是我们生产环境中使用最多的命令。
inotifywait和inotifywatch命令及测试具体用法请看文档最后的“附录二”
#2.设置同步脚本
inotify是用来监视文件系统事件的机制,在Linux 2.6.13内核中引入。该机制可以用来监视文件和目录,当文件或目录发生变化时,内核会将文件或目录的变化发送给inotify文件描述符,在应用层只需调用read()就可以读取这些事件,非常的方便。也可以用使用select(),poll(),epoll()以及由信号驱动的I/O来监控inotify文件描述符,这里不做详解,需要了解的可以搜索相关文章。
我们现在需要编写一个脚本,主要是用inotifywai监控指定文件或目录,当文件的变化时产生相应的事件,我们再用read()去读到需要的事件,然后调用rsync命令实时同步,这样就做到了实时同步的目的,命令如下:
mkdir /disk1/sh
cd /disk1/sh
cat>>inotify.sh<
#!/bin/bash
# 需要同步的源路径
src=/disk1/tools/
#rsync服务端模块名
des=web76_tools
#
rsync验证的密码文件
rsync_passwd_file=/etc/rsync.password
# 目标服务器,我这里只有一台所以只用IP1
ip1=192.168.3.75
#ip2=192.168.3.74
#
rsync服务端定义的验证用户名
user=test
# 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听./
#才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
cd \${src}
# 把监控到有发生更改的"文件路径列表"循环
# inotifywait命令产生3个返回值,这3个返回值会做为参数传给read
/usr/bin/inotifywait-mrq --format '%Xe %w%f' -emodify,create,delete,attrib,close_write,move ./ | while read file
do
#把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_EVENT=\$(echo \$file | awk '{print \$1}')
#把inotify输出切割 把文件路径部分赋值给INO_FILE
INO_FILE=\$(echo \$file | awk '{print \$2}')
echo "-------------------------------\$(date)------------------------------------"
echo \$file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,
#即使是新建目录,要同步的也只是一个空目录,不会影响速度。
# 判断事件类型
if [[ \$INO_EVENT =~ 'CREATE' ]] || [[ \$INO_EVENT =~ 'MODIFY' ]] || [[ \$INO_EVENT=~ 'CLOSE_WRITE' ]] || [[ \$INO_EVENT =~ 'MOVED_TO' ]]
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
# INO_FILE变量代表路径哦 -c校验文件内容
rsync -avzcR --password-file=\${rsync_passwd_file} \$(dirname\${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des} &&
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
#仔细看 上面的rsync同步命令 源是用了\$(dirname
\${INO_FILE})变量 即每次只针对性的同步
#发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在
#可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面
#保证目录结构一致性
fi
#删除、移动出事件
if[[ \$INO_EVENT =~ 'DELETE' ]] || [[ \$INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete--password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync-avzR --delete --password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des}&&
#rsync-avzR --delete --password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
#看rsync命令 如果直接同步已删除的路径\${INO_FILE}会报no
such or directory错误 所以这里同步的源
#是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定
#文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
#这里有更好方法的同学,欢迎交流。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if[[ \$INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
#如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
if [ ! -d "\$INO_FILE"]
then
rsync -avzcR --password-file=\${rsync_passwd_file} \$(dirname\${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des} &&
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
fi
fi
done
EOF
网上很多的写法是全量同步的,所以造成同步很慢。代码如下:
#!/bin/bash
/usr/bin/inotifywait -mrq--format '%w%f'-e create,close_write,delete /backup |while read file
#把发生更改的文件列表都接收到file然后循环,但有什么鬼用呢?
#下面的命令都没有引用这个$file下面做的是全量rsync
do
cd /disk1/tools && rsync -az--delete /disk1/tools [email protected]::web76_tools --password-file=/etc/rsync.password
done
注意看上面的代码中rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件发生更改,就触发10次rsync全量同步(简直就是噩梦),那还不如直接写个死循环的rsync全量同步得了。
有很多人会说 日志输出那里明明只有差异文件的同步记录。其实这是rsync的功能,他本来就只会输出有差异需要同步的文件信息。不信你直接拿这句rsync来跑试试。
这种在需要同步的源目录文件量很大的情况下,简直是不堪重负。不仅耗CPU还耗时,根本不可以做到实时同步。
5.5.测试
在rsync客户端服务器打开两个ssh连接,第1个ssh连接上运行上面的脚本
#为了看到效果没有用加“&”变成后台运行
/disk1/sh/inotify.sh
在第2个ssh连接中尝试建立或自己文件
cd /disk1/tools/
echo '76 inotify
test'>inotify.txt
mkdir inotify
切换到第1个ssh连接查看结果如下:
[root@web ~]#/disk1/sh/inotify.sh
-------------------------------2017年 06月 29日星期四 14:02:59 CST---------------------------------
CREATE ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
./
inotify.txt
inotify/
sent 321 bytes received 35 bytes 33.90 bytes/sec
total size is 126 speedup is 0.35
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
MODIFY ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
sent 259 bytes received 10 bytes 538.00 bytes/sec
total size is 126 speedup is 0.47
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
CLOSE_WRITEXCLOSE ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
sent 259 bytes received 10 bytes 538.00 bytes/sec
total size is 126 speedup is 0.47
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
CREATEXISDIR ./inotify
CREATE or MODIFY or CLOSE_WRITE
or MOVED_TO
sending incremental file list
sent 259 bytes received 10 bytes 538.00 bytes/sec
total size is 126 speedup is 0.47
再去rsync master端(即备份服务器)上查看目录是否多inotify.txt文件和inotify目录,同理再执行删除操作,看一下变化。
rm -f inotify.txt
rm -rf inotify
#inotify后台执行命令,一定要加nohup,只加“&”是不行的
cd /disk1/sh/
nohup ./inotify.sh >>
inotify.log &
ps -ef |grep inotify
#关闭当前的ssh连接再输入下面命令查看inotify进程是否存在
ps -ef |grep inotify
#停止inotify
pkill inotify
pkill inotify
ps -ef |grep inotify
六、rsync+sersync文件实时同步
6.1.Sersync介绍
Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目前广泛使用的本地及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,所有其优势大大超过使用挂载文件系统或scp等方式进行镜像同步。
相比上面两个项目,Sersync项目的优点是:
1.使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(我稍后会提到),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
2.相比较上面两个项目,sersync配置起来很简单:在http://code.google.com/p/sersync/downloads/list 处下载源码(分为32版本,与64位版本),其中bin目录下已经有我编译好的2进制文件,配合bin目录下的xml文件直接使用即可。
3. 使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4. sersync自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步。
5. sersync自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。
]6. sersync自带socket与http协议扩展,可以满足有特殊需求的公司二次开发。
基本构架
6.2.rsync+sersync实验
实验图和rsync+inotify实验拓扑一样,只不过是把inotify改为sersync而已。
所以得把inotify进行停止掉。
#停止inotify(rsync客户端上操作,只有客户端上才安装inotify)
pkill inotify
pkill inotify
ps -ef |grep inotify
6.3.sersync安装及配置(rsync客户端上操作)
打开官方链接:http://sersync.sourceforge.net,点“Downloads”
https://code.google.com/archive/p/sersync/downloads,
另一个下载地址:http://download.csdn.net/detail/colin20111/8822175
#1.下载及安装
cd ~
#上传sersync2.5.4_64bit_binary_stable_final.tar.gz工具
mkdir /usr/local/sersync
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/sersync
cd /usr/local/sersync/GNU-Linux-x86/
#查看目录
#sersync也非常简单,不需要编译安装。
#目录中只有一个配置文件confxml.xml和一个可执行文件sersync2
[root@web GNU-Linux-x86]# ll
总用量 1772
-rwxr-xr-x 1 root root 2214 10月 26 2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 10月 26 2011 sersync2
#移动一下文件
mv * ../
rm -rf GNU-Linux-x86
#建立命令软链接
ln -s
/usr/local/sersync/sersync2 /usr/sbin/sersync2
ll /usr/sbin/sersync2
cd ..
rm -rf GNU-Linux-x86
#2.配置sersync
cp confxml.xml confxml.xml.orig
vim confxml.xml
#修改黑色粗体部分就行了
#也可能用命令方式直接修改,如下
#变成true"/>
sed -i '/modify/s/false/true/'
confxml.xml
grep modify confxml.xml
#变成/disk1/tools">
#搜索“localpath”,结果有多个,只修改第一个
sed -i '0,/localpath/s#/opt/tongbu#/disk1/tools#' confxml.xml
grep localpath confxml.xml
#变成192.168.3.75" name="web76_tools"/>
sed -i '/127.0.0.1/s/tongbu1/web76_tools/' confxml.xml
sed -i '/127.0.0.1/s/127.0.0.1/192.168.3.75/' confxml.xml
egrep '[ ]+
confxml.xml
# 变成true" users="test" passwordfile="/etc/rsync.password"/>
sed -i '/auth/s/false/true/'
confxml.xml
sed -i '/auth/s/root/test/' confxml.xml
sed -i '/auth/s/rsync.pas/rsync.password/' confxml.xml
grep auth confxml.xml
6.4.启动sersync
#查看sersync帮助命令
[root@web sersync]# sersync2 -h
set the system param
execute:echo
50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679
> /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
#启动sersync
[root@web sersync]# cd ~
[root@web ~]# sersync2 -o
/usr/local/sersync/confxml.xml -n 12 -d
set the system param
execute:echo50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679> /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -o config xml name: /usr/local/sersync/confxml.xml
option: -n thread num is: 12
option: -d run as adaemon
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run
behind the console
use rsync password-file :
user is test
passwordfile is /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max
connections=0 Manually
sersync working thread 14 = 1(primary thread) + 1(fail retry thread) +12(daemon sub threads)
Max threads numbers is: 26 =
14(Thread pool nums) + 12(Sub threads)
please according your cpu ,use -n param
to adjust the cpu rate
run the sersync:
watch path is:/disk1/tools
#从上面启动中看到,sersync比inotify配置简单,按照XML模块的提示进行修改就行了
#只有有些英文基础的都能看懂每个XML标签的大概意思。
[root@web ~]# ps -ef |grep sersync|grep -v 'grep'
root 32552 1 0 16:50 ? 00:00:00 sersync2 -o/usr/local/sersync/confxml.xml -n 12 -d
6.5.测试
这个测试和inotify测试一样,打开rsync客户端
cd /disk1/tools/
echo 'this is 76 sersync.txt'>sersync.txt
#查看rsync服务端(即backup服务器)是否有sersync.txt文件生成
[root@backup ~]# ll /disk1/backup/76/disk1_tools|grep 'sersync'
-rw-r--r-- 1 rsync rsync 23 6月 29 17:01 sersync.txt
同理:对文件进行删除操作,再查看一下rsync服务端是否也删除了,对目录也进行建立,删除操作
附录一、rsync配置文件rsyncd.conf常用参数说明
rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name
= value的参数定义。
每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/、 /home/web_user1/和/home/web_user2/,那么就需要在配置文件中定义三个模块,分别对应三个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释,以"\"结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false或者yes/no表示的布尔值。
参数说明:
附录二、inotify相关命令使用详解
1.inotifywait使用详解
inotify-tools命令中,我们使用最多的就是inotifywait命令。
inotifywait是一个监控等待事件,它主要用于监控文件或目录的变化,并且可以递归地监控整个目录树。
#1.inotifywait命令详解
有关inotifywait的使用方法,我们可以通过它的帮助信息查看。如下:
inotifywait
-h
通过上图,我们可以看到inotifywait参数很多。下面我们就介绍下一些经常使用的参数:
-m表示始终保持事件监听状态。
-r表示递归查询目录。
-q表示打印出监控事件。
--excludei 排除文件或目录时,不区分大小写
-t,–timeout超时时间
-e通过此参数可以指定要监控的事件。可监听的事件,如下:
access:访问,读取文件。
modify:修改,文件内容被修改。
attrib:属性,文件元数据被修改。
move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。
create:创建,生成新文件
open:打开,对文件进行打开操作。
close:关闭,对文件进行关闭操作。
delete:删除,文件被删除。
--timefmt是指定时间的输出格式,用于--format选项中的%T格式。
--format指定文件变化的详细信息输出格式。格式参数如下:
%w表示发生事件的目录
%f表示发生事件的文件
%e表示发生的事件
%T使用由--timefmt定义的时间格式
%Xe事件以“X”分隔
#2.inotifywait命令实例
上面我们讲解了inotifywait命令的参数,下面我们来实际使用下inotifywait命令。
我们要监测/disk1/tools目录下所有文件及目录的变化情况,命令如下:
inotifywait -mrq --timefmt '%y/%m/%d/%H:%M'--format '%T %w %f %e' -e modify,delete,create,attrib,move,open,close,access /disk1/tools
这条命令表示对/home目录下所有文件及目录的操作进行监控。
现在我们打开另一个ssh窗口对/disk1/toolsw目录进行操作,如下:
cd /disk1/tools/
echo "this is test inotify">t_inotify.txt
mkdir inotify
现在我们来切换到刚刚执行inotifywait命令的窗口,如下:
通过上图,我们可以很容易的看到inotifywait已经监控到我们前面创建的文件以及目录。
2.inotifywatch使用详解
除了inotifywatit命令之外,inotify-tools还有一个命令inotifywatch。
inotifywatch主要用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。
#1.inotifywatch命令详解
inotifywatch使用可以查看其帮助信息,如下:
inotifywatch -h
inotifywatch参数说明如下:
-h:输出帮助信息。
-v:输出详细信息。
@:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–-fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z:输出表格的行和列,即使元素为空。
–-exclude:正则匹配需要排除的文件,大小写敏感。
–-excludei:正则匹配需要排除的文件,忽略大小写。
-r:监视一个目录下的所有子目录。
-t:设置超时时间。
-e:只监听指定的事件。该事件与inotifywait监听的事件类型一样。
-a:以指定事件升序排列。
-d:以指定事件降序排列。
#2.inotifywatch命令实例
上面我们讲解了inotifywatch命令的参数,下面我们来实际使用下inotifywatch命令。
要求统计60秒内/disk1/tool目录下文件系统的事件,使用如下命令:
inotifywatch -v -e
modify,delete,create,attrib,move,open,close,access -e modify -t 35 -r
/disk1/tools
现在我们在另一个ssh窗口对/disk1/toolsw目录进行操作,如下:
cd /disk1/tools/
rm -f t_inotify.txt
rm -rf mkdir inotify
现在我们来切换到刚刚执行inotifywatch命令的窗口,静等35秒会自动结束,结果如下:
通过上图,我们可以很容易的看到inotifywatch已经监控到我们前面删除的文件和重命名的目录文件事件数量。