Linux利用inotify和rsync服务实现数据实时同步的原理解析

文件定时同步的实现:

利用rsync结合cron计划任务实现:

rsync -av –delete /data/ 10.0.0.12:/back

-a:保留文件属性

-v:显示过程

-delete:如果源文件没有的,目标文件里面有,就把目标文件里面的删除掉

文件实时同步的实现:

前提:

  文件发生发生变化的时候就触发同步,但是触发同步需要一个依赖文件状态变化的功能。

inotify

  inotify是系统内核的一个监控服务,属于操作系统内核的一个特有机制,用于监控文件的信息变化。

查看内核是否支持inotify;

[root@LAP1 data]# ls -l /proc/sys/fs/inotify

ls: cannot access ‘ ‘: No such file or directory

/proc/sys/fs/inotify:

total 0

-rw-r–r– 1 root root 0 Oct 24 23:39 max_queued_events

-rw-r–r– 1 root root 0 Oct 24 23:39 max_user_instances

-rw-r–r– 1 root root 0 Oct 24 23:39 max_user_watches

inotify内核参数:

max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679

max_user_instances:每个用户创建inotify实例最大值,默认值:128

max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大

说明:
  proc里面的参数可以通过sysctl工具来进行更改。

inotify-tools包主要工具:

  • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控(主要使用的就是这个工具)
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令:

inotifywait [ options ] file1 [ file2 ] [ file3 ] [ … ]

选项:

-m, –monitor 始终保持事件监听

-d, –daemon 以守护进程方式执行,和-m相似,配合-o使用

-r, –recursive 递归监控目录数据信息变化

-q, –quiet 输出少量事件信息

–exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现

–excludei <pattern> 和exclude相似,不区分大小写

-o, –outfile <file> 打印事件存到文件中,注意:使用绝对路径

-s, –syslogOutput 发送错误到syslog相当于标准错误输出

–timefmt <fmt> 指定时间输出格式

–format <fmt> 定义输出格式;即实际监控输出内容

-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

例如:

# 10.0.0.11

[root@LAP1 data]# cat file1

[root@LAP1 data]# echo hello > file1

[root@LAP1 data]# ll file1

-rw-r–r– 1 root root 6 Oct 24 23:50 file1

[root@LAP1 data]# chmod 666

# 10.0.0.11
[root@LAP1 data]# inotifywait -m file1
Setting up watches.
Watches established.
file1 OPEN
file1 CLOSE_NOWRITE,CLOSE
file1 MODIFY
file1 OPEN
file1 MODIFY
file1 CLOSE_WRITE,CLOSE
file1 ATTRIB

inotifywait -e 选项指定的事件类型

create #文件或目录创建

delete #文件或目录被删除

modify #文件或目录内容被写入

attrib #文件或目录属性改变

close_write #文件或目录关闭,在写入模式打开之后关闭的

close_nowrite #文件或目录关闭,在只读模式打开之后关闭的

close #文件或目录关闭,不管读或是写模式

open #文件或目录被打开

lsdir #浏览目录内容

moved_to #文件或目录被移动到监控的目录中

moved_from #文件或目录从监控的目录中被移动

move #文件或目录不管移动到或是移出监控目录都触发事件

access #文件或目录内容被读取

delete_self #文件或目录被删除,目录本身被删除

unmount #取消挂载

inotifywait 的–timefmt 时间格式

%Y #年份信息,包含世纪信息

%y #年份信息,不包括世纪信息

%m #显示月份,范围 01-12

%d #每月的第几天,范围是 01-31

%H #小时信息,使用 24小时制,范围 00-23

%M #分钟,范围 00-59

%S #秒,范例 0-60

inotifywait 的 –format 格式定义

%T #输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息

%w #事件出现时,监控的文件或目录的名称信息,相当于dirname

%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename

%e #显示发生的事件信息,不同的事件默认用逗号分隔

