首页 > 代码库 > 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实现实时同步