数据的实时同步
要实现数据的实时同步需要利用监控服务inotify,监控同步数据服务器目录中信息的变化,当发现目录中的数据产生变化,就利用rsync服务推送到备份服务器上。
inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的 轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文 件系统中添加、删除、修改、移动等各种事件
实现inotify软件:inotify-tools,sersync,lrsync
查看服务器内核是否支持inotify
查看/proc/sys/fs/inotify目录下是否有以下文件,若是有则支持
[root@localhost ~]# ll /proc/sys/fs/inotify/
total 0 #查看
-rw-r--r-- 1 root root 0 May 19 08:47 max_queued_events
-rw-r--r-- 1 root root 0 May 19 08:47 max_user_instances
-rw-r--r-- 1 root root 0 May 19 08:47 max_user_watches
参数作用
max_queued_events:inotify事件队列最大长度,如值太小会出现Event Queue Overflow 错误,默认值:16384
max_user_watches:可以监视的文件数量(单进程),默认值:8192
max_user_instances:每个用户创建inotify实例最大值,默认值:128
参数修改
临时有效
[root@localhost ~]# echo "81920" > /proc/sys/fs/inotify/max_user_watches
永久生效
[root@localhost ~]# vim /etc/sysctl.conf
fs.inotify.max_user_watches = 81920
[root@localhost ~]# sysctl -p
fs.inotify.max_user_watches = 81920
inotify-tools
inotify-tools是基于epel源的,需要开启epel源
[root@localhost ~]# yum install inotify-tools -y
inotify-tools的主要文件
[root@localhost ~]# rpm -ql inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotify命令用法
语法:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
options | 说明 |
---|---|
-m | 始终保持事件监听 |
-d | 以守护方式执行 |
-r | 递归监控目录数据信息变化 |
-q | 输出少量事件信息 |
--exclude | 指定排除文件或目录,是哪个扩展的正则表达式 |
--excludei | 和--exclude相同,不区分大小写 |
-o FILE | 输出事件到文件中,标准正确输出 |
-s | 发送错误到syslog中 |
--timefmt OPT | 指定时间输出的格式 |
--format OPT | 指定的输出格式;即实际监控输出内容 |
-e | 指定监听的时间,如省略表示监听所有 |
inotifywait使用方法
1.监控目录,不带任何参数默认工作在前台
[root@localhost ~]# inotifywait /data
Setting up watches.
Watches established.
/data/ OPEN,ISDIR #不带任何参数,被访问一次就退出
2.持续递归监控目录
[root@localhost ~]# inotifywait -mrq /data
/data/ OPEN,ISDIR #访问目录
/data/ CLOSE_NOWRITE,CLOSE,ISDIR
/data/ CREATE aaa #创建文件
/data/ OPEN aaa
/data/ ATTRIB aaa
/data/ CLOSE_WRITE,CLOSE aaa
3.以守护进程执行
[root@localhost ~]# inotifywait -o /root/inotify.log -rq /data
[root@localhost ~]# tail /root/inotify.log
/data/ CREATE bbb #创建文件
4.定义格式输出
定义格式输出需要定义时间格式和输出格式两个选项 --timefmt OPT 时间格式 |
参数 | 说明 |
---|---|---|
%Y | 年份信息,包含世纪信息 | |
%y | 年份信息,不包括世纪信息 | |
%m | 显示月份,范围 01-12 | |
%d | 每月的第几天,范围是 01-31 | |
%H | 小时信息,使用 24小时制,范围 00-23 | |
%M | 分钟,范围 00-59 |
--timefmt "%Y-%m-%d %H:%M"
--format OPT 输出格式 |
FMT | 格式定义 |
---|---|---|
%T | 输出时间格式中定义的时间格式信息,通过--timefmt option语法格式指定时间信息 | |
%w | 事件出现时,监控文件或目录的名称信息 | |
%f | 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空 | |
%e | 显示发生的事件信息,不同的事件默认用逗号分隔 | |
%Xe | 显示发生的事件信息,不同的事件指定用X进行分隔 |
--format "%T %w%f event: %;e"
--format '%T %w %f'
指定输出的格式
[root@localhost ~]# inotifywait -o /root/inotify.log -drq --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %;e" /data
[root@localhost ~]# cat /root/inotify.log
2019-05-19 09:43 /data/abc event: CREATE
2019-05-19 09:43 /data/abc event: OPEN
2019-05-19 09:43 /data/abc event: ATTRIB
2019-05-19 09:43 /data/abc event: CLOSE_WRITE;CLOSE
2019-05-19 09:43 /data/ event: OPEN;ISDIR
2019-05-19 09:43 /data/ event: CLOSE_NOWRITE;CLOSE;ISDIR
2019-05-19 09:44 /data/ event: OPEN;ISDIR
2019-05-19 09:44 /data/ event: CLOSE_NOWRITE;CLOSE;ISDIR
2019-05-19 09:44 /data/aaa event: DELETE
5.监听特定的事件
使用-e选项可以指定监听的特定事件 |
事件类型 | 说明 |
---|---|---|
create | 文件或目录创建 | |
delete | 文件或目录被删除 | |
modify | 文件或目录内容被写入 | |
attrib | 文件或目录属性改变 | |
close_write | 文件或目录关闭,在写入模式打开之后关闭的 | |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 | |
close | 文件或目录关闭,不管读或是写模式 | |
open | 文件或目录被打开 | |
moved_to | 文件或目录被移动到监控的目录中 | |
moved_from | 文件或目录从监控的目录中被移动 | |
move | 文件或目录不管移动到或是移出监控目录都触发事件 | |
access | 文件或目录内容被读取 | |
delete_self | 文件或目录被删除,目录本身被删除 | |
unmount | 取消挂载 |
监控新建,删除,改属性,改名字
[root@localhost ~]# inotifywait -mrq --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %;e" /data -e CREATE,MOVED_TO,DELETE,ATTRIB
2019-05-19 09:52 /data/abc event: DELETE
2019-05-19 09:52 /data/bbb event: DELETE
2019-05-19 09:52 /data/123 event: CREATE
2019-05-19 09:52 /data/123 event: ATTRIB
inotify和rsync实现实时同步
要实现inotify和rsync实时同步,需要将用来同步的服务器设置为rsync服务器 准备主机2台,客户端,rsync服务器,客户端监控本机/data目录下的数据变化,服务器端用来同步/data数据 |
主机 | IP |
---|---|---|
rsync | 192.168.73.110 | |
client | 192.168.73.111 |
rsync服务器配置
1.安装rsync
[root@rsync ~]# yum install rsync -y
2.创建一个用来同步数据的目录
[root@rsync ~]# mkdir /data/backup
3.修改rsync配置文件
[root@rsync ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
reverse lookup = no
host allow = 192.168.73.111
[backup]
path = /data/backup/
comment = backup
readonly = no
auth users = rsyncuser
secrets file = /etc/rsync.pass
4.生成验证用的账户密码,修改为安全权限
[root@rsync ~]# echo "rsyncuser:111111" > /etc/rsync.pass
[root@rsync ~]# chmod 600 /etc/rsync.pass
5.启动服务(rsyncd端口号873)
[root@rsync ~]# systemctl start rsyncd
client端配置
测试rsync一次性任务
1.安装rsync
[root@client ~]# yum install rsync -y
2.配置密码文件,修改为安全权限
[root@client ~]# echo "111111" > /etc/rsync.pass
[root@client ~]# chmod 600 /etc/rsync.pass
3.执行rsync命令
#把本机的/data目录下的数据利用rsync远程同步到73.110的backup指定的文件夹中去
[root@client ~]# rsync -avz --password-file=/etc/rsync.pass /data/ [email protected]::backup
sending incremental file list
./
nfs1/
nfs1/123
nfs1/aaa
nfs1/wang
nfs2/
nfs2/nfs2.txt
wanghome/
wanghome/.bash_history
wanghome/.bash_logout
wanghome/.bash_profile
wanghome/.bashrc
wanghome/.viminfo
wanghome/test
sent 1,587 bytes received 225 bytes 3,624.00 bytes/sec
total size is 1,215 speedup is 0.67
同步成功
让inotify配合sync实时同步
1.在客户端创建脚本
[root@client ~]# vim rsync.sh
#!/bin/bash
SRC='/data/'
DEST='[email protected]::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
2.运行脚本
[root@client ~]# bash rsync.sh