zoukankan      html  css  js  c++  java
  • linux 中部署 rsync 实现文件远程备份及 同步

    客户端:数据源;服务端:数据接收方

    rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html

    手动测试用“通过远程外壳访问"里的语法:

    参考1链接:https://blog.csdn.net/ljihe/article/details/52276889

    在rc.local里面加入/usr/bin/rsync --daemon,然后保存退出。
    chmod 755 /etc/rc.d/rc.local

     查看rsync是否启动

    netstat -lnt 
    netstat -lntup |grep 873 #可以看到是哪个程序在管理

    常用指令参考:https://www.cnblogs.com/f-ck-need-u/p/7220009.html

    没有用后台daemon启动,手动测试的时候可以用这句来只同步一个文件(注意这里的用户必须是实际存在的,daemon模式下的用户可以是虚拟的):

     排除指定文件夹和指定连接的端口:

    rsync -avzcR --exclude='runtime/' --port=50000

    测试端口是否可用,daemon服务器启动端口后用 telnet x.x.x.x. 50000 连接测试,连接后退出用"ctrl + ]",再用quit退出

    用双冒号访问时,如果服务端如果没有启用--daemon客户端会收到这样的错误

    服务端rsyncd.conf配置文件注释:https://blog.csdn.net/wwwyuanliang10000/article/details/48710545

    服务端参考的最简单配置:

    加载自定义配置文件:

    加载自定义密码文件:

    参考2链接:https://www.cnblogs.com/shihuc/p/5628893.html 

    客户端配置不用密码:

    vi /etc/profile
    source /etc/profile
    env
    export RSYNC_PASSWORD="rsyncuser的密码"

    设置环境变量:https://jingyan.baidu.com/article/0f5fb099370f146d8234ea43.html 

    开机启动如果无效的话是文件权限不够,可以设置为755:https://jingyan.baidu.com/article/4853e1e5413b541909f72632.html

    chmod 755 /etc/rc.d/rc.local

    都设置完了不成功可以考虑关闭防火墙试一下:

    CentOS 7防火墙:
    firewall-cmd --state  //查看状态
    systemctl stop firewalld.service //关闭
    systemctl start firewalld.service  //开启
    systemctl disable firewalld.service //关闭开机启动
    systemctl enable firewalld.service  //开启开机启动

    端口不通的提示如下:

     rsync命令排除文件和文件夹(exclude-from):https://blog.csdn.net/liangdsh/article/details/51769910

     -------------------------------------- inotify ---------------------------------------------------------

    inotify 安装:https://www.cnblogs.com/pyrene/p/6414724.html

    是否安装:
    rpm -qa inotify-tools
    线上安装:
    yum install inotify-tools -y

    手动测试

    inotifywait -rm /home

    inotify-tools命令使用讲解: https://www.centos.bz/2012/06/inotify-tools-introduction/

    详细案例:http://www.ttlsa.com/web/let-infotify-rsync-fast/

    #!/bin/bash
    src=/data/                           # 需要同步的源路径
    des=data                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
    rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
    ip1=192.168.0.18                 # 目标服务器1
    ip2=192.168.0.19                 # 目标服务器2
    user=root                            # rsync --daemon定义的验证用户名
    cd ${src}                              # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
    /usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把监控到有发生更改的"文件路径列表"循环
    do
            INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
            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'
                    rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&         #(去掉&&可以在这个服务器不通的时候继续下一个指令) INO_FILE变量代表路径哦  -c校验文件内容
                    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 -avzR --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'
                    if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                    then
                            rsync -avzcR --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

    开机启动参考:https://blog.csdn.net/w124374860/article/details/52684518

    程序在后台不挂断运行

    nohup abc.sh &
    
    jobs
    fg [num]
    ctrl + c

     或

    nohup ./abc.sh >/dev/null 2>log &
  • 相关阅读:
    webstorm
    呐,这是某蒟蒻幼稚的博客 ~~Welcome
    CSP-S 2021 补题记录
    CSP-S 2021 游记
    Tarjan 算法小结
    FHQ Treap 浅析
    2048游戏 (C++ Windows)
    线段树 算法分析
    树状数组 算法分析
    数学期望(ξ) 浅析
  • 原文地址:https://www.cnblogs.com/gavinyyb/p/9000462.html
Copyright © 2011-2022 走看看