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 时间格式,参考 man 3 strftime

%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目录下的文件已经同步过来

inotify和rsync实现数据实时同步

[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

inotify和rsync实现数据实时同步

(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

客户端日志文件变化情况

inotify和rsync实现数据实时同步

服务端文件跟踪结果

inotify和rsync实现数据实时同步

inotify和rsync实现数据实时同步

上一篇:ubuntu root账号下ll 提示ll:未找到命令


下一篇:shell脚本编程练习