Inotify实时数据同步

为什么学实时数据备份

  1. 数据的重要性和脆弱性
    • 在当今数字化时代,数据是企业和个人最重要的资产之一。例如,对于一个电商企业来说,客户订单信息、商品库存数据等都是其运营的关键。这些数据一旦丢失或损坏,可能会导致业务中断、客户流失和巨大的经济损失。而实时数据备份可以最大限度地减少数据丢失的风险。
    • 数据可能会因为多种原因而受损,如硬件故障、软件错误、人为误操作、恶意攻击(如病毒、黑客入侵)等。以服务器硬盘损坏为例,若没有实时备份,存储在该硬盘上的所有数据将瞬间丢失。
  2. rsync在实时备份中的优势
    • 高效性:rsync是一个功能强大的文件同步工具。它通过比较源文件和目标文件的差异来进行同步,只传输文件之间的差异部分,而不是整个文件。例如,如果你有一个10GB的文件,其中只有1MB的数据发生了变化,rsync只会传输这1MB的数据,大大节省了备份时间和网络带宽。
    • 灵活性:rsync可以在本地计算机的不同目录之间进行备份,也可以用于远程备份。这使得它能够适应多种备份场景。比如,你可以将本地服务器的数据实时备份到远程的数据中心,以防止本地灾难(如火灾、洪水等)对数据造成毁灭性打击。
    • 准确性:它能够精确地复制文件的权限、时间戳等元数据信息。这对于需要严格保持数据一致性的应用场景非常重要。例如,在一个多用户的文件共享系统中,文件的权限设置对于数据的安全访问至关重要,rsync可以确保备份文件的权限与源文件完全一致。
  3. 实时备份的业务连续性保障
    • 对于一些对数据时效性要求很高的业务,如金融交易系统、在线医疗服务等,实时备份能够确保在主数据出现问题时,备份数据可以立即投入使用,实现业务的无缝切换。以金融交易系统为例,每一笔交易数据都必须实时记录和备份,一旦主系统出现故障,备份系统可以马上接替工作,避免交易中断,保障金融秩序的稳定。
  4. 合规性要求
    • 在许多行业,如医疗、金融、法律等,都有严格的数据备份和存储规定。这些规定通常要求企业对重要数据进行实时备份,以保护客户隐私和数据安全。例如,医疗机构必须实时备份患者的病历等医疗数据,以满足医疗法规对数据保存和安全的要求。

什么是数据实时同步

  1. 定义

    • 数据实时备份是一种数据保护策略,它能够在数据发生变化的同时,立即将这些变化复制到备份存储介质或备份系统中。与传统的定期备份(如每天、每周备份一次)不同,实时备份确保了备份数据与源数据之间的时间差最小化,几乎是同步的状态。
  2. 工作原理

    • 基于日志的备份:许多数据库管理系统和应用程序会维护一个事务日志。这个日志记录了对数据的所有更改操作,包括插入、更新和删除。在实时备份过程中,备份软件会不断地读取这个事务日志,并将其中记录的更改应用到备份数据库或存储位置。例如,在一个MySQL数据库的实时备份系统中,备份软件会实时监控数据库的二进制日志(binlog),将其中的事务操作同步到备份数据库,保证备份数据库和主数据库的数据一致性。
    • 文件系统监控:对于文件数据,实时备份软件会利用操作系统提供的文件系统监控功能。这些软件可以检测到文件的创建、修改、删除等操作。当有文件变化时,备份软件会立即将新的文件版本复制到备份位置。有些操作系统自带了基本的文件变化通知机制,如Linux中的inotify工具。实时备份软件可以利用inotify来监测文件系统的变化,一旦发现某个文件被修改,就迅速将修改后的文件发送到备份服务器。
  3. 应用场景举例

    • 企业关键业务系统:在金融行业,股票交易系统的数据需要实时备份。每一笔股票交易的信息,包括交易时间、价格、买卖双方等数据,都必须在产生的瞬间备份到另一个安全的存储位置。这是因为金融数据的完整性和及时性对于金融市场的稳定和公平交易至关重要。如果数据丢失或损坏,可能会导致交易纠纷、市场混乱等严重后果。
    • 云计算和数据中心服务:云服务提供商需要为客户的数据提供实时备份。例如,云存储服务中的用户文件,无论是文档、图片还是视频等,在用户进行修改保存后,云服务的数据备份系统会马上对这些文件进行备份。这可以确保用户数据的安全性和可用性,即使用户自己的文件副本丢失或者存储用户文件的服务器出现故障,也能够从备份中快速恢复数据。

