zoukankan      html  css  js  c++  java
  • rsync学习与实践

    1.介绍:开源的、快速的、多功能的可以实现全量和增量备份的工具;还能实现文件的删除等;可以根据文件大小的变化和修改时间的变化来同步数据(快速)

    2.描述:支持特殊文件的拷贝,例如设备文件,链接等;可以排除目录下指定文件的同步功能,相当于tar;可以做到保持原文件的属性和权限等不改变(-p);实现增量同步,传输效率很高;可以使用rcp等方式来传输文件;可以通过socket传输文件和数据(c/s);支持匿名认证的方式进行传输
    3.企业应用:两台服务器之间的数据同步(nfs备份),时时同步,增量备份
    4.rsync的工作模式:单个主机之间本地传输(类似于cp)
                                    借助rcp,ssh等通道来传输数据(类似于scp)
                                    以守护进程socket的方式传输数据(重要功能)
    5.使用方法:
           rsync [OPTION...] SRC... [DEST]
           所有属性的拷贝rsync -avz
           删除文件或者目录(不同的目录或者文件)rsync -r --delete 目录1 目录2
    6.rsync的推拉复制
           rsync -avz file(需要发送的文件) -e(指定通道) 'ssh -p 65535'(指定协议) haha@172.1.1.1:~           文件的推送
           rsync -avz -e 'ssh -p 65535' haha@172.1.1.3:~/hosts  /home/haha                                                        文件的拉取
    7.客户端的常用参数
           rsync -v:详细方式输出
                     -z:压缩传输2w
                     -a:归档模式(rtopDI)
                     -e,--rsh=command:使用的信道协议
                     --exclude=PATTERN,--exclude-from
                     --bwlimit=10:传输限速
    *8.socket方式传输
          daemon方式:
               拓扑:
    rsync的server端的配置文件/etc/rsyncd.conf
    #rsync_config_______________start
    #created by oldboy 15:01 2007-6-5
    #QQ 31333741 blog:http://oldboy.blog.51cto.com
    ##rsyncd.conf start##
    uid = rsync
    gid = rsync
    use chroot = no                          #防止安全问题
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    [oldboy]                                         #共享设置
    path = /oldboy/
    ignore errors
    read only = false
    list = false
    hosts allow = 10.0.0.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
    #rsync_config_______________end
     服务以daemon方式启动:rsync --daemon
    netstat -lntup | grep 873     监听在873端口
    然后创建对应的目录及用户,将属主和属组修改
    mkdir /oldboy              ----                 useradd -s /ssbin/nologin -M rsync      ------chown -R rsync.rsync /oldboy
    接下来创建虚拟用户以及密码
    echo "rsync_backup:oldboy" > /etc/rsync.password
    chmod 600 /etc/rsync.password
    客户端的操作:
    echo "oldboy" > /etc/rsync.password
    chmod 600 /etc/rsync.password
    数据的流向是服务端走向客户端
    在客户端执行:(下面的oldboy是服务端[oldboy]模块名,不是目录)
    rsync -avz rsync_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password         拉取操作
    rsync -avz rsync :/rsyn_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password
    rsync -avz /data/(data下的内容) rsync_backup@172.1.1.4::oldboy  --password-file=/etc/rsync.password      推操作
    rsync -avz /data/  rsync://rsync_backup@172.1.1.4/oldboy --password-file=/etc/rsync.password
     
     
    Access via rsync daemon:
             Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
                   rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
             Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
                   rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
    ****rsync拍错过程:防火墙,seliux,参考日志/var/log/syncd.log,文件命名和权限
     
     
    深度讲解rsync(873端口)
    正常情况下需要将服务端rsync写到rc.local下(echo "/usr/bin/rsync --daemon" >> /etc/rc.local)保证开机自启动
    客户端负责推送本地的文件到rsync服务端的对应模块下
    rsync拓展:
    --exclude
    --exclude-from
    排除的方法:可以在客户端排除,也可以在服务端设置参数进行排除
    rsync -avz --exclude=log/ /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除目录或者单个文件可以这样纸
    rsync -avz --exclude={1.txt,2.txt,5.txt,log/} /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除多个文件和目录的用法
    rsync -avz --exclude-from=hehe.log /data/ rsync_backup@172.1.1.4::oldboy--password-file=/etc/rsync.password 
    服务端的排除:(需要修改配置文件,会带来麻烦)
     
    ********无差异同步实践(主备机之间的需求)
    参数:--delete
    推送的场景:其一是备份(主要) --delete风险(文件丢失)
    拉取【客户端操作】的应用场景:代码发布,下载(远端有啥本地有啥)
    rsync -avz --delete rsync_backup@172.1.1.4::oldboy /data/ --password-file=/etc/rsync.password         保证数据的时时同步
    使用场景:负载均衡器之间和高可用服务器之间
     
    防火墙配置:
    iptables -A INPUT -s 172.1.1.0/255.255.255.0 -p tcp -m tcp --dport 873 -j ACCEPT
     
     
    多模块配置(共享多个目录)
    需要在服务器端操作的事项:配置文件中写多个模块,参考配置文件如下:
    uid = rsync
    gid = rsync
    use chroot = no
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 172.1.1.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
     
    [oldboy]
    path = /oldboy/
     
    [data]
    path = /data/
     
     
    然后再对data目录给以rsync属主,此时就可以实现在客户端的操作了
     
     
     
     
    排错:密码文件权限问题,目录以及权限问题,防火墙问题,
    前提是熟悉部署的流程;
    原理要理解
    学会看日志(命令行和日志输出)
    模拟错误,重视日常的错误
     
     
     
     
    rsync+inotify时时同步
     
    1、时时同步原理
          计划任务结合rsync实现分钟级别的同步
          inotify是一种异步文件系统时间监控机制,触发同步
          首先在客户端安装inotify程序,在服务端启动rsync --daemon;当客户端检测到的目录及内容发生变化时然后客户端会将发生变化的目录及内容推送
    2、inotify的实施
           准备条件:实现rsync daemon和客户端之间的推拉传输数据
           配置inotify的要求:在客户端安装和配置
     
          先查看客户端是否支持inotify
    # ll /proc/sys/fs/inotify/
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_queued_events          最大队列事件(大一点比较好)
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_user_instances           
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_user_watches
    51CTO下载-inotify-tools-3.14.tar.gz
    ./configure -prefix=/opt/inotify
    make && make install
    ln -s /opt/inotify /usr/local/inotify
    3、详细介绍
    /opt/inotify/bin/inotifywait   
    --exclude <pattern>      排除文件或者目录时不区分大小写
        --excludei <pattern>   排除文件或者目录时不区分大小写                    
        -m|--monitor              始终保持事件监听状态
        -d|--daemon                                                                     
        -r|--recursive               递归查询目录
        --fromfile <file>    
        -o|--outfile <file>
        -s|--syslog     
        -q|--quiet                     打印很少的信息,打印监控事件    
        -qq              
        --format <fmt>            打印使用指定的输出类似格式的字符串  
        --timefmt <fmt>    strftime-compatible format string for use with
                          %T in --format string.
        -c|--csv          Print events in CSV format.
        -t|--timeout <seconds>
                          When listening for a single event, time out after
                          waiting for an event for <seconds> seconds.
                          If <seconds> is 0, inotifywait will never time out.
        -e|--event <event1> [ -e|--event <event2> ... ]              监控事件的变化
            Listen for specific event(s).  If omitted, all events are 
            listened for.
    Exit status:
        0  -  An event you asked to watch for was received.
        1  -  An event you did not ask to watch for was received
              (usually delete_self or unmount), or some error occurred.
        2  -  The --timeout option was given and no events occurred
              in the specified interval of time.
     
    Events:
        access         file or directory contents were read
        modify        file or directory contents were written
        attrib           file or directory attributes changed
        close_write    file or directory closed, after being opened in
                       writeable mode
        close_nowrite    file or directory closed, after being opened in
                       read-only mode
        close        file or directory closed, regardless of read/write mode
        open        file or directory opened
        moved_to    file or directory moved to watched directory
        moved_from    file or directory moved from watched directory
        move        file or directory moved to or from watched directory
        create        file or directory created within watched directory
        delete        file or directory deleted within watched directory
        delete_self    file or directory was deleted
        unmount        file system containing file or directory unmounted
    4.实战:
    在inotify端执行:
    /opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e create,delete,open /backup      在backup目录下的创建操作进行监控
    /opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e delete /backup 
    简化的事件输出:
    #!/bin/bash
    /opt/inotify/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /backup
    while read file
         do
            rsync -az "$file" --delete rsync_backup@serverip::backup --password-file=/etc/rsync.password
          done
    执行上述的脚本,然后再往backup下创建和删除文件测试,但是不能实现删除同步操作。
     
     
    优化版脚本如下:
     
    #!/bin/bash
    #parameter
    host=172.1.1.4
    src="/backup"
    dst="oldboy"
    user="rsync_backup"
    pass="/etc/rsync.password"
    cmd="/opt/inotify/bin/inotifywait"
     
    #judge
    if [ ! -e $src ] 
    || [ ! -e $pass ] 
    || [ ! -e $cmd ] 
    || [ ! -e "/usr/bin/rsync" ];
    then
         echo "please check file and folder !"
         exit 9
    fi
     
    #exec
    $cmd -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src 
    | while read file
            do
               # rsync -azP --delete --timeout=100 --password-file=$pass $src $user@$host::$dst &> /dev/null
               cd $src && rsync -az -R --delete ./ --timeout=100 $user@$host::$dst --password-file=$pass &> /dev/null
            done
    exit 0
     
    通过start|stop控制脚本事项inotify操作结合上述脚本实现开关操作
     
    #!/bin/bash
    . /etc/init.d/functions
     
    if [ $# -ne 1 ];then
            usage:$0 {start|stop}
            exit 1
    fi
    case "$1" in
    start)
            /bin/bash /server/scripts/inotify.sh &
            echo $$ > /opt/inotify/i.pid
            if [ `ps -ef | grep inotify|wc -l` -gt 2 ];then
                action "inotify server is started" /bin/true
            else
                action "inotify server is error" /bin/false
            fi
            ;;
    stop)
            kill -9 `cat /opt/inotify/i.pid` > /dev/null 2>&1
            pkill inotifywait
            sleep 1
            if [ `ps -ef | grep inotify |wc -l` -eq 0 ];then
                 action "inotify server is stopped" /bin/true
            else
                 action "inotify server is stopped error" /bin/false
            fi
            ;;
    *)
            usage :$0 {start|stop}
            exit 1
    esac
     
     
    压力测试 及优化
    查看inotify对应的内核参数
    cd /proc/sys/fs/inotify/
     cat *
    16384         表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
    128             表示每一个real user ID可创建的inotify instatnces的数量上限
    8192           表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)       
    上述三个参数可以按照实际情况尽可能地调大一点
    重启机器之后会失效,永久操作的方法
     
    vim /etc/sysctl.conf

    fs.inotify.max_queued_events= 99999999
    fs.inotify.max_user_watches= 99999999
    fs.inotify.max_user_instances= 65535
     
    修改完成之后sysctl -p 刷新生效即可

    注意: max_queued_events 是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。
    (小文件的最大并发数也就200左右,否则会有延迟)
     
    echo {a..j} | tr " " " " > a.log     #竖着 写文件
    split -l 2 a.log                             #两行一个分割文件
     
     
    inotify的缺点
    (1)、并发大于200有延迟
    (2)、推送效率不高
     
    改进版
    #!/bin/bash
    cmd="/opt/inotify/bin/inotifywait"
    $cmd -mqr --format '%w%f' -e create,close_write,delete /backup|
    while read line
    do
         [ ! -e "$line" ] && continue
         rsync -az --delete $line rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password
     
    done
                                                                                                  
                   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     1.介绍:开源的、快速的、多功能的可以实现全量和增量备份的工具;还能实现文件的删除等;可以根据文件大小的变化和修改时间的变化来同步数据(快速)
    2.描述:支持特殊文件的拷贝,例如设备文件,链接等;可以排除目录下指定文件的同步功能,相当于tar;可以做到保持原文件的属性和权限等不改变(-p);实现增量同步,传输效率很高;可以使用rcp等方式来传输文件;可以通过socket传输文件和数据(c/s);支持匿名认证的方式进行传输
    3.企业应用:两台服务器之间的数据同步(nfs备份),时时同步,增量备份
    4.rsync的工作模式:单个主机之间本地传输(类似于cp)
                                    借助rcp,ssh等通道来传输数据(类似于scp)
                                    以守护进程socket的方式传输数据(重要功能)
    5.使用方法:
           rsync [OPTION...] SRC... [DEST]
           所有属性的拷贝rsync -avz
           删除文件或者目录(不同的目录或者文件)rsync -r --delete 目录1 目录2
    6.rsync的推拉复制
           rsync -avz file(需要发送的文件) -e(指定通道) 'ssh -p 65535'(指定协议) haha@172.1.1.1:~           文件的推送
           rsync -avz -e 'ssh -p 65535' haha@172.1.1.3:~/hosts  /home/haha                                                        文件的拉取
    7.客户端的常用参数
           rsync -v:详细方式输出
                     -z:压缩传输2w
                     -a:归档模式(rtopDI)
                     -e,--rsh=command:使用的信道协议
                     --exclude=PATTERN,--exclude-from
                     --bwlimit=10:传输限速
    *8.socket方式传输
          daemon方式:
               拓扑:
    rsync的server端的配置文件/etc/rsyncd.conf
    #rsync_config_______________start
    #created by oldboy 15:01 2007-6-5
    #QQ 31333741 blog:http://oldboy.blog.51cto.com
    ##rsyncd.conf start##
    uid = rsync
    gid = rsync
    use chroot = no                          #防止安全问题
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    [oldboy]                                         #共享设置
    path = /oldboy/
    ignore errors
    read only = false
    list = false
    hosts allow = 10.0.0.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
    #rsync_config_______________end
     服务以daemon方式启动:rsync --daemon
    netstat -lntup | grep 873     监听在873端口
    然后创建对应的目录及用户,将属主和属组修改
    mkdir /oldboy              ----                 useradd -s /ssbin/nologin -M rsync      ------chown -R rsync.rsync /oldboy
    接下来创建虚拟用户以及密码
    echo "rsync_backup:oldboy" > /etc/rsync.password
    chmod 600 /etc/rsync.password
    客户端的操作:
    echo "oldboy" > /etc/rsync.password
    chmod 600 /etc/rsync.password
    数据的流向是服务端走向客户端
    在客户端执行:(下面的oldboy是服务端[oldboy]模块名,不是目录)
    rsync -avz rsync_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password         拉取操作
    rsync -avz rsync :/rsyn_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password
    rsync -avz /data/(data下的内容) rsync_backup@172.1.1.4::oldboy  --password-file=/etc/rsync.password      推操作
    rsync -avz /data/  rsync://rsync_backup@172.1.1.4/oldboy --password-file=/etc/rsync.password
     
     
    Access via rsync daemon:
             Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
                   rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
             Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
                   rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
    ****rsync拍错过程:防火墙,seliux,参考日志/var/log/syncd.log,文件命名和权限
     
     
    深度讲解rsync(873端口)
    正常情况下需要将服务端rsync写到rc.local下(echo "/usr/bin/rsync --daemon" >> /etc/rc.local)保证开机自启动
    客户端负责推送本地的文件到rsync服务端的对应模块下
    rsync拓展:
    --exclude
    --exclude-from
    排除的方法:可以在客户端排除,也可以在服务端设置参数进行排除
    rsync -avz --exclude=log/ /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除目录或者单个文件可以这样纸
    rsync -avz --exclude={1.txt,2.txt,5.txt,log/} /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除多个文件和目录的用法
    rsync -avz --exclude-from=hehe.log /data/ rsync_backup@172.1.1.4::oldboy--password-file=/etc/rsync.password 
    服务端的排除:(需要修改配置文件,会带来麻烦)
     
    ********无差异同步实践(主备机之间的需求)
    参数:--delete
    推送的场景:其一是备份(主要) --delete风险(文件丢失)
    拉取【客户端操作】的应用场景:代码发布,下载(远端有啥本地有啥)
    rsync -avz --delete rsync_backup@172.1.1.4::oldboy /data/ --password-file=/etc/rsync.password         保证数据的时时同步
    使用场景:负载均衡器之间和高可用服务器之间
     
    防火墙配置:
    iptables -A INPUT -s 172.1.1.0/255.255.255.0 -p tcp -m tcp --dport 873 -j ACCEPT
     
     
    多模块配置(共享多个目录)
    需要在服务器端操作的事项:配置文件中写多个模块,参考配置文件如下:
    uid = rsync
    gid = rsync
    use chroot = no
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 172.1.1.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
     
    [oldboy]
    path = /oldboy/
     
    [data]
    path = /data/
     
     
    然后再对data目录给以rsync属主,此时就可以实现在客户端的操作了
     
     
     
     
    排错:密码文件权限问题,目录以及权限问题,防火墙问题,
    前提是熟悉部署的流程;
    原理要理解
    学会看日志(命令行和日志输出)
    模拟错误,重视日常的错误
     
     
     
     
    rsync+inotify时时同步
     
    1、时时同步原理
          计划任务结合rsync实现分钟级别的同步
          inotify是一种异步文件系统时间监控机制,触发同步
          首先在客户端安装inotify程序,在服务端启动rsync --daemon;当客户端检测到的目录及内容发生变化时然后客户端会将发生变化的目录及内容推送
    2、inotify的实施
           准备条件:实现rsync daemon和客户端之间的推拉传输数据
           配置inotify的要求:在客户端安装和配置
     
          先查看客户端是否支持inotify
    # ll /proc/sys/fs/inotify/
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_queued_events          最大队列事件(大一点比较好)
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_user_instances           
    -rw-r--r-- 1 root root 0 5月  18 17:32 max_user_watches
    51CTO下载-inotify-tools-3.14.tar.gz
    ./configure -prefix=/opt/inotify
    make && make install
    ln -s /opt/inotify /usr/local/inotify
    3、详细介绍
    /opt/inotify/bin/inotifywait   
    --exclude <pattern>      排除文件或者目录时不区分大小写
        --excludei <pattern>   排除文件或者目录时不区分大小写                    
        -m|--monitor              始终保持事件监听状态
        -d|--daemon                                                                     
        -r|--recursive               递归查询目录
        --fromfile <file>    
        -o|--outfile <file>
        -s|--syslog     
        -q|--quiet                     打印很少的信息,打印监控事件    
        -qq              
        --format <fmt>            打印使用指定的输出类似格式的字符串  
        --timefmt <fmt>    strftime-compatible format string for use with
                          %T in --format string.
        -c|--csv          Print events in CSV format.
        -t|--timeout <seconds>
                          When listening for a single event, time out after
                          waiting for an event for <seconds> seconds.
                          If <seconds> is 0, inotifywait will never time out.
        -e|--event <event1> [ -e|--event <event2> ... ]              监控事件的变化
            Listen for specific event(s).  If omitted, all events are 
            listened for.
    Exit status:
        0  -  An event you asked to watch for was received.
        1  -  An event you did not ask to watch for was received
              (usually delete_self or unmount), or some error occurred.
        2  -  The --timeout option was given and no events occurred
              in the specified interval of time.
     
    Events:
        access         file or directory contents were read
        modify        file or directory contents were written
        attrib           file or directory attributes changed
        close_write    file or directory closed, after being opened in
                       writeable mode
        close_nowrite    file or directory closed, after being opened in
                       read-only mode
        close        file or directory closed, regardless of read/write mode
        open        file or directory opened
        moved_to    file or directory moved to watched directory
        moved_from    file or directory moved from watched directory
        move        file or directory moved to or from watched directory
        create        file or directory created within watched directory
        delete        file or directory deleted within watched directory
        delete_self    file or directory was deleted
        unmount        file system containing file or directory unmounted
    4.实战:
    在inotify端执行:
    /opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e create,delete,open /backup      在backup目录下的创建操作进行监控
    /opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e delete /backup 
    简化的事件输出:
    #!/bin/bash
    /opt/inotify/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /backup
    while read file
         do
            rsync -az "$file" --delete rsync_backup@serverip::backup --password-file=/etc/rsync.password
          done
    执行上述的脚本,然后再往backup下创建和删除文件测试,但是不能实现删除同步操作。
     
     
    优化版脚本如下:
     
    #!/bin/bash
    #parameter
    host=172.1.1.4
    src="/backup"
    dst="oldboy"
    user="rsync_backup"
    pass="/etc/rsync.password"
    cmd="/opt/inotify/bin/inotifywait"
     
    #judge
    if [ ! -e $src ] 
    || [ ! -e $pass ] 
    || [ ! -e $cmd ] 
    || [ ! -e "/usr/bin/rsync" ];
    then
         echo "please check file and folder !"
         exit 9
    fi
     
    #exec
    $cmd -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src 
    | while read file
            do
               # rsync -azP --delete --timeout=100 --password-file=$pass $src $user@$host::$dst &> /dev/null
               cd $src && rsync -az -R --delete ./ --timeout=100 $user@$host::$dst --password-file=$pass &> /dev/null
            done
    exit 0
     
    通过start|stop控制脚本事项inotify操作结合上述脚本实现开关操作
     
    #!/bin/bash
    . /etc/init.d/functions
     
    if [ $# -ne 1 ];then
            usage:$0 {start|stop}
            exit 1
    fi
    case "$1" in
    start)
            /bin/bash /server/scripts/inotify.sh &
            echo $$ > /opt/inotify/i.pid
            if [ `ps -ef | grep inotify|wc -l` -gt 2 ];then
                action "inotify server is started" /bin/true
            else
                action "inotify server is error" /bin/false
            fi
            ;;
    stop)
            kill -9 `cat /opt/inotify/i.pid` > /dev/null 2>&1
            pkill inotifywait
            sleep 1
            if [ `ps -ef | grep inotify |wc -l` -eq 0 ];then
                 action "inotify server is stopped" /bin/true
            else
                 action "inotify server is stopped error" /bin/false
            fi
            ;;
    *)
            usage :$0 {start|stop}
            exit 1
    esac
     
     
    压力测试 及优化
    查看inotify对应的内核参数
    cd /proc/sys/fs/inotify/
     cat *
    16384         表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
    128             表示每一个real user ID可创建的inotify instatnces的数量上限
    8192           表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)       
    上述三个参数可以按照实际情况尽可能地调大一点
    重启机器之后会失效,永久操作的方法
     
    vim /etc/sysctl.conf

    fs.inotify.max_queued_events= 99999999
    fs.inotify.max_user_watches= 99999999
    fs.inotify.max_user_instances= 65535
     
    修改完成之后sysctl -p 刷新生效即可

    注意: max_queued_events 是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。
    (小文件的最大并发数也就200左右,否则会有延迟)
     
    echo {a..j} | tr " " " " > a.log     #竖着 写文件
    split -l 2 a.log                             #两行一个分割文件
     
     
    inotify的缺点
    (1)、并发大于200有延迟
    (2)、推送效率不高
     
    改进版
    #!/bin/bash
    cmd="/opt/inotify/bin/inotifywait"
    $cmd -mqr --format '%w%f' -e create,close_write,delete /backup|
    while read line
    do
         [ ! -e "$line" ] && continue
         rsync -az --delete $line rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password
     
    done
                                                                                                  
                   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    使用Android自定义格式的定义Button
    Java Binary Search
    非常成功的人会做的八件事
    Ubuntu12.04 安装java
    NetBeans 时事通讯(刊号 # 125 Nov 17, 2010)
    NetBeans IDE 7.0 Beta 发布
    关于 IPv6 你需要知道的 10 件事
    开始学习 Go
    开始学习 Go
    Quartz 1.8.4 发布
  • 原文地址:https://www.cnblogs.com/wanghui1991/p/5561925.html
Copyright © 2011-2022 走看看