热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:inotify和rsync实现数据实时同步

数据的实时同步?实现实时同步?要利用监控服务(inotify),监控同步数据服务器目录中信息的变化?发现目录中数据产生变化,就利用rsync服务推送到备份服务器上?实现实时同步的方法?inotify+

数据的实时同步

?实现实时同步

?要利用监控服务(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 指定时间输出格式
?--format 指定的输出格式;即实际监控输出内容
?-e 指定监听指定的事件,如果省略,表示所有事件都进行监听
?--exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
?--excludei 和exclude相似,不区分大小写
?-o, --outfile 打印事件到文件中,相当于标准正确输出
?-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目录下的文件
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

客户端日志文件变化情况

技术图片

 服务端文件跟踪结果

技术图片

 

 

 

 

 

 

 

  

 

 

 

 


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 在Windows10系统上使用VMware创建CentOS虚拟机的详细步骤教程
    本文详细介绍了在Windows10系统上使用VMware创建CentOS虚拟机的步骤,包括准备条件、安装VMware、下载CentOS ISO文件、创建虚拟机并进行自定义配置、设置虚拟机的ISO与网络、进行安装和配置等。通过本文的指导,读者可以轻松地创建自己的CentOS虚拟机并进行相应的配置和操作。 ... [详细]
author-avatar
z苏苏575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有