数据备份的重要性

网站集群架构中,数据永远是最核心且重要的,数据丢失,将会给企业造成巨大损失

image-20220215182149454


image-20220215182202013


image-20220215182344999

数据备份方案

企业网站和应用都得有完全的数据备份方案确保数据不丢失,通常企业有如下的数据备份方案

定时任务定期备份

需要周期性备份的数据可以分两类:

  • 后台程序代码、运维配置文件修改,一般会定时任务执行脚本进行文件备份,然后配置Rsync工具推送到远程服务器备份
  • 对于数据库文件用定时任务脚本配合数据库提供的备份工具,定时生成备份文件,配合Rsync备份到远端

为什么要用实时同步服务

因为定时任务有缺陷,一分钟以内的数据无法进行同步,容易造成数据丢失

实时复制方案

实施复制是最适合企业备份重要数据的方式,用于用户提交的数据备份,对于用户提交的普通文件(jpg、tar、zip、MP4、txt、html)等待,都可以用Inofity+Rsync实时备份方案。

对于数据文件,还有更复杂的分布式存储方案,把数据同时备份成多份,如FastDFS、GlusterFS等

对于提交到数据库中的数据,还可以用数据库的主从复制(如MySQL),这是软件自带的实时备份。

图解备份方式

rsync+crond定时备份

image-20220215182752408

rsync+inotify实时同步

image-20220215183312201

实时同步准备

1.准备俩机器

192.168.110.24  yc-ubuntu-24  /mysite/  客户端机器

192.168.110.96  ubuntu-96     /back-dir/    备份服务器

实时复制说明

1.实时复制软件会监控磁盘文件系统的变化,比如指定的/data目录,实时复制软件进程会实时监控这个/data目录中对应文件系统数据的变化。

2.一旦/data目录文件发生变化,就会执行rsync命令,将变化的数据推送到备份服务器对应的备份目录中

实施复制软件介绍

软件 依赖程序 部署难点 说明
Inotify-tools Rsync守护进程 写复制脚本 监控目录数据变化

Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加、删除、修改等事件,利用这个内核接口,第三方软件可以监控文件系统下的情况变化。

那么Inofity-tools就是该类软件的实现,是一个监控指定目录数据实时变化的软件。

