zoukankan      html  css  js  c++  java
  • inotify和rsync实现数据实时同步

    数据的实时同步

    实现实时同步

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

    --timefmt <fmt>时间格式,参考 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 <fmt> 格式定义

    %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 FILE;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/log/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
    

    客户端日志文件变化情况

     服务端文件跟踪结果

     

     

     

     

      

     

     

     

     

  • 相关阅读:
    YApi 部署记录
    《Go语言网络编程》第一章:体系
    Golang知识图谱
    Docker学习笔记之二:制作镜像并PUSH
    下载m3u8视频
    杂知识
    遗传算法
    评分卡
    小数据玩转Pyspark(2)
    从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)
  • 原文地址:https://www.cnblogs.com/struggle-1216/p/11986595.html
Copyright © 2011-2022 走看看