%Xe #显示发生的事件信息,不同的事件指定用X进行分隔

例如:监控/data/目录的变化

rsync工具

rsync有三种工作方式:

  • 本地模式:本地文件系统上实现同步。命令行语法格式为上述”Local”段的格式
  • 基于传统的ssh协议,本地主机使用远程shell和远程主机通信
  • 作为一个独立服务,本地主机通过网络套接字连接远程主机上的rsync daemon

区别:

  前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

本地模式:

rsync [OPTION…] SRC… [DEST]

例如:

[root@LAP1 data]# rsync file1 file111

[root@LAP1 data]# ls
file1 file11 file111 file2

基于传统的ssh协议使用格式:

Pull:

rsync [OPTION…] [USER@]HOST:SRC… [DEST]

Push:
rsync [OPTION…] SRC… [USER@]HOST:DEST

例如:

rsync -av –delete /data/ 10.0.0.12:/back

#不写用户名默认使用的就是当前主机使用的用户

作为一个独立服务:

Pull:

rsync [OPTION…] [USER@]HOST::SRC… [DEST]

rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST] #协议的形式访问,效果等同于上面

Push:
rsync [OPTION…] SRC… [USER@]HOST::DEST
rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

rsync常用选项:

rsync的软件包:

官方网站: http://rsync.samba.org/

软件包:rsync,rsync-daemon(CentOS 8)

服务文件:/usr/lib/systemd/system/rsyncd.service

配置文件:/etc/rsyncd.conf

端口:873/tcp

两种方式实现rsync服务器

  rsync即可以作为服务器端,也可以作为客户端程序。

方式一:通过rsync守护进程的方式实现rsync服务

#在备份服务器启动 rsync 进程

[root@bakup_server ~]# rsync –daemon #–daemon选项表示启动为守护进程

Failed to parse config file: /etc/rsyncd.conf #必须要有这个配置文件才能启动成功

[root@bakup_server ~]# touch /etc/rsyncd.conf #需要创建这个配置文件才能正常启动

[root@bakup_server ~]# rsync –daemon #启动rsync守护进程

[root@bakup_server ~]# ss -ntl #守护进程启动后会监听873端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
#设置rsync服务器的共享信息
[root@bakup_server ~]# cat /etc/rsyncd.conf #等号之间可以有空格
[backup] #定义存放数据共享的名字
path = /bakup #真实的路径,存放共享文件的路径 (利用rsync将这个目录共享出去,共享出去的名字叫做bakup)
read only = no #指定可读写,默认只读

[root@bakup_server ~]# rsync –daemon #更改问配置文件以后需要重新开启守护进程才会生效

[root@bakup_server ~]# setfacl -m u:nobody:rwx /bakup/ #指定目录给nobody权限,默认用户以nobody访问此目录

使用客户端连接rsync备份服务器:
#格式 rsync rsync://host 或者 rsync host::

客户端查看服务器的情况:
[root@data_server ~]# rsync rsync://10.0.0.12 #以协议的形式访问
backup #共享出来的名字

[root@data_server ~]# rsync 10.0.0.12:: #以服务的形式访问
backup

#实现客户端将文件拷贝到rsync共享的目录中
注意:传输的时候不管以谁的身份,都会映射为nobody,所以不用写用户名都行
[root@data_server ~]# rsync /root/anaconda-ks.cfg [email protected]::backup

[root@bakup_server bakup]# ll
total 8
-rw——- 1 nobody nobody 1526 Oct 24 17:48 anaconda-ks.cfg
-rw-r–r– 1 nobody nobody 658 Oct 24 17:49 fstab

以独立服务方式运行rsync并实现验证功能

  rsync-daemon:安装这个软件包以后会提供一个service服务,它会监听自己的独立端口

[root@bakup_server ~]# yum install rsync-daemon

Installed:

rsync-daemon-3.1.3-9.el8.noarch

[root@bakup_server ~]# systemctl enable rsyncd.service
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.