inotify+Rsync实施复制实战

  1. inotify

    • 定义和原理
      • inotify是一种Linux内核提供的文件系统事件监控机制。它允许应用程序监视文件系统的变化,比如文件的创建、删除、修改、移动等操作。当这些事件发生时,inotify会通过事件队列向应用程序发送通知。其工作原理是基于内核中的inotify子系统,该子系统通过一系列系统调用(如inotify_initinotify_add_watch等)与用户空间的程序进行交互。
    • 使用场景和优势
      • 实时监控:在很多场景下,需要对文件系统的变化进行实时跟踪。例如,在一个文件服务器环境中,管理员可能希望知道哪些用户对哪些文件进行了操作。inotify可以实时地将这些信息反馈给监控程序。
      • 自动化处理:结合脚本语言,inotify可以用于实现自动化任务。比如,当有新文件被创建到一个特定目录时,自动对该文件进行加密或者备份等操作。与传统的定时轮询文件系统的方式相比,inotify更加高效,因为它是事件驱动的,只有在文件系统发生变化时才会产生通知,而不是频繁地检查文件是否发生变化,从而节省了系统资源。
    • 示例代码(使用Python和inotify)

      • 以下是一个简单的Python示例,用于监控一个目录下的文件创建事件: ```python

        apt update && apt install python3-pip

        pip3 install inotify

        import inotify.adapters

        def main():

        i = inotify.adapters.Inotify()
        # 监控当前目录下的文件创建、删除、修改、移动等事件
        mask = inotify.constants.IN_CREATE | inotify.constants.IN_DELETE | inotify.constants.IN_MODIFY | inotify.constants.IN_MOVED_FROM | inotify.constants.IN_MOVED_TO
        i.add_watch('.', mask=mask)
        try:
            for event in i.event_gen():
                if event is not None:
                    (header, type_names, watch_path, filename) = event
                    event_type_str = ", ".join(type_names)
                    print(f"文件 {filename} 在路径 {watch_path} 发生了 {event_type_str} 事件")
        except KeyboardInterrupt:
            print("监控结束")
        
   if __name__ == "__main__":
       main()
   ```
 - 在这个示例中,首先创建了一个`Inotify`对象,然后使用`add_watch`方法来监控当前目录(`'.'`)下的文件创建事件(`mask = inotify.constants.IN_CREATE`)。在`event_gen`循环中,当有文件创建事件发生时,会打印出文件的名称和所在的路径。
  1. rsync

    • 定义和原理
      • rsync是一个功能强大的文件同步和数据备份工具。它通过比较源文件和目标文件的差异来进行文件传输,而不是简单地复制整个文件。其算法可以快速地计算出文件之间的差异部分,例如,当源文件和目标文件只有一小部分内容不同时,rsync只会传输这部分不同的内容,从而大大提高了传输效率。rsync可以在本地的不同目录之间进行文件同步,也可以在本地和远程服务器之间进行文件传输。
    • 使用场景和优势
      • 高效备份:在数据备份场景中,rsync的高效性体现得淋漓尽致。假设要备份一个包含大量文件的目录,其中只有少数文件发生了变化,使用rsync可以只备份这些变化的文件或者文件的变化部分,减少了备份时间和网络带宽的占用。例如,备份一个10GB的文件目录,其中只有10MB的数据发生了变化,rsync可以只传输这10MB的数据。
      • 远程同步:rsync可以方便地用于远程服务器之间的文件同步。这对于网站内容更新、异地数据中心的数据同步等场景非常有用。比如,一个网站的内容存储在本地服务器上,当更新内容后,使用rsync可以快速地将更新后的内容同步到远程的Web服务器上,使网站更新更加及时。
    • 示例代码(使用rsync命令行)

      • 假设要将本地目录/source/dir的内容同步到远程服务器user@remote - server:/destination/dir,并且保持文件的权限、所有者等属性不变,可以使用以下命令:
        rsync -avz /source/dir user@remote-server:/destination/dir
        
      • 其中,-a参数用于归档模式,它会递归地复制目录,并且保持文件的所有属性不变;-v参数用于显示详细的输出信息,方便查看同步过程;-z参数表示对传输的数据进行压缩,以减少网络带宽的占用。

Inotify-tools本身的核心功能都是监控指定目录内的数据变化,具体的复制到远端服务器的功能还是借助Rsync工具配合,

Inotify机制软件工作流程如下

  1. 备份源客户端开机运行Inotify软件,检测指定目录的文件系统变化
  2. 一旦获取到指定监控目录的数据发生变化,即刻执行Rsync命令复制数据。
  3. 将变化的数据发送到Rsync服务端的备份目录。

部署拓扑图

部署拓扑图

以rsync守护进程模式部署,且以远程数据同步方式,由client向server推送数据。

image-20220216102658896

我们这里设计的形式是,数据推送

1.准备好rsync服务端,等待客户端发来同步数据。(备份服务器)

2.准备好rsync客户端,结合inotify实现文件更新,主动执行rsync命令推送(开发服务器)

Backup服务器(rsync服务端)daemon守护进程模式启动

理解rsync部署流程

1.rsync程序安装

2.rsync配置文件修改

3.创建rsync服务特定用户

4.创建rsync数据备份的目录,对特定用户授权

5.创建rsync认证密码文件,修改密码文件权限600

6.启动rsync服务,以守护进程模式

7.设置rsync开机启动

image-20220216104329862

部署流程

1.安装rsync
[root@yuchao-backup01 ~]# yum install rsync -y

2.修改配置文件/etc/rsyncd.conf

