数据的实时同步
实现实时同步
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
实现实时同步的方法
inotify+rsync 方式实现数据同步 sersync :金山公司周洋在 inotify 软件基础上进行开发的,功能更加强大
inotify:
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
实现inotify软件:
inotify-tools,sersync,lrsyncd
inotify和rsync实现实时同步
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 <fmt>时间格式,参考 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 <fmt> 格式定义
%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目录下的文件 2019-12-04 22:30 /data/f1 event: ATTRIB 2019-12-04 22:30 /data/f1 event: CLOSE_WRITE;CLOSE 2019-12-04 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
(7)客户端配置密码文件
[root@centos7~]#echo "centos" > /etc/rsync.pass [root@centos7~]#chmod 600 /etc/rsync.pass 为了安全,将文件权限修改为600
(8)客户端测试同步数据
[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 FIL E;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/l og/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 2019-12-04, file /data/f33 was backuped up via rsync At 23:50 on 2019-12-04, file /data/f33 was backuped up via rsync At 23:50 on 2019-12-04, file /data/f33 was backuped up via rsync At 23:51 on 2019-12-04, file /data/f2 was backuped up via rsync At 23:51 on 2019-12-04, file /data/f2 was backuped up via rsync At 23:51 on 2019-12-04, file /data/f2 was backuped up via rsync At 23:51 on 2019-12-04, file /data/f5 was backuped up via rsync At 23:51 on 2019-12-04, 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
客户端日志文件变化情况
服务端文件跟踪结果