inotify和rsync实现数据实时同步
inotify和rsync实现数据实时同步
数据的实时同步
实现实时同步
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
实现实时同步的方法
inotify+rsync方式实现数据同步sersync :金山公司周洋在 inotify 软件基础上进行开发的,功能更加强大
inotify
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如``cron``等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
实现inotify软件
inotify+rsync使用方式
inotify 对同步数据目录信息的监控
rsync 完成对数据的同步
利用脚本进行结合
查看服务器内核是否支持inotify
Linux下支持inotify的内核最小为2.6.13
ll /proc/sys/fs/inotify #列出下面的文件,说明服务器内核支持inotify
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances
-rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches
inotify内核参数
参数说明:参看man 7 inotify
max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384
max_user_watches: 可以监视的文件数量(单进程),默认值:8192
max_user_instances: 每个用户创建inotify实例最大值,默认值:128
inotify参考文档
https://github.com/rvoicilas/inotify-tools/wiki
安装:基于epel源
yum install inotify-tools
Inotify-tools
包主要文件:
inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait
命令常见选项
-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化
-q, --quiet 输出少量事件信息
--timefmt <fmt> 指定时间输出格式
--format <fmt> 指定的输出格式;即实际监控输出内容
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听
--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> 和exclude相似,不区分大小写
-o, --outfile <file>打印事件到文件中,相当于标准正确输出
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
--timefmt
%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59
示例:
--timefmt "%Y-%m-%d %H:%M"
--format
%T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe显示发生的事件信息,不同的事件指定用X进行分隔
示例:
--format "%T %w%f event: %;e"
--format '%T %w %f'
-e 选项指定的事件类型
create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载
示例: -e create,delete,moved_to,close_write
示例:
监控一次性事件
inotifywait /data
持续监控
inotifywait -mrq /data
持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e"
持续后台监控特定事件
inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib
验证后台监控特定事件
(1)安装inotify-tools包
[root@centos7~]#yum install inotify-tools -y
[root@centos7~]#inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib 监控data目录下的文件
(2)新开一个窗口在data目录下进行操作
[root@centos7data]#touch f1
[root@centos7data]#chown wang f2
(3)可以看到监控data目录下的文件在实时监控此时对data目录的操作记录
[root@centos7~]#inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib 监控data目录下的文件
2021-09-12 22:30 /data/f1 event: ATTRIB
2021-09-12 22:30 /data/f1 event: CLOSE_WRITE;CLOSE
2021-09-12 22:30 /data/f2 event: ATTRIB
配置 rsync 服务器端的配置文件
(1)修改rsync配置文件内容(rsync会同步增量的文件,不会继续复制相同文件的内容)
[root@centos7data]#vim /etc/rsyncd.conf
uid = root #以root身份运行
gid = 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 #pid文件路径
lock file = /var/run/rsyncd.lock #锁文件路径
reverse lookup = no #不做解析反向解析
hosts allow = 192.168.34.0/24 希望192.168.34.0网段访问
[backup]
path = /backup/ 希望将backup文件夹进行同步
comment = backup 同步的文件夹名称一致
read only = no 可以写文件
auth users = rsyncuser 指定一个用户账号
secrets file = /etc/rsync.pass 存放口令位置
(2)新建一个文件,将用户账号和密码存放到指定的文件中
[root@centos7data]#echo "rsyncuser:centos" > /etc/rsync.pass
[root@centos7data]#cat /etc/rsync.pass
rsyncuser:centos
[root@centos7data]#chmod 600 /etc/rsync.pass 修改权限,避免其他人看见此文件的用户名密码
(3)服务器端准备目录
[root@centos7~]#mkdir /backup
(4)服务器端启动rsync服务,可加入/etc/rc.d/rc.local实现开机启动,监听873端口
[root@centos7data]#rsync --daemon
(5)在服务器端对backup目录进行监控,1秒监控一次目录
[root@centos7~]#watch -n1 ls -l /backup
(6)客户端配置密码文件
[root@centos7~]#echo "centos" > /etc/rsync.pass
[root@centos7~]#chmod 600 /etc/rsync.pass 为了安全,将文件权限修改为600
(7)客户端测试同步数据
[root@centos7data]#rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.34.100::backup
sending incremental file list
./
f1
xx
sent 156 bytes received 57 bytes 426.00 bytes/sec
total size is 0 speedup is 0.00
服务器端此时监控到backup目录下的文件已经同步过来
[root@centos7~]#ls /backup 此时服务器端的backup目录下已经将客户端data目录下的文件复制过来
f1 xx
在客户端创建inotify_rsync.sh脚本,实现同步效果
vim inotify_rsync.sh
#!/bin/bash
SRC='/data/'
DEST='rsyncuser@192.168.34.100::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e attrib,create,delete,moved_to,close_write ${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
(2)在客户端执行脚本,并跟踪指定的日志文件
[root@centos7~]#bash inotify_rsync.sh
(3)在服务端跟踪此时backup目录内容
[root@centos7~]#watch -n1 ls -l /backup
(4)监控客户端此时新生成的日志文件
[root@centos7~]#tail -f /var/log/changelist.log
At 23:50 on 2021-09-12, file /data/f33 was backuped up via rsync
At 23:50 on 2021-09-12, file /data/f33 was backuped up via rsync
At 23:50 on 2021-09-12, file /data/f33 was backuped up via rsync
At 23:51 on 2021-09-12, file /data/f2 was backuped up via rsync
At 23:51 on 2021-09-12, file /data/f2 was backuped up via rsync
At 23:51 on 2021-09-12, file /data/f2 was backuped up via rsync
At 23:51 on 2021-09-12, file /data/f5 was backuped up via rsync
At 23:51 on 2021-09-12, file /data/f5 was backuped up via rsync
(5)验证效果,此时在客户端data目录下新建文件
[root@centos7~]#cd /data
[root@centos7data]#ls
f1 f2 f3
[root@centos7data]#touch f33
[root@centos7data]#toch f2
bash: toch: command not found...
[root@centos7data]#touch f2
[root@centos7data]#cp /etc/fstab f2
cp: overwrite ‘f2’? y
[root@centos7data]#cp /etc/fstab f5
客户端日志文件变化情况
服务端文件跟踪结果