数据的实时同步

实现实时同步

要利用监控服务(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 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 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

客户端日志文件变化情况

服务端文件跟踪结果

 

 

 

 

  

 

 

 

 

最新文章

  1. Web.xml详解(转)
  2. CWR Mobile简介
  3. struts 国际化
  4. PHP购物车类
  5. AC日记——整理药名 openjudge 1.7 15
  6. centos中crontab(计时器)用法详解
  7. Selenium&amp;EmguCV实现爬虫图片识别
  8. Sqli-labs less 60
  9. 在mac上搭建python环境
  10. iOS App 百思不得姐
  11. hdu 1847 Good Luck in CET-4 Everybody! 博弈论
  12. Hyperic Agent 安装配置报 - No token file found, waiting for Agent to initialize
  13. JS生成二维码,支持中文字符
  14. 乱译文档--Musca介绍
  15. iptables 实现centos内网机器访问外网
  16. sql优化-提防错误关联
  17. Hibernate 中 简便proxool连接池配置
  18. 深入学习:Windows下Git新手教程(上)
  19. 2018-2019 2 20175230《Java程序设计》第九周学习总结
  20. 从头开始学gradle【Gradle 构建基础】

热门文章

  1. 字符串匹配算法---BF
  2. Spring Maven工程引入css,js
  3. super的实例及实现原理
  4. codevs1227:方格取数2
  5. 基于AbstractRoutingDataSource实现动态切换数据源
  6. Linux/ubuntu 心得
  7. 剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5
  8. os路径
  9. python中浅拷贝和深拷贝分析
  10. Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出)