zoukankan      html  css  js  c++  java
  • rsync unison+inotify双向实时同步

    rsync多线程同步

    A:文件服务器 ip:10.10.1.10

    B:备份服务器 ip:10.10.1.11

    1、在B服务器上安装rsync软件

    tar xzvf rsync-3.1.0.tar.gz

    cd rsync-3.1.0

    ./configure

    make

    make install

    2、配置双机ssh信任

    在两台服务器的root目录下创建.ssh目录并设置正确的权限

    mkdir ~/.ssh

    chmod 700 ~/.ssh

    使用ssh-keygen命令生成SSH协议的RSA密钥

    ssh-keygen -t rsa

    将生成的id_rsa.pub互换到另一台服务器的~/.ssh目录下并改名为authorized_keys

    A服务器:

    scp root@10.10.1.11:/root/.ssh/id_rsa.pub /root/.ssh

    mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

    chmod 600 /root/.ssh/authorized_keys

    B服务器:

    scp root@10.10.1.10:/root/.ssh/id_rsa.pub /root/.ssh

    mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

    chmod 600 /root/.ssh/authorized_keys

    3、在B服务器上使用perl控制rsync多线程

    vim rsyncc.sh

    #!/usr/bin/perl

    my $path = "/softdata/gho/desktop";              #本地目录

    my $ip="10.10.1.10";                             #远程目录

    my $maxchild=3;

    open FILE,"ls $path|";

    while()

    {

            chomp;

            my $filename = $_;

            my $i = 1;

            while($i<=1){

                    my $un = `ps -ef |grep rsync|grep -v grep |grep avl|wc -l`;

                    $i =$i+1;

                    if( $un < $maxchild){

                               system("rsync -avl --size-only --delete --progress  $ip:$path/$_ $path &");   

    --将1.10中的/softdata/gho/desktop下的文件同步到本机的/softdata/gho/desktop目录下—

                    }else{

                            sleep 10;

                            $i = 1;

                    }

            }

    }

    chmod u+x rsyncc.sh

    4、运行此程序

    rsyncc.sh脚本放在root目录下

    /root/rsyncc.sh &

    5、测试在A服务器上边修改文件看B服务器的变化

    rsync+inotify应用案例

    服务器地址分配:

    server:192.168.13.202 (rsync  server)  备份服务器

    Web:192.168.13.200 (rsync client、inotify)  内容发布服务器

    1、分别在两台服务器上安装rsync软件

    rysnc下载主页地址:http://rsync.samba.org,这里下载的是rsync-3.1.0

    下面进行编译安装,过程如下:

    tar zxvf rsync-3.1.0.tar.gz

    cd rsync-3.1.0

    ./configure

    make

    make install

    2、在server上边配置rsync

    rsync的配置文件为/etc/rsyncd.conf,在安装完rsync时,默认没有这个文件,需要手动创建,配置内容如下:

    vim /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/rsync.lock

    log file = /var/log/rsyncd.log

    [web]

    path = /home/web/

    comment = web file

    ignore errors

    read only = no

    write only = no

    hosts allow = 192.168.13.200

    hosts deny = *

    uid = root

    gid = root

    auth users = web

    secrets file = /etc/web.pass

    3、创建密码文件

    echo “web:ipanel” > /etc/web.pass

    chmod 600 /etc/web.pass

    cat /etc/web.pass

    web:ipanel

    4、在server系统上启动rsync进程

    /us r/local/bin/rsync –daemon

    5、在web服务器上边安装inotify工具inotify-tools

    下载地址http://inotify-toos.sourceforge.net下载相应版本的inotify-tools

    tar zxvf inotify-tools-3.14.tar.gz

    cd inotify-tools-3.14

    ./configure

    make

    make install

    ll /usr/local/bin/inotifywa*

    -rwxr-xr-x. 1 root root 36435 12月  5 17:22 /usr/local/bin/inotifywait

    -rwxr-xr-x. 1 root root 34969 12月  5 17:22 /usr/local/bin/inotifywat

    6、配置web服务器

    通过一个shell脚本来完成

    vim inotifyrsync.sh

    #! /bin/bash

    host=192.168.13.202

    src=/home/web/

    dst=web

    user=web

    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files

    do

      /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user@$host::$dst && echo "${files} was rsynced" >> /tmp/rsync.log 2>&1

    done

    echo “ipanel” /etc/server.pass

    chmod 600 /etc/server.pass

    inotifyrsync.sh可以放到任意位置  这里放在/root下边

    chmod 755 inotifyrsync.sh

    7、放到后台运行脚本

    /root/inotifyrsync.sh &

    8、测试rsync+inotify实时同步功能

    在web服务器的/home/web目录下添加、删除、修改文件,然后查看server服务器对应目录内容的变化

    rsync参数

    在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

    Rsync的命令格式可以为以下六种:

      rsync [OPTION]... SRC DEST

      rsync [OPTION]... SRC [USER@]HOST:DEST

      rsync [OPTION]... [USER@]HOST:SRC DEST

      rsync [OPTION]... [USER@]HOST::SRC DEST

      rsync [OPTION]... SRC [USER@]HOST::DEST

      rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

      对应于以上六种命令格式,rsync有六种不同的工作模式:

      1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup

      2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src

      3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data

      4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack

      5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www

      6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www

    rsync参数的具体解释如下:

    -v, --verbose 详细模式输出

    -q, --quiet 精简输出模式

    -c, --checksum 打开校验开关,强制对文件传输进行校验

    -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

    -r, --recursive 对子目录以递归模式处理

    -R, --relative 使用相对路径信息

    -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。

    --backup-dir 将备份文件(如~filename)存放在在目录下。

    -suffix=SUFFIX 定义备份文件前缀

    -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

    -l, --links 保留软链结

    -L, --copy-links 想对待常规文件一样处理软链结

    --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结

    --safe-links 忽略指向SRC路径目录树以外的链结

    -H, --hard-links 保留硬链结

    -p, --perms 保持文件权限

    -o, --owner 保持文件属主信息

    -g, --group 保持文件属组信息

    -D, --devices 保持设备文件信息

    -t, --times 保持文件时间信息

    -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间

    -n, --dry-run现实哪些文件将被传输

    -W, --whole-file 拷贝文件,不进行增量检测

    -x, --one-file-system 不要跨越文件系统边界

    -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节

    -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步

    --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息

    -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

    --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

    --delete 删除那些DST中SRC没有的文件

    --delete-excluded 同样删除接收端那些被该选项指定排除的文件

    --delete-after 传输结束以后再删除

    --ignore-errors 及时出现IO错误也进行删除

    --max-delete=NUM 最多删除NUM个文件

    --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输

    --force 强制删除目录,即使不为空

    --numeric-ids 不将数字的用户和组ID匹配为用户名和组名

    --timeout=TIME IP超时时间,单位为秒

    -I, --ignore-times 不跳过那些有同样的时间和长度的文件

    --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间

    --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0

    -T --temp-dir=DIR 在DIR中创建临时文件

    --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份

    -P 等同于 --partial

    --progress 显示备份过程

    -z, --compress 对备份的文件在传输时进行压缩处理

    --exclude=PATTERN 指定排除不需要传输的文件模式

    --include=PATTERN 指定不排除而需要传输的文件模式

    --exclude-from=FILE 排除FILE中指定模式的文件

    --include-from=FILE 不排除FILE指定模式匹配的文件

    --version 打印版本信息

    --address 绑定到特定的地址

    --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件

    --port=PORT 指定其他的rsync服务端口

    --blocking-io 对远程shell使用阻塞IO

    -stats 给出某些文件的传输状态

    --progress 在传输时现实传输过程

    --log-format=formAT 指定日志文件格式

    --password-file=FILE 从FILE中得到密码

    --bwlimit=KBPS 限制I/O带宽,KBytes per second

    -h, --help 显示帮助信息

    一般都使用azv选项

    linux利用unison实现双向或多向实时同步

    以下内容是linux服务器中双向(多向)同步的部署过程,

    环境:
    服务器A:192.168.1.6,同步目录:/var/www
    服务器B:192.168.1.7,同步目录:/var/www

    1、安装unison

    首先安装ocaml,版本至少为3.07或更高
    下载地址:http://caml.inria.fr
    tar xf ocaml-3.10.2.tar.gz
    cd ocaml-3.10.2
    ./configure
    make world opt
    make install
    cd ..

    2、安装unison

    下载地址:www.seas.upenn.edu/~bcpierce/unison/
    tar xvf unison-2.32.52.tar.gz
    cd unison-2.32.52
    make UISTYLE=text
    cp unison /usr/local/bin
    cd ..

    注:
    UISTYLE=text THREADS=true STATIC=true表示使用命令行方式,加入线程支持以静态模式编译

    3、安装inotify

    下载地址:http://inotify-tools.sourceforge.net
    tar xvf inotify-tools-3.14.tar.gz
    cd inotify-tools-3.14
    ./configure
    make
    make install
    cd ..

    4、配置双机ssh信任

    参考此教程:http://www.lvtao.net/server/ssh-no-password.html



    5、添加脚本

    在192.168.1.6服务器A上添加脚本:
    mkdir /script
    vim /script/inotify.sh
    ######################以下是脚本内容#########################
    #/bin/bash
    UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
    if [ ${UNISON} -lt 1 ]
    then
    ip2="192.168.1.7"
    src2="/var/www/"
    dst2="/var/www/ "
    /usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
    do
    /usr/local/bin/unison -batch $src2 ssh://$ip2/$dst2
    echo -n "$line " >> /var/log/inotify/inotify$(date +%u).log
    echo ` date +%F %T " " -f1-4` >> /var/log/inotify/inotify$(date +%u).log
    done
    fi
    ###########################################################

    6、在192.168.1.7服务器上添加脚本:

    mkdir /script
    vim /script/inotify.sh
    ######################以下是脚本内容#########################
    #/bin/bash
    UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
    if [ ${UNISON} -lt 1 ]
    then
    ip2="192.168.1.6"
    src2="/var/www/"
    dst2="/var/www/ "
    /usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
    do
    /usr/local/bin/unison -batch $src2 ssh://$ip2/$dst2
    echo -n "$line " >> /var/log/inotify/inotify$(date +%u).log
    echo ` date +%F %T " " -f1-4` >> /var/log/inotify/inotify$(date +%u).log
    done
    fi
    ###########################################################

    在二台服务器上修改脚本权限:
    chmod a+x /script/inotify.sh
    在计划任务中添加任务(原本在/etc/rc.local下添加开机启动的,但出问题,脚本并不执行)
    crontab –e
    #unison+inotify
    * * * * * /bin/sh /script/inotify.sh > /dev/null 2>&1 &


    7、执行脚本测试:

    重启电脑,测试二台服务器中/var/www的内容是否能同步
    不重启电脑,手动执行脚本也可以测试

    sh /script/inotify

     

    unison相关参数说明

    特别注意:在远程使用unison时,在远程主机和目录直接要多加一个"/"
    force    表示会以本地所指定文件夹为标准,将该目录同步到远端。这里需要注意,如果指定了force参数,那么Unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步,类似与rsync。
     
    Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。
     
    Unison双向同步的一个缺点是:对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。
     
    testserver      该参数用来测试连通性,连接到服务器后退出,并不进行实际的同步
    servercmd       指定服务器端的unison命令路径
    ignore = Path   表示忽略指定目录,即同步时不同步它。
    batch = true    表示全自动模式,接受缺省动作,并执行。
    -fastcheck true 表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。
    log = true      表示在终端输出运行信息。
    logfile         指定输出的log文件。
    另外,Unison有很多参数,这里仅介绍常用的几个,详细的请参看Unison手册。
    -auto           接受缺省的动作,然后等待用户确认是否执行。
    -batch          batch mode, 全自动模式,接受缺省动作,并执行。
    -ignore xxx     增加 xxx 到忽略列表中
    -ignorecase [true|false|default]   是否忽略文件名大小写
    -follow xxx    是否支持对符号连接指向内容的同步
    owner = true   保持同步过来的文件属主
    group = true   保持同步过来的文件组信息
    perms = -1     保持同步过来的文件读写权限
    repeat = 1     间隔1秒后,开始新的一次同步检查
    retry = 3      失败重试次数
    sshargs = -C   使用ssh的压缩传输方式
    xferbycopying  优化参数,默认true
    -immutable xxx   不变目录,扫描时可以忽略
    -silent          安静模式,除了错误,不打印任何信息
    -times           同步修改时间
    -path xxx        只同步 -path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。

    inotify-tools命令使用讲解

    inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。现在介绍一下它的使用方法。

    安装方法

    • wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
    • tar xzf inotify-tools-3.14.tar.gz ;cd inotify-tools-3.14
    • ./configure --prefix=/usr && make && su -c 'make install'

    使用例子

    inotifywait

    1、实时监控/home的所有事件(包括文件的访问,写入,修改,删除等)

    inotifywait -rm /home

    2、监控/var/log/messeges中有关httpd的日志

    • #!/bin/sh
    •        while inotifywait -e modify /var/log/messages; do
    •          if tail -n1 /var/log/messages | grep httpd; then
    •            kdialog --msgbox "Apache needs love!"
    •          fi
    •        done

    inotifywatch

    1、统计/home文件系统的事件

    inotifywatch -v -e access -e modify -t 60 -r /home

    参数说明

    inotifywait

    语法:
    inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
    参数:
    -h,–help
    输出帮助信息
    @
    排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
    –fromfile 
    从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -m, –monitor
    接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
    -d, –daemon
    跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
    -o, –outfile 
    输出事情到一个文件而不是标准输出。
    -s, –syslog
    输出错误信息到系统日志
    -r, –recursive
    监视一个目录下的所有子目录。
    -q, –quiet
    指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
    –exclude 
    正则匹配需要排除的文件,大小写敏感。
    –excludei 
    正则匹配需要排除的文件,忽略大小写。
    -t , –timeout 
    设置超时时间,如果为0,则无限期地执行下去。
    -e , –event 
    指定监视的事件。
    -c, –csv
    输出csv格式。
    –timefmt 
    指定时间格式,用于–format选项中的%T格式。
    –format 
    指定输出格式。
    %w 表示发生事件的目录
    %f 表示发生事件的文件
    %e 表示发生的事件
    %Xe 事件以“X”分隔
    %T 使用由–timefmt定义的时间格式

    inotifywatch

    语法:
    inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
    参数:
    -h, –help
    输出帮助信息
    -v, –verbose
    输出详细信息
    @
    排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
    –fromfile 
    从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -z, –zero
    输出表格的行和列,即使元素为空
    –exclude 
    正则匹配需要排除的文件,大小写敏感。
    –excludei 
    正则匹配需要排除的文件,忽略大小写。
    -r, –recursive
    监视一个目录下的所有子目录。
    -t , –timeout 
    设置超时时间
    -e , –event 
    只监听指定的事件。
    -a , –ascending 
    以指定事件升序排列。
    -d , –descending 
    以指定事件降序排列。

    可监听事件

    access

    文件读取

    modify

    文件更改。

    attrib

    文件属性更改,如权限,时间戳等。

    close_write

    以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。

    close_nowrite

    以只读模式打开的文件被关闭。

    close

    文件被关闭,不管它是如何打开的。

    open

    文件打开。

    moved_to

    一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。

    moved_from

    一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。

    move

    包括moved_to和 moved_from

    move_self

    文件或目录被移除,之后不再监听此文件或目录。

    create

    文件或目录创建

    delete

    文件或目录删除

    delete_self

    文件或目录移除,之后不再监听此文件或目录

    unmount

    文件系统取消挂载,之后不再监听此文件系统。

  • 相关阅读:
    IntelliJ IDEA 16创建Web项目
    Error running Tomcat8: Address localhost:1099 is already in use 错误解决
    Hibernate的三种状态
    Hibernate 脏检查和刷新缓存机制
    Windows服务器时间不同步问题
    解决Windows内存问题的两个小工具RamMap和VMMap
    实现多线程异步自动上传本地文件到 Amazon S3
    JS判断用户连续输入
    ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤
    bootstrap的popover在trigger设置为hover时不隐藏popover
  • 原文地址:https://www.cnblogs.com/fatt/p/4517519.html
Copyright © 2011-2022 走看看