• 实时数据备份实践inotify和rsync联动


    目录

    一、实时数据备份

    1.实时数据备份

    2.定时任务周期性的数据备份

    3.实时数据备份

    4.Inotify机制

    二、实践

    1.实时复制环境准备

    2.实时复制概念

    3.Inofity+Rsync实施复制实战

    4.配置好rsync守护进程

    5.检查linux是否支持inotify

    6.安装inotyify--tools

    7.inotifywait命令

    8.inotifywait可监控事件

    三、脚本化实现事件检测与rsync进行数据同步

    1.rsync客户端创建同步脚本

    2.创建/data确保文件存在

    3.测试shell脚本


    一、实时数据备份

    1.实时数据备份

    企业网站和应用都得有完善的数据备份方案,目的都是为了保证数据不丢失

    2.定时任务周期性的数据备份

    需要周期性数据备份的数据类型一般有这几种

    • 网站后台程序代码,运维配置文件,一般都会使用定时任务执行周期性的备份脚本,然后在通过rsync工具吧数据备份到 backup备份服务器上
    • 比如数据库文件,也使用定时任务配合mysql自身的备份命令,结合数据库备份,再通过rsync上传到备份服务器

    3.实时数据备份

    实时复制方案,是最适合企业重要的数据备份方案,用于用户提交的数据进行备份,jpg,png,tar,zip,mp4,txt,html

    都可以使用inotify+sersync+rsync进行实时的数据备份

    对于数据库文件,我们还有会更复杂的分布式备份方案,我们会吧数据拆分成多份,然后进行备份操作

    对于提交到数据库的数据,我们还会使用数据库比如主从复制,进行备份操作

    4.Inotify机制

    • Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加、删除、修改等事件,利用这个内核接口,第三方软件可以监控文件系统下的情况变化。
    • 那么Inofity-tools就是该类软件的实现,是一个监控指定目录数据实时变化的软件。
    • 实现了Inotify的软件还有 Sersync 、 Inotify-tools
    • Sersync软件是在Inotify的基础上进行开发的,功能更加强大,支持配置文件中定义、重试机制、过滤机制、提供CDN数据更新

    [Inotify机制的优点]

    • 监控文件系统的事件变化,通过复制工具实现实时数据复制
    • 支持多线程实时复制

    [lnotify的缺点]

    实测当文件数量大于200个 (10~100kb) ,复制存在延迟


    二、实践

    1.实时复制环境准备

    准备两台虚拟机

    • 一个是数据客户端
    • 一个是rsync备份服务器

    2.实时复制概念

    • Inotify-tools 依赖于rsync守护进程 以及要部署复制脚本 监控目录数据的变化
    • Sersync* 依赖于rsync守护进程 需要定制配置文件 监控目录数据的内容变化

    3.Inofity+Rsync实施复制实战

    无论是Inotify-tools还是Sersync、本身的核心功能都是监控指定目录内的数据变化 ,具体的复制到远端服务器的功能还是借助Rsync工具配合,Inotify机制软件工作流程如下

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

    4.配置好rsync守护进程

    systemctl status rsyncd

    可以查看我以前的守护进程实践的文章

    5.检查linux是否支持inotify

    检查当前linux版本,linux内核高于2.6.13版本

    1. [root@localhost backup]# ls -l /proc/sys/fs/inotify/
    2. total 0
    3. -rw-r--r--. 1 root root 0 Nov 13 02:09 max_queued_events
    4. -rw-r--r--. 1 root root 0 Nov 13 02:09 max_user_instances
    5. -rw-r--r--. 1 root root 0 Nov 13 02:09 max_user_watches
    6. [root@localhost backup]#
    • max_queued_events 设置intofy实例事件队列可容纳的事件数量
    • max_user_instances 设置每个用户可以运行的事件命令进程数max
    • max_user_watches 设置intify命令检测的文件数量

    6.安装inotyify--tools

    1. yum install -y epel-release && yum update
    2. yum -y install inotify-tools

    检查有关inotify的操作命令

    rpm -ql inotify-tools | head -2

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

    7.inotifywait命令

    • inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树
    • inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息
    • 从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

    语法格式: inotifywait [-hcmrg][-e][-t][-format][-timefmt][...]:

    • -m:即“-monitor”表示始终保持事件监听状态。
    • -d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数
    • -r:即“-recursive” 表示递归查询目录
    • -q:即“-quiet” 表示打印出监控事件
    • -o:即“-outfile”输出事情到一个文件而不是标准输出
    • -s: 即“-syslog”输入错误信息到系统日志

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

    • %w: 表示发生事件的目录
    • %f: 表示发生事件的文件
    • %e: 表示发生的事件
    • %Xe:事件以“X”分隔
    • %T: 使用由-timefmt定义的时间格式

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

    利用inotify软件监控的事件主要是如下:

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

    使用这个监控

    inotifywait -mrq --timefmt "%F" --format "%T %w %f" -e create /data

    参数解释

    inotifywait 是命令

    -m 表示一直处在检测状态

    -r 递归的检测

    -q 打印出检测的事件信息

    --timefmt 对时间格式化

    --format 对日志信息格式化

    %T 使用有--timefmt所定义的格式

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

    %f 表示事件发生的文件

    -e 默认inotifywait是监控所有事件,可以使用-e单独的指定某种事件 events

    这个守护进程会占据整个shell的控制权

    这里监控了/data的创建文件信息,我们创建文件看看是否会有输出

    这里立刻有了输出

    时间不够精细,我们再改一下

    inotifywait -mrq --timefmt "%y-%m-%d %T" --format "%T %w %f" -e create /data

    %d 日期 几号

    %m 月份 1-12

    %T 年份的意思 显示后2位

    %T 显示时分秒

    8.inotifywait可监控事件

    inotify所能监控的事件标志如下:

    • 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 监控项目本身被移动。

    我们创建一个delete事件实例

    inotifywait -mrq --timefmt "%y-%m-%d T" --format "%T %w %f 当前事件有: %e" -e delete /data

    删除一个文件

    弹出一个事件

    close_write能够监控创建和修改两个事件

    inotifywait -mrq --timefmt "%y-%m-%d T" --format "%T %w %f 当前事件有: %e" -e close_write /data

    只能检测到创建,不能检测到删除

    修改能检测


    三、脚本化实现事件检测与rsync进行数据同步

    rsync守护进程客户端和服务端配置请看我前面的博客

    1.rsync客户端创建同步脚本

    1. mkdir /myshell/
    2. cd /myshell/
    3. vim inoti_rsy.sh

    写入下面shell语句

    1. #!/bin/bash
    2. cmd='/usr/bin/inotifywait'
    3. $cmd -mrq --timefmt "%y-%m-%d %T" --format " %T %w%f 当前事件有: %e" -e close_write,delete /data | \
    4. while read line
    5. do
    6. cd /data && \
    7. rsync -avzP --delete ./ rsync_backup@192.168.0.107::backup --password-file=/etc/rsync.password
    8. done

    2.创建/data确保文件存在
     

    1. mkdir /data
    2. chmod 700 /data/

    3.测试shell脚本

    sudo bash inoti_rsy.sh

    再开个shell测试

    touch /data/2.txt

    可以看到成功同步了

    看下服务端同步的文件

    修改下2.txt文件

    vim /data/2.txt

    写入这个

    也有同步信息

    看下服务端,也已经同步成功!

  • 相关阅读:
    电脑提示找不到msvcp140.dll无法继续执行代码的4种解决办法
    实战三十一:基于LightGCN推荐算法的推荐系统详细教程代码+数据
    ORA-28040:没有匹配的验证协议
    Lua中如何实现类似gdb的断点调试--01最小实现
    java毕业设计高校学生宿舍管理mybatis+源码+调试部署+系统+数据库+lw
    Vue ref & props & mixin
    (学习日记)2022.8.5
    Item 42: Consider emplacement instead of insertion.
    笔记:.NET的框架梳理及相关概念了解(“.NET Core“ “.NET“ “.NET Framework“)
    音视频开发是不是C++开发中最难的细分方向?
  • 原文地址:https://blog.csdn.net/bmxch/article/details/134555296