centos rsync+inotify 实现文件实时同步功能

rsync+inotify 实现文件实时同步功能

  1. 在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份的服务器特定目录中。
  2. 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
  3. 异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
一、rsync介绍

  rsync 常用于做为 linux系统下的数据镜像备份工具,实现实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步。

  1. 优点
    使用安全的shell连接做为传输方式
    只发送变了的文件,如果时间戳使用touch刷新,也会复制,复制的是变化的一部分
    比scp更快,只复制不同的文件
  2. 常用选项:
    -n 模拟复制过程
    -v 显示详细过程
    -r 递归复制目录树
    -p 保留权限
    -t 保留时间戳
    -g 保留组信息
    -o 保留所有者信息
    -l 将软链接文件本身进行复制(默认)
    -L 将软链接文件指向的文件复制
    -a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
    –delete 如果本地文件夹少一个文件,也把对端的删除了
  3. 范例
    注意两端电脑都需要安装rsync
    rzync --delete -av /etc 192.168.19.11:/tmp 如果本地文件夹少一个文件,也把对端的删除了
    注意目录/etc 与 /etc/ 的区别,带个斜线的区别
    rsync -av /etc 192.168.19.11:/tmp 复制目录和目录下文件(-a 所有参数)
    rsync -av /etc/ 192.168.19.11:/tmp 只复制目录下文件
二、rsync服务端介绍

  让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接,这里需要记住,源主机代表客户端,备份主机是服务端。

  1. 在centos7中,rsync包集成了服务文件
    [root@localhost ~]#rpm -ql rsync | grep service
    /usr/lib/systemd/system/rsyncd.service
    /usr/lib/systemd/system/rsyncd@.service
    [root@localhost ~]#
    # 查看帮助
    [root@localhost ~]#man rsyncd.conf
    
  2. 在centos8中,需要额外安装rsync-daemon包
  3. 范例
      让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接,这里需要记住,源主机代表客户端,备份主机是服务端。
    # 服务端配置
    [root@localhost ~]#echo "xiapi:xiapi" > /etc/rsync.pass
    [root@localhost ~]#chmod 600 /etc/rsync.pass
    [root@localhost ~]#cat /etc/rsyncd.conf 
    uid = root
    gid = root
    use chroot = no
    max connections = 0
    ignore errors
    exclude = lost+found/
    pid file = /var/run/rsyncd.pid
    log file = /var/log/rsyncd.log
    reverse lookup = no
    [data]
        path = /data
        comment = bcakup
        read only = no
        auth users = xiapi
        secrets file =/etc/rsync.pass
    [root@localhost ~]#
    [root@localhost ~]#systemctl start rsyncd
    # 客户端配置
    [root@localhost ~]#echo xiapi > /etc/rsync.pass
    [root@localhost ~]#chmod 600 /etc/rsync.pass
    #此为必要项,否则会报如下错误
    [root@localhost ~]#rsync -av --delete --password-file=/etc/rsync.pass /data xiapi@192.168.19.11::ftp
    ERROR: password file must not be other-accessible
    rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
    [root@localhost ~]#chmod 600 /etc/rsync.pass
    [root@localhost ~]#rsync -av --delete --password-file=/etc/rsync.pass /data xiapi@192.168.19.11::data
    
