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

    引言:rsync实现数据备份,inotify监控文件系统提供通知功能,二者结合能够实现服务器之间文件的实时同步。

    rsync

    特性:

    可以镜像保存整个目录树和文件系统;

    增量同步数据,文件传输效率高;

    可以保持原有文件的权限、时间等属性;

    加密传输数据,保证了数据的安全性;

    支持断点续传;

    可以使用rcp、ssh等方式传输文件,也可以通过socket连接传输文件;

    支持匿名传输;

    rsync4种模式

           本地shell

           远程shell

           查询(列表)模式

           服务器模式

    本地shell模式:

           rsync -av orgi/file1 dest/

    -a archive,归档模式,递归并保持文件属性

    -v verbose

    注意斜杠  目录名带斜杠orgi/ 表示复制目录下的所有文件,不带斜杠,复制目录本身

    远程shell模式

           rsync orgi weblogic@192.168.2.17:/home/weblogic

           默认情况下使用ssh作为传输机制

    列表模式:

           rsync -a weblogic@192.168.2.17:/home/weblogic

    服务器模式:

           基于C/S

    A:服务器端,需要备份的文件

    B:客户端,备份服务器

    A配置:/etc/rsyncd.conf

    uid = nobody
    gid = nobody
    use chroot = no
    max connections = 10
    strict modes = yes
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    log file = /var/log/rsyncd.log
    
    [ixdba]
    path = /home/weblogic/orgi
    comment = ixdba file
    igonre errors
    read only = no
    write only = no
    hosts allow = *
    hosts deny = 
    list = false
    uid = root
    gid = root
    auth users = backup
    secrets file = /etc/server.pass
    
    /etc/server.pass
    backup:ixdba123
    

    B配置:

           备份机不做任何配置,只需执行rsync同步操作即可;

    rsync –vzrogpt --delete --progress --exclude “*access*”--exclude “debug*”backup@192.168.2.17::ixdba  ixdba.net --password-file=/etc/server.pass
    

    /etc/server.pass文件内容:

    ixdba123

    chmod 600 /etc/server.pass

    --delete 指以服务器端A为基准,保持客户端和服务器端目录完全一直

    放入定时任务即可实现文件定时同步

    inotify+rsync实现数据实时备份:

    查看内核是否支持inotify

    ll /proc/sys/fs/inotify/

    max_queued_events 表示调用inotify_init时分配inotify 实例中可排队的event数的最大值

    max_user_instances 每一个real user可创建inotify实例上限

    max_user_watches 每个inotify实例可监控最大目录数量

    编译安装inotify-tools,https://ncu.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

    安装后的两个命令行工具:

    inotifywait

    inotifywatch

    inotify实时同步脚本:

    说明:脚本按文件变更所在目录进行同步,对于百万级的文件数目也能实现很好的实时同步,如果全量同步,rsync进行文件校验时就会花费大量的时长和服务器资源,综合考虑,按目录进行同步数据较为理想。

    #!/bin/bash
    # 需要同步的源路径
    src=/home/weblogic/orgi/
    # 目标服务器上 rsync --daemon 发布的名称
    des=ixdba
    # rsync验证的密码文件
    rsync_passwd_file=/etc/server.pass
    # 目标服务器1
    ip1=192.168.12.23
    # 目标服务器2
    #ip2=192.168.0.19
    # rsync --daemon定义的验证用户名
    user=backup
    
    # 把监控到有发生更改的"文件路径列表"循环
    /usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ${src} | while read file
      do
            # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_EVENT=$(echo $file | awk '{print $1}')
    	# 把inotify输出切割 把文件路径部分赋值给INO_FILE
            INO_FILE=$(echo $file | awk '{print $2}')
            echo "-------------------------------$(date)------------------------------------"
            echo $file
            #增加、修改、写入完成、移动进事件
            #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
            #判断事件类型
            if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
            then
                    echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
    		# INO_FILE变量代表路径哦  -c校验文件内容
                    rsync -avzc --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}         
                    #rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                    #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
            fi
            #删除、移动出事件
            if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
            then
                    echo 'DELETE or MOVED_FROM'
                    rsync -avz --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                    #rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                    #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间
            fi
            #修改属性事件 指 touch chgrp chmod chown等操作
            if [[ $INO_EVENT =~ 'ATTRIB' ]]
            then
                    echo 'ATTRIB'
                    # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                    if [ ! -d "$INO_FILE" ]
                    then
                            rsync -avzc --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}            
                            #rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                    fi
            fi
    done
    

    inotifywait 参数说明

    参数名称

    参数说明

    -m,–monitor

    始终保持事件监听状态

    -r,–recursive

    递归查询目录

    -q,–quiet

    只打印监控事件的信息

    –excludei

    排除文件或目录时,不区分大小写

    -t,–timeout

    超时时间

    –timefmt

    指定时间输出格式

    –format

    指定时间输出格式

    -e,–event

    后面指定删、增、改等事件

    inotifywait events事件说明

    事件名称

    事件说明

    access

    读取文件或目录内容

    modify

    修改文件或目录内容

    attrib

    文件或目录的属性改变

    close_write

    修改真实文件内容

    close_nowrite

     

    close

     

    open

    文件或目录被打开

    moved_to

    文件或目录移动到

    moved_from

    文件或目录从移动

    move

    移动文件或目录移动到监视目录

    create

    在监视目录下创建文件或目录

    delete

    删除监视目录下的文件或目录

    delete_self

     

    unmount

    卸载文件系统

  • 相关阅读:
    解决网页元素无法定位的几种方法
    转载:pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'
    关于list的漏删
    春风十里不如你
    记我兵荒马乱的一周(0808-0812)--用户反馈及修改点验证
    vue定时器
    业务系统多机房多活实现思路
    分布式开发之:id生成器
    关于部署系统的一些思考
    web系统认证与鉴权中的一些问题
  • 原文地址:https://www.cnblogs.com/jjzd/p/6740056.html
Copyright © 2011-2022 走看看