实时数据同步inotify+rsync
inotify
inotify是一个实时监控服务,他能实时监控服务器中的目录的变化,发现目录中变化后,在配合rsync服务推送到备份服务器上
inotify要求内核要在2.6.13或之上,通过notify,可以监控文件系统中如增删查改等各种事件
列出下面文件说明服务器支持notify
[root@node2 ma]#ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jul 31 11:00 max_queued_events -rw-r--r-- 1 root root 0 Jul 31 11:00 max_user_instances -rw-r--r-- 1 root root 0 Jul 31 11:00 max_user_watches
根据工作需要,可调整
#:max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384
#:max_user_watches:可以监视的文件数量(单进程),默认值:8192
#:max_user_instances:每个用户创建inotify实例最大值,默认值:128
inotify依赖inotify-tools(在epel源)
[root@node4 ~]#yum install inotify-tools -y
监控/data/文件
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib /data/www #: -m 始终保持事件监听 -r 递归监控数据目录变化 -q 输出少量事件信息 --timefmt 定义时间格式 %Y 年份信息 %m 月份信息 %d 每月第几天 %H 小时 %M 分钟 --format 定义格式 %T 输出时间格式中定义的时间格式信息 %w 时间出现时,监控文件或目录的名称信息 %f 时间出现时,将显示监控目录下触发事件的文件或目录信息,否则为空 -e 指定事件类型 create 文件或目录创建 delete 文件或目录被删除 modify 文件或目录内容被写入 attrib 文件或目录属性改变 moved_to 文件或目录被移动到监控的目录中 moved_from 文件或目录从监控的目录中被移动 move 文件或目录不管移动到或是移出监控目录都触发事件 delete_self 文件或目录被删除,目录本身被删除 unmount 取消挂载
rsync
先安装包
[root@node4 www]#yum install rsync -y
编辑rsync服务器的配置文件
[root@node2 ma]#vim /etc/rsyncd.confuid = root uid = root gid = root #: 定义rsync服务器以root用户运行 use chroot = no #:不允许切根 max connections = 0 #:最大连接数,0表示不限制 ignore errors #:如果有错误,忽略错误 exclude = lost+found/ #:针对此目录不检查 log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock reverse lookup = no #:关闭反向解析 hosts allow = 192.168.8.0/24 #:允许那些主机连接 [backup] # : 为一下代码块起的名字 path = /backup/ #:将数据备份到本机哪个目录 comment = backup #:描述 read only = no #:可写 auth users = rsyncuser #:远程用户 secrets file = /etc/rsync.pass #:远程用户放置密码的文件
在rsync服务器端生成验证文件并修改权限
[root@node2 ma]#echo "rsyncuser:magedu" > /etc/rsync.pass #: 格式是 用户名:密码
[root@node2 ma]#chmod 600 /etc/rsync.pass
在rsync服务器端准备备份文件并重启服务
[root@node2 ma]#mkdir /backup [root@node2 ma]#systemctl restart rsyncd
在客户端配置密码文件(同步的时候就不用输入密码了)并修改权限
[root@node4 ~]#echo "magedu" > /etc/rsync.pass [root@node4 ~]#chmod 600 /etc/rsync.pass
然后测试
[root@node4 ~]#rsync -avz --password-file=/etc/rsync.pass /data/www rsyncuser@192.168.37.22::backup #:模板 rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服务器IP::backup
现在可以同步了
然后我们开始使用脚本让它实时同步
在客户端创建脚本
[root@node4 www]#vim /data/inotify_rsync.sh #!/bin/bash # #******************************************************************** #Author: Ma Xue Bin #QQ: 316428921 #Date: 2019-07-31 #!/bin/bash SRC='/data/www/' DEST='rsyncuser@192.168.37.22::backup' inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do FILEPATH=${DIR}${FILE} rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log done
加执行权限,运行
[root@node4 ~]#chmod +x /data/inotify_rsync.sh [root@node4 ~]#. /data/inotify_rsync.sh