写入如下配置,不得在配置文件里写注释
######by chaoge   rsyncd.conf

uid = rsync
gid = rsync
fake super = yes
use chroot = no
max connections = 200
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.0/0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password

[backup-dev]
comment = This is chaoge backup!
path = /backup/

3.根据配置文件里定义的信息,创建用户,文件等
[root@yuchao-backup01 ~]# useradd rsync -s /sbin/nologin -M
[root@yuchao-backup01 ~]# id rsync
uid=9665(rsync) gid=9666(rsync) 组=9666(rsync)

创建备份目录,授权
[root@yuchao-backup01 ~]# mkdir /backup
[root@yuchao-backup01 ~]# chown -R rsync.rsync /backup/

创建认证文件,授权
[root@yuchao-backup01 ~]# echo "rsync_backup:yuchao666" > /etc/rsync.password
[root@yuchao-backup01 ~]# chmod 600 /etc/rsync.password

4.启动rsync服务,开机自启
[root@yuchao-backup01 ~]#
[root@yuchao-backup01 ~]# systemctl start rsyncd
[root@yuchao-backup01 ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
[root@yuchao-backup01 ~]#
[root@yuchao-backup01 ~]# ps -ef|grep rsync
root      27569      1  0 00:58 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root      27604  26157  0 00:58 pts/1    00:00:00 grep --color=auto rsync

5.检查rsync
[root@yuchao-backup01 ~]# netstat -tnlp|grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      27569/rsync
tcp6       0      0 :::873                  :::*                    LISTEN      27569/rsync

dev服务器部署(rsync客户端)

1.确认rsync命令存在

2.创建rsync连接所需的密码文件,授权

1.安装rsync
[root@yuchao-dev01 ~]# yum install rsync -y

2.创建密码文件,只写密码即可
[root@yuchao-dev01 ~]# echo 'yuchao666' > /etc/rsync.password

3.必须要给密码文件授权,去掉other的权限,否则rsync会报错
[root@yuchao-dev01 ~]# chmod 600 /etc/rsync.password

测试rsync数据同步是否正确。

client > server 、数据推送

[root@yuchao-dev01 ~]#
[root@yuchao-dev01 ~]# rsync -avzP Xftp-7.0.0063p.exe  rsync_backup@192.168.0.110::backup-dev  --password-file=/etc/rsync.password

-avzP 
-a  保持文件原有属性
-v    显示传输细节情况
-z    对传输数据压缩传输
-P    显示文件传输的进度信息


也可以直接使用密码变量,进行同步

tail -1 /etc/bashrc
export RSYNC_PASSWORD=chaoge

image-20220216112239775

Client < Server ,数据拉取

rsync客户端,不仅可以向rsync服务端的备份目录里,写入数据

还可以从该备份目录中,提取数据。

[root@yuchao-dev01 tmp]# rsync -avzP  rsync_backup@192.168.0.110::backup-dev/  /tmp --password-file=/etc/rsync.password
receiving incremental file list
./
music.txt
             10 100%    9.77kB/s    0:00:00 (xfr#1, to-chk=4/6)
a/
a/b/
a/b/c/
a/b/c/d/

sent 66 bytes  received 238 bytes  202.67 bytes/sec
total size is 10  speedup is 0.03
[root@yuchao-dev01 tmp]# tree
.
├── a
│   └── b
│       └── c
│           └── d
└── music.txt

4 directories, 1 file
[root@yuchao-dev01 tmp]#

image-20220216113524082

准备部署inotify-tools

  1. 定义与作用
    • inotify - tools 是用于监控文件系统事件的工具集。它利用 Linux 内核的 inotify 机制,允许用户在文件系统对象(如文件、目录)发生变化(如创建、删除、修改、移动等)时,及时获取相关事件通知。这在很多场景下非常有用,比如日志文件监控、文件同步、自动化构建等。
  2. 背景知识 - inotify 机制
    • inotify 是 Linux 内核提供的一种文件系统事件通知机制。它通过系统调用可以让用户空间程序接收文件系统事件的通知。内核维护一个事件队列,当文件系统中的对象发生事件(如一个文件被写入数据)时,内核将相应的事件信息放入队列,而像 inotify - tools 这样的工具就可以从队列中获取这些事件并进行处理。

linux文件系统事件

  1. 文件系统事件的定义与种类
    • 在Linux系统中,文件系统事件是指对文件和目录进行的各种操作所产生的事件。这些操作包括但不限于文件的创建(CREATE)、删除(DELETE)、修改(MODIFY)、移动(MOVE)、属性变更(ATTRIB)等。
    • 例如,当一个用户使用文本编辑器打开并保存一个文件时,就会触发文件修改(MODIFY)事件;当用户使用rm命令删除一个文件时,就会触发文件删除(DELETE)事件。
  2. 事件产生的原理
    • 这些事件是由Linux内核检测到并进行记录的。内核通过文件系统驱动程序和相关的系统调用接口来跟踪文件和目录的状态变化。当用户进程或者系统进程对文件系统对象进行操作时,如调用openwriteunlink等系统调用,内核会根据这些操作来判定是否有文件系统事件产生。
    • 以文件创建事件为例,当一个进程调用creatopen系统调用并以新建文件(例如,open("new_file.txt", O_CREAT))的方式打开一个文件时,内核会检测到这一操作并生成一个文件创建事件。
  3. 文件系统事件的应用场景
    • 系统监控与安全审计
      • 可以用于监控关键系统文件和目录的变化。例如,在服务器环境中,监控/etc目录下配置文件的变化,因为这些文件的修改可能会影响系统的服务配置。如果发现异常的文件修改事件,可能提示系统遭受了未经授权的访问或者配置出现错误。
    • 自动化任务与文件同步
      • 对于开发团队,在多人协作开发一个项目时,通过监控项目目录的文件修改事件,可以自动触发构建任务或者文件同步任务。比如,当有开发人员修改了代码文件后,触发自动构建服务器重新构建项目,以确保最新的代码变更能够及时得到测试和部署。
    • 日志记录与分析
      • 监控日志文件的变化事件,如/var/log目录下的各种日志文件。当新的日志记录写入时(文件修改事件),可以实时对日志进行分析,用于故障排查或者安全事件检测。例如,在检测到Web服务器访问日志文件有新记录写入时,分析访问请求是否存在异常,如大量来自同一IP的非法访问请求。
  4. 与文件系统事件相关的工具和机制
    • inotify机制(如之前提到的inotify - tools)
      • 这是Linux内核提供的一种高效的文件系统事件通知机制。通过inotifywaitinotifywatch等工具,可以方便地监控文件系统事件。
    • dnotify机制(已较少使用)
      • 这是早期的文件系统事件通知机制。它的工作方式是通过信号来通知应用程序文件系统事件。但是与inotify相比,它存在一些局限性,如效率较低,并且在监控大量文件和目录时性能表现不佳。
    • fanotify机制
      • 这是另一种文件系统事件通知机制,主要用于安全相关的监控场景。它可以用于监控文件系统的访问事件,并且可以设置访问策略,例如,允许或禁止某些进程对特定文件或目录的访问,并且在访问发生时触发事件通知。它的功能更侧重于安全访问控制,而inotify侧重于更通用的文件系统事件监控。

实战

在上述,确保了,两台机器可以正确进行rsync数据同步后。

我们可以开始部署inotify了

只有Linux内核版本在2.6.13起才支持,以及是否存在三个系统文件,存在则支持

1.检查系统内核版本
[root@yuchao-dev01 tmp]# uname -r
3.10.0-862.el7.x86_64

2.检查inotify相关文件
[root@yuchao-dev01 tmp]# ls -l /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 2月  16 11:46 max_queued_events
-rw-r--r-- 1 root root 0 2月  16 11:46 max_user_instances
-rw-r--r-- 1 root root 0 2月  15 10:19 max_user_watches

max_user_watches:    设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认只能监控8192个文件

max_user_instances:    设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认每个用户可以开启inotify服务128个进程

max_queued_events:    设置inotify实例事件(event)队列可容纳的事件数量
默认监控事件队列长度为16384


3.安装inotifty-tools工具(需要配置epel源)

[root@yuchao-dev01 tmp]# yum install inotify-tools -y

检查生成的软件命令
[root@yuchao-dev01 tmp]# rpm -ql inotify-tools |head -2
/usr/bin/inotifywait
/usr/bin/inotifywatch

Inotify命令工具

上述操作我们安装好了Inotify-tools软件,生成2个重要的命令

  • inotifywait:在被监控的目录等待特定文件系统事件(open、close、delete等事件),执行后处于阻塞状态,适合在Shell脚本中使用,是实现监控的关键
  • Inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)

【inotifywait命令解释】

inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;

inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息

从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]

