• inotifywait


    rsync + inotify 组合
    Inotify是一种强大的异步的文件系统事件监控机制

    NFS间的备份:
    如果坏了其中一个的NFS这是就用到了inotify+rsync 把这个NFS的IP地址换到另一个NFS上
    inotify 能保持时时同步 +rsync 但是单点问题也有

    inotify 的实现有几款软件
    1)inotify-tools,
    2)sersync(金山周洋)
    3)lsyncd


    inotify 优点:
    1)监控文件系统事件变化,通过同步工具实现实时数据同步


    inotify 缺点
    1)并发如果大于200个文件(10-100k),同步就会有延迟
    2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
    3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?


    查看当前系统是否支持inotify:
    [root@backup ~]# ls -l /proc/sys/fs/inotify
    总用量 0
    -rw-r--r-- 1 root root 0 3月 11 05:01 max_queued_events
    -rw-r--r-- 1 root root 0 3月 11 05:01 max_user_instances
    -rw-r--r-- 1 root root 0 3月 11 05:01 max_user_watches
    在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
    max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
    max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。
    max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

    Yum安装inotify-tools:首先要检查看有没有这个命令 wget 还有看能不能上网
    需要把大M的文件移动到bak下
    #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install inotify-tools
    rpm -qa inotify-tools
    一共安装了2个工具,即inotifywait和inotifywatch
    inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,
    执行后处于阻塞状态,适合shell脚本中使用。
    inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。


    inotifywait参数:
    -r 递归查询目录
    -q 打印很少的信息,仅仅打印监控事件的信息
    -m 始终保持事件监听状态
    -e 通过此参数可以指定需要监控的事件,如下一个列表所示
    格式如: inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e create /backup

    创建监控: -e create:制定监控的时间类型,监控创建create事件。
    删除监控: -e delete:指定监听的事件类型。监听删除delete事件
    写模式关闭监控: -e close_write:指定监听类型。监听文件写模式的关闭。
    写模式监控如监控 如:ceho vim 创建新的文件时

    编写inotify实时监控脚本:
    1:#!/bin/bash
    2:Path=/data
    3:backup_Server=172.16.1.41
    4:/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line
    5:do
    6: if [ -f $line ];then
    7: rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
    8: else
    9: cd $Path &&
    10: rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
    11: fi
    12:done


    如果是文件的话就简单一下,如果不是文件的话才会推送所以
    脚本命令解析:
    | 是多线程
    2行:目录的路径
    3行:备份服务器的IP地址
    4行:命令的绝对路径加-mrq参数--format‘%w%f’以绝对目录的方式-e是监控的三种事件 /data是目录的名字
    | while read line 创建的一个循环 |管道符 一种特殊的用法,一但监控的事件有变化就会传送给
    line这个变量 就会触发执行下面的命令
    6行: 判读一下[ -f $line ] 是不是文件,是文件推送这个文件
    7行: 是文件就推送
    9行: 9和10是如果不是文件就进入它的目录下推它的所以
    10行: 启动rsync这个命令 -az不显示信息 ./ 推当前目录下的所以内容 --delete 以一种时时同步的方式
    rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password 朝这个服务器推
    nfsbackup这个模块推 下面是密码文件


    脚本可以加入开机启动:
    echo "/bin/sh /server/scripts/inotify.sh &" >> /etc/rc.local


    Rsync+inotify实时数据同步并发简单测试
    [root@nfs01 data]# paste inotify_100_server.log
    inotify_100_backup_server.log > inotify_100.txt

    [root@nfs01 data]# cat inotify_100.txt
    23:05 34227 23:05 34227
    23:05 34387 23:05 34387
    23:05 35027 23:05 35027
    23:05 35587 23:05 35587
    以下省略...

    Inotify实时并发:
    结论:经过测试,每秒200文件并发,数据同步几乎无延迟(小于1秒)


    读写分离方法: 写%20 读%80
    用户上传的图片或者附件单独存在NFS主服务器上;
    用户读取数据从两台NFS备份服务器上读取;
    NFS主和两台NFS备份通过inotify+rsync方式进行实时同步。

  • 相关阅读:
    Go语言基础之指针
    Go语言基础之流程控制
    Go语言基础之函数
    Go语言基础之map
    Go语言基础之数组切片
    windows 10中使用命令行关掉占用指定端口的程序
    在window 10查看一下指定命令行工具所在的位置
    关闭掉mysql 8和mysql5.7的密码验证插件validate_password
    mysql 添加数据如果数据存在就更新ON DUPLICATE KEY UPDATE和REPLACE INTO
    使用MySQL yum源安装MySQL
  • 原文地址:https://www.cnblogs.com/lv3322/p/9959654.html
Copyright © 2020-2023  润新知