zoukankan      html  css  js  c++  java
  • 使用rsync进行主机间数据同步及其他工具

    • 开发目录与编译目录独立(也就是不能直接在samba映射的目录下开发);
    • 开发目录的变动同步到编译目录,而编译目录的变动不会同步带开发目录,即单向同步。

    rsync

      rsync,remote synchronize。顾名思意,它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好。
      
    rsync 包括如下的一些特性:

    • 能更新整个目录和树和文件系统;
    • 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
    • 对于安装来说,无任何特殊权限要求;
    • 对于多个文件来说,内部流水线减少文件等待的延时;
    • 能用rsh、ssh 或直接端口做为传输入端口;
    • 支持匿名rsync 同步文件,是理想的镜像工具;

    rsync安装与配置

    首先可以先看看你的系统中是否已经安装了rsync:

    $ rsync
    

    如果没有安装的话,可通过包管理器或者源码安装。

    $ yum install -y rsync

    安装完毕之后,就是软件的配置了。

    下面我们假设:

    • 主服务器端(master),向从服务器端(slave)同步数据;
    • master端IP地址:192.168.0.211(模块名为node1);
    • slave端IP地址:192.168.0.212 (模块名为node2)。

    master配置

    由于是单向同步,所以master不需要做特殊的配置,只要安装rsync就可以了。

    slave配置

    打开文件/etc/rsyncd.conf,配置如下:

    uid = root 
    gid = root 
    pid file = /var/run/rsyncd.pid  #pid文件的存放位置
    lock file = /var/run/rsync.lock #锁文件的存放位置
    log file = /var/log/rsyncd.log  #日志记录文件的存放
    
    [node2]                         #模块名字,自己命名
    path = /data/node2              #指定文件目录所在位置,这是必须指定
    read only = no
    list = no                       #是否把rsync服务器上提供同步数据的目录显示
    hosts allow = 192.168.0.211      #允许访问的主机
    hosts deny = *                  #拒绝访问的主

    这是比较简单的配置,如果需要认证,则需要指定rsync.passwd文件。

    测试

    启动rsync:

    $ mkdir -p /data/node2 
    $ rsync --daemon 
    $ ps -ef | grep rsync| grep -v "grep" 
    root      1723    1  0 22:17 ?        00:00:00 rsync --daemon 
    $ netstat -anpt | grep rsync 
    tcp        0      0 0.0.0.0:873                0.0.0.0:*                  LISTEN      1723/rsync          
    tcp        0      0 :::873                      :::*                        LISTEN      1723/rsync

    在slave上创建同步目录:

    $ cd /data/node2/ 
    $ echo "123456">a.txt 
    $ echo "abcd">b.txt  
    $ cat a.txt b.txt  
    123456 
    abcd 

    在master上创建同步目录,并将slave上的node2模块同步到/data/node1/目录下:

    $ mkdir -p /data/node1 
    $ rsync -avzP 192.168.0.212::node2 /data/node1/ 
    receiving incremental file list 
    ./ 
    a.txt 
              7 100%    6.84kB/s    0:00:00 (xfer#1, to-check=1/3) 
    b.txt 
              5 100%    0.12kB/s    0:00:00 (xfer#2, to-check=0/3) 
    
    sent 68 bytes  received 180 bytes  23.62 bytes/sec
    total size is 12  speedup is 0.05 
    $ cd /data/node1/ 
    $ ls 
    a.txt  b.txt 
    $ cat a.txt b.txt  
    12

    以上是将slave的node2模块对应的目录同步到master的目录下,如果要将master的目录同步到slave的node2模块对应的目录下,则使用以下命令:

    $ rsync -avzP /data/node1/ 192.168.1.212::node2

    以上完成后,我们就可以进行同步了,为了方便,我们可以把同步命令写成一个脚本。rsync有一些配置参数,可以直接输入命令rsync来查看。比如–delete选项表示,会同步删除的文件,比如源主机没有文件a,而目标主机有,则文件a将会从目标主机上删除。

    如果你不需要实时性,则可以在每次需要同步的时候,手动运行一下该脚本。

    如果你需要实时性,但不需要特别强,则可以使用 crontab 设置一个定时任务来自动同步。

    如果你需要很强的实时性,则需要inotify的支持。

    inotify

    使用inotify之后,只要文件有任何变动,就会触发inotify,因此inotify基本可以达到实时的效果。

    inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。

    inotify安装完成之后会有两个命令,inotifywait 和 inotifywatch。inotifywait用于等待文件或者文件集上的一个特定事件,可以监控任何文件或者目录位置,并且可以递归地监控整个目录树;inotifywatch 用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

    安装

    $ cd /tmp  
    $ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz --no-check-certificate  
    $ tar zxvf inotify-tools-3.14.tar.gz  
    $ cd inotify-tools-3.14  
    $ ./configure&&make&&make install  
    
    
    $ ln -sv /usr/local/lib/libinotify* /usr/lib/  
    $ ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0  

    以上安装的是linux版本的,如果你是windows系统,可以安装inotify-win(https://github.com/thekid/inotify-win)。

    编写测试脚本

    #!/bin/bash  
    
    src=/tmp/test/  # directory to monitor  
    /usr/local/bin/inotifywait -rmq -e modify $src |  while read  event  
    do  
    echo "hello" >> 1.txt  
    done  

    做成开机启动

    $ chmod u+x /tmp/mon.sh  
    $ echo "nohup /bin/bash /tmp/mon.sh &" >> /etc/rc.d/rc.local  
    $ nohup /bin/bash /tmp/mon.sh &  

    这时候只要/tmp/test/一有改动,就会触发inotifywait,运行echo命令。

    同步脚本

    #!/bin/bash 
    host=192.168.0.212 
    data_dir=/data/node1/
    dst=node2 
    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files 
    do
      #rsync -avzP $host::$dst $data_dir 
      rsync -avzP --delete --progress $data_dir $host::$dst 
      echo "${files} was rsynced" >> /tmp/rsync.log 2>&1  
    done

    以上让inotifywait监听/data/node1/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%T %w%f%e的格式输出。

    inotifywait的输出结果,作为 while read files的输入。这里的脚本比较粗糙,因为每次有文件改动,inotifywait就会输出一行,改行表示有改动的文件。之后执行do和done之间的操作,调用rsync进行同步(全目录扫描,而不是只同步单个文件)。因此如果有10个文件改动,rsync将会被调用10次,从而造成性能上的损耗。因此对于有兴趣的同学,可以想想如何优化这个脚本,以获得更高的同步性能。

    $ chmod u+x inotify_rsync.sh  
    $ bash inotify_rsync.sh & 
    [1] 4533 
    $ ps -ef | grep inoti | grep -v "grep" 
    root      4533  1880  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh 
    root      4534  4533  0 18:02 pts/1    00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e modify,delete,create,attrib /data/node1/
    root      4535  4533  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh1

    inotifywait 的一些参数可能根据系统有所不同,请通过inotifywait命令查阅下相关参数及其意义。

    总结

    rsync为我们提供了一个很好的文件同步方案,在不同的应用场景下,我们对实时性的要求不一,因此可以根据自己的需要选择对应的同步方式。在大多数情况下rsync+inotify是足够了的,当然,当同步的文件比较大的时候,可以选择lsyncd等更合适的方案。

  • 相关阅读:
    Spring配置文件中指定init-method属性的作用
    Spring中的InitializingBean接口
    java中的instanceof用法
    mybatis中useGeneratedKeys和keyProperty的作用
    (转载)springboot集成httpinvoker的客户端
    (转载)spring 之间的远程调用-Spring Http调用的实现
    (转载)maven profile多环境自动切换配置
    (转载)使用Maven构建多模块项目
    python3 之logging模块
    python3之编码
  • 原文地址:https://www.cnblogs.com/fungitive/p/9136193.html
Copyright © 2011-2022 走看看