-m: 即“–monitor” 表示始终保持事件监听状态。

-d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数

-r: 即“–recursive” 表示递归查询目录

-q: 即“–quiet” 表示打印出监控事件

-o: 即“–outfile” 输出事情到一个文件而不是标准输出

-s: 即“–syslog” 输入错误信息到系统日志

-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等


-format: 指定输出格式;常用的格式符如:

%w:表示发生事件的目录

%f:表示发生事件的文件

%e:表示发生的事件

%Xe:事件以“X”分隔

%T:使用由-timefmt定义的时间格式

-timefmt:指定时间格式,用于-format选项中的%T格式

利用Inotify软件监控的事件主要是如下,也是我们使用命令,需要指定的那些事件,指的就是你想监控文件内容变化了,还是被删了,还是正在被编辑,被修改,等情况。

Events    含义
access    文件或目录被读取
modify    文件或目录内容被修改
attrib    文件或目录属性被改变
close    文件或目录封闭,无论读/写模式
open    文件或目录被打开
moved_to    文件或目录被移动至另外一个目录
move    文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create    文件或目录被创建在当前目录
delete    文件或目录被删除
umount    文件系统被卸载

关于监控事件的细节解释

可监控的事件
有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。

IN_ACCESS
被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY
被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB
被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE
一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE
一个以只读方式打开的文件或目录被关闭。
IN_CLOSE
一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
IN_OPEN
文件或目录被打开。
IN_MOVED_FROM
被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO
文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
IN_MOVE
可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE
在被监控目录中创建了子目录或文件。
IN_DELETE
被监控目录中有子目录或文件被删除。
IN_DELETE_SELF
被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF
监控项目本身被移动。