三、inotify 文件监控介绍
  1. 查看内核是否支持

    [root@localhost ~]#ll -l /proc/sys/fs/inotify/
    total 0
    -rw-r--r--. 1 root root 0 Dec 20 19:20 max_queued_events
    -rw-r--r--. 1 root root 0 Dec 20 19:20 max_user_instances
    -rw-r--r--. 1 root root 0 Dec 20 19:20 max_user_watches
    [root@localhost ~]#
    
  2. 查看内核参数
    max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错
    误,默认值:16384
    max_user_instances:每个用户创建inotify实例最大值,默认值:128
    max_user_watches:可以监视的文件数量(单进程),默认值:8192
    修改参数

    [root@centos8 ~]#vim /etc/sysctl.conf
    fs.inotify.max_queued_events=66666
    fs.inotify.max_user_watches=100000
    [root@centos8 ~]#sysctl -p
    fs.inotify.max_queued_events = 66666
    fs.inotify.max_user_watches = 100000
    [root@centos8 ~]#cat /proc/sys/fs/inotify/*
    66666
    128
    100000
    
  3. inotifywait 工具安装

    [root@localhost ~]#yum install inotify-tools
    
  4. inotifywait 命令参数
    -m, --monitor 始终保持事件监听
    -d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
    -r, --recursive 递归监控目录数据信息变化
    -q, --quiet 输出少量事件信息
    –exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
    –excludei 和exclude相似,不区分大小写
    -o, --outfile 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
    -s, --syslogOutput 发送错误到syslog相当于标准错误输出
    –timefmt 指定时间输出格式
    –format 指定的输出格式;即实际监控输出内容
    -e指定监听指定的事件,如果省略,表示所有事件都进行监听

  5. inotifywait 时间格式
    参考 man 3 strftime
    %Y 年份信息,包含世纪信息
    %y 年份信息,不包括世纪信息
    %m 显示月份,范围 01-12
    %d 每月的第几天,范围是 01-31
    %H 小时信息,使用 24小时制,范围 00-23
    %M 分钟,范围 00-59

  6. inotifywait --format格式定义
    %T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
    %w 事件出现时,监控文件或目录的名称信息
    %f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
    %e 显示发生的事件信息,不同的事件默认用逗号分隔
    %Xe显示发生的事件信息,不同的事件指定用X进行分隔

  7. inotifywait -e 选项的事件类型
    create 文件或目录创建
    delete 文件或目录被删除
    modify 文件或目录内容被写入
    attrib 文件或目录属性改变
    close_write 文件或目录关闭,在写入模式打开之后关闭的
    close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
    close 文件或目录关闭,不管读或是写模式
    open 文件或目录被打开
    moved_to 文件或目录被移动到监控的目录中
    moved_from 文件或目录从监控的目录中被移动
    move 文件或目录不管移动到或是移出监控目录都触发事件
    access 文件或目录内容被读取
    delete_self 文件或目录被删除,目录本身被删除
    unmount 取消挂载

  8. 范例
    需要开启两个端口,一个端口用来运行inotifywait,一个端口用来操作文件

    # 窗口1
    [root@localhost ~]#ls /data
    a.txt  b.txt  c.txt  youyou.txt
    [root@localhost ~]#
    # 窗口2
    [root@localhost ~]#inotifywait /data
    Setting up watches.
    Watches established.
    /data/ OPEN,ISDIR 
    
四、rsync配合inotify 实现文件实时同步功能

主机A代表源数据机器–安装inotify-tools,rsync,然后运行下面脚本
主机B代表备份机器–配置rsync服务端

#!/bin/bash
#
#********************************************************************
#Author:                liuhao
#QQ:                    1921160095
#Date:                  2019-12-20
#FileName:             tongbu.sh
#Description:          The test script
#Copyright (C):         2019 All rights reserved
#********************************************************************
SRC='/data/'                           
# 本地文件夹
DEST='xiapi@192.168.19.11::data'
# 目标主机
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
# 循环检测 inotify 是否输出信息
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
# 循环体便是执行rsync 同步文件
done

五、小工具优化
  1. screen 运行脚本,防止终端退出,导致脚本停止
    #打开screen,后面可以跟名称
    [root@localhost ~]#yum install screen
    [root@localhost ~]#screen
    
    #运行同步的脚本
    [root@localhost ~]#sh tongbu.sh
    #剥离这个screen
    ctrl a + d 
    [detached from 7943.pts-0.localhost]
    [root@localhost ~]#
    
    #查看进程发现 scree 是独立运行的,没有基于ssh,所以ssh断开也不受影响
    [root@localhost ~]#ps auxf
    root       7943  0.0  0.0 127772  1424 ?        Ss   19:41   0:00 SCREEN
    root       7944  0.0  0.1 115980  2660 pts/2    Ss   19:41   0:00  \_ /bin/bash
    root       7959  0.0  0.0 113184  1356 pts/2    S+   19:41   0:00      \_ sh tongbu.sh
    root       7960  0.0  0.0   6524   744 pts/2    S+   19:41   0:00          \_ inotifywait -mrq --timefmt %Y-%
    root       7961  0.0  0.0 113184   388 pts/2    S+   19:41   0:00          \_ sh tongbu.sh
    
    #查看当前运行的screen
    [root@localhost ~]#screen -ls
    There is a screen on:
        6897.pts-1.localhost	(Detached)
    1 Socket in /var/run/screen/S-root.
    
    #恢复screen 后面可以跟名称
    [root@localhost ~]#screen -r
    
  2. watch 查看命令
    每一秒执行一次ls 在备份机上,查看同步是否正常
    [root@localhost ~]#watch -n1 ls /data
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值