说明:

  rsync默认传输文件的时候不需要验证

启用rsync的验证功能的方法:

[root@backup-centos8 ~]#dnf -y install rsync-daemon

#安装服务的时候自动创建rsync服务器的配置文件
[root@centos8 ~]#vi /etc/rsyncd.conf
uid = root #远程用户映射到本机的用户,默认为nobody 指定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody
gid = root #默认为nobody
#port = 874 #可指定非标准端口,默认873/tcp
#use chroot = no
max connections = 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 # 拒绝反向解析,不把ip解析为主机名
#hosts allow = 10.0.0.0/24 # 允许连接的主机
[backup] #每个模块名对应一个不同的path目录,如果同名后面模块生效 共享名
path = /data/backup/ #共享的真实路径
comment = backup dir #描述信息
read only = no #默认是yes,即只读
auth users = rsyncuser #默认anonymous可以访问rsync服务器 用于验证的账号,只有这个账号才能去访问
secrets file = /etc/rsync.pas #存放密码的文件 格式: 用户名: 密码

例如:实现密码验证

[root@CentOS8 ~]# yum install rsync-daemon

[root@CentOS8 ~]# systemctl enable rsyncd –now

[root@CentOS8 ~]# cat /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no

[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = tom
secrets file = /etc/rsync.pas

[root@CentOS8 ~]# systemctl restart rsyncd.service

[root@CentOS8 ~]# mkdir /data/backup/ -p

[root@CentOS8 ~]# echo “tom:redhat” > /etc/rsync.pas

[root@CentOS8 ~]# chmod 600 /etc/rsync.pas
#必须要修改密码文件权限,不然客户端访问的时候会提示密码错误

客户端访问:
[root@CentOS8 ~]# rsync /etc/fstab [email protected]::backup
Password: #交互输入tom的密码

或者:
[root@CentOS8 ~]# rsync /root/anaconda-ks.cfg rsync://[email protected]/backup
Password:

注意:不指定用户名默认就是当前系统的用户

可以提前建立一个文件,将密码放在文件中

#非交互式查看共享目录

[root@CentOS8 ~]# echo “redhat” >/etc/rsync.pas #客户端存放rsync的密码信息

[root@CentOS8 ~]# chmod 600 /etc/rsync.pas #密码文件权限修改(必须,不然会报错)

测试:
[root@CentOS8 ~]# rsync –password-file=/etc/rsync.pas /root/file111 rsync://[email protected]/backup

inotify+rsync+shell 脚本实现实时数据同步

工作原理:

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

范例:inotify+rsync+shell 脚本实现实时数据同步

数据服务器:存放数据信息的服务器 10.0.0.11

备份服务器:存放备份信息的服务器 10.0.0.12

思路:利用inotidy监控事件是否发生变化,

[root@CentOS8 ~]# cat inotify_rsync.sh

#!/bin/bash

SRC=’/data/www/’ #需要同步的目录文件 #注意最后的/

DEST=’[email protected]::backup’ #同步到备份数据器的指定位置

rpm -q rsync &> /dev/null || yum -y install rsync #如果不存在rsync这个工具就安装它

inotifywait -mrq –exclude=”.*\.swp” –timefmt ‘%Y-%m-%d %H:%M:%S’ –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.pas $SRC $DEST && echo “At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync” >> /var/log/changelist.log
done

#通过DATE TIME DIR FILE 这四个变量记录发生的变化 日期 事件 目录 文件

到此这篇关于Linux利用inotify和rsync服务实现数据实时同步的文章就介绍到这了,更多相关Linux数据实时同步内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

Linux 技术文档 操作系统

数据库运维技术服务 » Linux利用inotify和rsync服务实现数据实时同步的原理解析

LinuxSA 普通

分享到:



香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/201860.html<

(0)
运维的头像运维
上一篇2025-04-05 23:12
下一篇 2025-04-05 23:13

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注