测试create事件

当我们的代码目录,有了更新,希望立即实现数据同步,即可检测create事件。

1.查看inotifywait语法,监控文件夹
[root@yuchao-dev01 data]# inotifywait -mrq --timefmt "%F" --format "%T %w%f 捕获到的事件是:%e" /data

# 参数解释
-m: 即“–monitor” 表示始终保持事件监听状态。
-r: 即“–recursive” 表示递归查询目录
-q: 即“–quiet” 表示打印出监控事件
--timefmt:指定时间格式
%m  月份(以01-12来表示)。
%d  日期(以01-31来表示)。
 %y  年份(以00-99来表示)。

%w:表示发生事件的目录
%f:表示发生事件的文件
%T:使用由-timefmt定义的时间格式
%e:表示发生的事件

image-20220216135050901

指定事件,上面是默认检测所有的事件

我们只想检测create事件,不要其他,可以这样。

[root@yuchao-dev01 data]#
[root@yuchao-dev01 data]# inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data

-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等

image-20220216135548032

命令中只监控了create的事件,并没有检测其他事件,因此也只有create会被inotify监控到 -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等

image-20220216135707350


image-20220216140111119

测试delete事件

[root@yuchao-dev01 data]# inotifywait -mrq --format '%w %f %e' -e delete /data

/data/ 超哥带你学rsync.txt DELETE
/data/ 好好学习 DELETE,ISDIR
/data/ 超哥牛逼.txt DELETE
/data/ 和超哥学Linux DELETE,ISDIR

image-20220216140503144

测试move事件

只要你在这个目录下,执行了move相关的指令,就会出发move事件

[root@yuchao-dev01 data]# inotifywait -mrq --format '%w %f %e' -e move /data

image-20220216141029384

可以知道,inotiify的作用是,基于不同的事件,检测文件夹中,文件的变化。

