首页 > 代码库 > inotify+rsync实现实时同步

inotify+rsync实现实时同步

引言:rsync实现数据备份,inotify监控文件系统提供通知功能,二者结合能够实现服务器之间文件的实时同步。

 

rsync

特性:

可以镜像保存整个目录树和文件系统;

增量同步数据,文件传输效率高;

可以保持原有文件的权限、时间等属性;

加密传输数据,保证了数据的安全性;

支持断点续传;

可以使用rcp、ssh等方式传输文件,也可以通过socket连接传输文件;

支持匿名传输;

 

rsync4种模式

       本地shell

       远程shell

       查询(列表)模式

       服务器模式

 

本地shell模式:

       rsync -av orgi/file1 dest/

 

-a archive,归档模式,递归并保持文件属性

-v verbose

注意斜杠  目录名带斜杠orgi/ 表示复制目录下的所有文件,不带斜杠,复制目录本身

 

远程shell模式

       rsync orgi weblogic@192.168.2.17:/home/weblogic

       默认情况下使用ssh作为传输机制

 

列表模式:

       rsync -a weblogic@192.168.2.17:/home/weblogic

 

服务器模式:

       基于C/S

A:服务器端,需要备份的文件

B:客户端,备份服务器

 

A配置:/etc/rsyncd.conf

uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

[ixdba]
path = /home/weblogic/orgi
comment = ixdba file
igonre errors
read only = no
write only = no
hosts allow = *
hosts deny = 
list = false
uid = root
gid = root
auth users = backup
secrets file = /etc/server.pass
/etc/server.pass
backup:ixdba123

B配置:

       备份机不做任何配置,只需执行rsync同步操作即可;

rsync –vzrogpt --delete --progress --exclude “*access*”--exclude “debug*”backup@192.168.2.17::ixdba  ixdba.net --password-file=/etc/server.pass

/etc/server.pass文件内容:

ixdba123

chmod 600 /etc/server.pass

 

--delete 指以服务器端A为基准,保持客户端和服务器端目录完全一直

 

放入定时任务即可实现文件定时同步

 

inotify+rsync实现数据实时备份:

 

查看内核是否支持inotify

ll /proc/sys/fs/inotify/

max_queued_events 表示调用inotify_init时分配inotify 实例中可排队的event数的最大值

max_user_instances 每一个real user可创建inotify实例上限

max_user_watches 每个inotify实例可监控最大目录数量

 

编译安装inotify-tools,https://ncu.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

安装后的两个命令行工具:

inotifywait

inotifywatch

 

inotify实时同步脚本:

说明:脚本按文件变更所在目录进行同步,对于百万级的文件数目也能实现很好的实时同步,如果全量同步,rsync进行文件校验时就会花费大量的时长和服务器资源,综合考虑,按目录进行同步数据较为理想。

#!/bin/bash
# 需要同步的源路径
src=http://www.mamicode.com/home/weblogic/orgi/"文件路径列表"循环
/usr/local/bin/inotifywait -mrq --format  ‘%Xe %w%f‘ -e modify,create,delete,attrib,close_write,move ${src} | 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 -avzc --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 -avz --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 -avzc --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

 

inotifywait 参数说明

参数名称

参数说明

-m,–monitor

始终保持事件监听状态

-r,–recursive

递归查询目录

-q,–quiet

只打印监控事件的信息

–excludei

排除文件或目录时,不区分大小写

-t,–timeout

超时时间

–timefmt

指定时间输出格式

–format

指定时间输出格式

-e,–event

后面指定删、增、改等事件

 

inotifywait events事件说明

事件名称

事件说明

access

读取文件或目录内容

modify

修改文件或目录内容

attrib

文件或目录的属性改变

close_write

修改真实文件内容

close_nowrite

 

close

 

open

文件或目录被打开

moved_to

文件或目录移动到

moved_from

文件或目录从移动

move

移动文件或目录移动到监视目录

create

在监视目录下创建文件或目录

delete

删除监视目录下的文件或目录

delete_self

 

unmount

卸载文件系统

inotify+rsync实现实时同步