zoukankan      html  css  js  c++  java
  • 使用rsync+inotify-tools+ssh实现文件实时同步

    在某些服务器架构中,会遇到文件同步问题,例如需要做站点镜像备份,同步文件到多个CDN节点等。需要解决的主要有两个问题
    1.如何实现文件同步问题? 2.何时执行同步操作?
        文件同步可以使用rsync+ssh,什么时候自行同步操作呢?可能部分人会想到cron,这个没错,可以实现的,但是确实有点浪费资源,因为 cron并不知道文件是否被修改过,只是不停的周期性的执行,如果文件修改后再执行同步操作,不修改就不执行那应该比较好,其实inotify就可以做 到,只要你的服务器不是古董级别的,就支持inotify,来几句没用的话:
        Inotify 是一个 Linux特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。

        假设某服务器架构中有两台web服务器(IP为192.168.1.252和192.168.1.254),一台代码更新发布服务器(IP为192.168.1.251),需要同步的目录是/data/www/,结构图如下:

    rsync文件同步

    下面介绍一下安装步骤
    在代码发布服务器(192.168.1.251)上安装inotify,执行如下命令
    tar xzvf inotify-tools-3.14.tar.gz
    cd inotify-tools-3.14
    ./configure
    make
    make install
    cd ..
    在所有服务器上(代码发布服务器和需要同步的服务器)上安装rsync,命令如下:
    tar zxvf rsync-3.0.9.tar.gz
    cd rsync-3.0.9
    ./configure
    make
    make install
    #------以上命令在每台服务器上都需要执行---------

    在代码发布服务器与需要同步的服务器之间配置ssh key信任,在代码发布服务器上生成公钥和私钥
    ssh-keygen -t rsa
    直接三次回车
    将公钥添加到各个需要更新的主机authorized_keys 文件中,在代码更新服务器上再执行
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.252
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.254
    如果有提示 输入yes
    按提示输入密码回车
    然后两台需要web服务器(192.168.1.252和192.168.1.254 )重启ssh
    service sshd restart
    在代码发布服务器上以root身份创建inotify_rsync.sh脚本vi /root/inotify_rsync.sh 输入

    #!/bin/sh
    SRC=/data/www/    #代码发布服务器目录
    DST=/data/www/    #目标服务器目录
    IP="192.168.1.252 192.168.1.254"    #目标服务器IP,多个以空格隔开
    USER=root
    /usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)"
    -e create,move,delete,close_write,attrib $SRC | while read files
    do
    for i in $IP
    do
        /usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
        echo $files >>/tmp/rsync.log 2>&1
    done
    done

    相关解释:
    /usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)"
    -e create,move,delete,close_write,attrib $SRC | while read files

     -m 是保持一直监听
     -r 是递归查看目录
     -q 是打印出事件
     -e create,move,delete,close_write,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
     
    /usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
     -a 存档模式
     -h 保存硬连接
     -q 制止非错误信息
     -z 压缩文件数据后传输
     -t 维护修改时间
     -delete 删除于多余文件

    --exclude 排除同步的文件

    然后赋予脚本可执行权限
    chmod +x /root/inotify_rsync.sh
    设置开机自启动 echo "/root/inotify_rsync.sh &" >> /etc/rc.local
    执行脚本/root/inotify_rsync.sh &

    在代码更新服务器的/data/www/目录中创建文件,测试效果。

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/georgelu/p/6412263.html
Copyright © 2011-2022 走看看