当检测到有事件发生后,证明文件变化,我们可以执行数据同步rsync操作了。

实现inotify+rsync实时数据备份

可知,这个工具的用法就是

1.inotify检测文件变化

2.执行rsync同步

那么想自动化实现的话,手工是不行了,就的结合脚本实现。

数据实时监测备份

1.脚本如下,这里需要跟着超哥学完shell编程之后,方可理解。 先看下shell脚本,如何检测到文件内容的变化

1.生成一个普通文本
[root@yuchao-dev01 data]# seq 10 > yuchao.txt
[root@yuchao-dev01 data]#
[root@yuchao-dev01 data]# cat yuchao.txt
1
2
3
4
5
6
7
8
9
10

2.来看一个简单的循环shell脚本
[root@yuchao-dev01 data]# vim about_while.sh
[root@yuchao-dev01 data]#
[root@yuchao-dev01 data]# cat about_while.sh
cat yuchao.txt |while read line
do
    echo 当前行内容是:$line
done

3.执行脚本
[root@yuchao-dev01 data]# pwd
/data
[root@yuchao-dev01 data]# ls
about_while.sh  yuchao.txt

[root@yuchao-dev01 data]# sh about_while.sh
当前行内容是:1
当前行内容是:2
当前行内容是:3
当前行内容是:4
当前行内容是:5
当前行内容是:6
当前行内容是:7
当前行内容是:8
当前行内容是:9
当前行内容是:10

这个作用是让shell的while循环,不断的读取,文件内容

因此也可以用来读取inotifywait检测的日志信息,一旦有新日志出现,我们就执行rsync同步,实现(文件内容检测+rsync同步)

改造脚本,脚本需求是

1.开发机器上的代码目录,一旦有代码更新,执行rsync,将代码文件发给备份服务器

1.准备一个用于测试的代码目录
[root@yuchao-dev01 data]# mkdir -p /python_code/app1
[root@yuchao-dev01 data]# mkdir -p /python_code/app2

2.改造脚本,监测该目录
[root@yuchao-dev01 data]# cat about_inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /python_code | while read line
do
    rsync -a --delete /python_code/ rsync_backup@192.168.0.110::backup-dev
    echo "`date +%F\ %T`出现事件$line" >> /var/log/rsync.log 2>&1
done




# 参数解释
-m 保持监控状态
-r 递归监控
-q 只打印事件
-e 指定事件

事件:
move    移动
delete    删除
create    创建
modify    修改
attrib    属性信息




4.添加脚本执行权限
[root@yuchao-dev01 data]# chmod +x about_inotify.sh


5.脚本执行,可以放入后台运行
一定注意,我们目前是rsync客户端,要连接服务端,如何认证?设置密码变量

[root@yuchao-dev01 data]# export RSYNC_PASSWORD=yuchao666
[root@yuchao-dev01 data]#
[root@yuchao-dev01 data]# ./about_inotify.sh

测试脚本结果

1.在开发服务器上,写入新代码文件

image-20220216153159358

实时备份脚本,本地同步版本

以下是一个使用 inotify 结合 rsync 实现实时备份的 Shell 脚本示例:

#!/bin/bash

# 监控的源目录
src_dir="/myweb/"
# 备份的目标目录
dst_dir="/local_myweb_bak/"
# 事件日志文件
log_file="/var/log/local_inotify_rsync.log"
# 监测事件的命令
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e modify,create,delete,move \
    $src_dir | while read line; do
        echo "$line" >> $log_file
        rsync -avz --delete $src_dir $dst_dir >> $log_file 2>&1
    done

# 后台执行脚本
nohup bash inotify_rsync.sh &

这个脚本的工作原理如下:

  1. 设置参数
    • src_dir 定义了需要监控的源目录,这个目录下发生文件变动时会触发后续操作。
    • dst_dir 是备份数据的目标目录,rsync 会将源目录内容同步过去。
    • log_file 用于记录 inotify 监控到的事件,以及 rsync 同步时的相关日志信息。
  2. 监控事件
    • inotifywait 命令用于监控指定目录(src_dir)的文件系统事件,包括文件修改 (modify)、创建 (create)、删除 (delete)、移动 (move) 等。-m 表示持续监控,-r 是递归监控子目录,-q 为安静模式,减少不必要输出,--timefmt--format 用于格式化输出事件的时间和详情。
  3. 事件处理循环
    • 使用 while read 循环读取 inotifywait 输出的每一行事件信息,先把事件记录到日志文件中。
    • 接着调用 rsync 命令,-a 选项表示归档模式,保留文件权限、属主、时间戳等属性,-v 是详细输出,-z 启用压缩传输,--delete 让目标目录与源目录保持完全一致,删除目标目录中源目录不存在的文件,每次事件触发都会执行同步操作,确保备份目录实时更新。

你可以将上述脚本保存为 .sh 文件,添加可执行权限(chmod +x script.sh),然后运行它来启动实时备份监控。

远程同步版本

#!/bin/bash

# 监控的源目录
src_dir="/myweb/"
export RSYNC_PASSWORD='yuchao123'
# 事件日志文件
log_file="/var/log/inotify_rsync.log"
# 监测事件的命令
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '时间:%T %w%f---事件:%e' -e modify,create,delete,move \
    $src_dir | while read line; do
        echo " $line" >> $log_file
        rsync -avz --delete $src_dir chaoge@192.168.110.24::yubackup >> $log_file 2>&1

        echo 
    done

inotifywait命令参数

inotifywait是一个强大的命令行工具,用于监视文件系统事件。以下是其主要参数的解释:

  1. -m(--monitor)

    • 含义:进行持续监控。如果没有这个选项,inotifywait在检测到一个事件后就会退出。使用-m可以让它一直运行,并实时报告文件系统中发生的符合条件的事件。
    • 示例inotifywait -m /path/to/directory会持续监视/path/to/directory目录及其子目录(如果使用了-r选项)下的文件系统事件。
  2. -r(--recursive)

    • 含义:递归地监视指定目录下的所有子目录。这意味着如果监控的是一个父目录,那么这个父目录下所有子目录中的文件系统事件也会被检测到。
    • 示例inotifywait -mr /home/user/documents会监视/home/user/documents目录及其所有子目录中的文件变化。
  3. -q(--quiet)

    • 含义:以安静模式运行,减少不必要的输出。在安静模式下,只会输出符合事件条件的信息,而一些如命令执行过程中的状态信息等会被隐藏,使得输出更加简洁明了,主要关注事件本身。
    • 示例:在脚本中使用inotifywait -mrq可以避免过多的非关键信息输出,使得日志文件(如果有记录输出)更专注于文件系统事件。
  4. --timefmt '%d/%m/%y %H:%M'

    • 含义:指定时间格式。这用于格式化事件发生时间的输出,%d/%m/%y %H:%M是一种日期时间格式,其中%d表示日,%m表示月,%y表示两位年份,%H表示小时(24小时制),%M表示分钟。
    • 示例:如果一个文件在2023年1月1日12点30分被修改,根据这个时间格式,输出的时间部分可能是01/01/23 12:30
  5. --format '%T %w%f%e'

    • 含义:指定事件输出的格式。%T表示使用--timefmt指定的时间格式输出事件发生时间,%w是事件发生的目录路径,%f是触发事件的文件名,%e是事件名称(如CREATEMODIFY等)。通过自定义这个格式,可以按照自己的需求精确地输出事件信息。
    • 示例:如果在/home/user/test.txt文件上发生了修改事件,输出可能类似于01/01/23 12:30 /home/user/test.txt MODIFY
  6. -e(--event)

    • 含义:指定要监视的事件类型。可以指定一个或多个事件类型,常见的事件类型包括access(文件被访问)、modify(文件被修改)、attrib(文件属性改变)、close_write(可写文件被关闭)、close_nowrite(不可写文件被关闭)、open(文件被打开)、moved_from(文件从监视目录中移出)、moved_to(文件移入监视目录)、create(文件或目录创建)、delete(文件或目录删除)等。
    • 示例inotifywait -e modify,create,delete /path/to/directory会监视指定目录下文件的修改、创建和删除事件。
Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2025-01-03 16:51:24

results matching ""

    No results matching ""