zoukankan      html  css  js  c++  java
  • RSync 文件备份同步

    什么是rsync?
    它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。
     
    rsync 包括如下的一些特性:
    1.可以镜像保存整个目录树和文件系统
    2.容易做到保存原有的权限,owner,group,时间(修改时间,modify time),软硬链接
    3.传输效率高,使用同步算法,只比较变化的
    4.支持匿名传输,方便网站镜像
     
    rsync的安装:
    # yum install rsync -y
     
    配置文件:
    rsync的主要有以下三个配置文件,后面两个文件默认不存在,需手动创建它。
    1.rsyncd.conf(主配置文件)
    2.rsyncd.secrets(密码文件)
    3.rsyncd.motd(rysnc服务器信息)
     
    rsync 常用选项:
    -v         冗长模式(显示过程)
    -a         归档模式,递归的方式传输文件(-a = -rlptgoD)
         -r     递归
         -l     保留软链接
         -p     权限
         -t     文件修改时间
         -g     属组,保留特殊设备文件
         -o     属主
         -D     等于--devices  --specials    表示支持b,c,s,p类型的文件
    -R     保留相对路径
    -H  保留硬链接
    -A  保留acl权限
    --delete     监控文件的删除
     
     
    rsync命令的普通用法:
    rsync -av /home/ /backup                         --把/home目录下的内容同步到/backup目录下(包括隐藏文件)
    rsync -av /home/ 192.168.1.10:/backup          --把本地的/home目录内容,同步到远端10的/backup目录下
    rsync -av 192.168.1.20:/backup/ /backup/     --把远端20的/backup目录下的内容同步到本地的/backup目录
    (注意:路径写法的区别!源目录后面加不加/也影响你的同步目录;没加/,就是将目录本身同步过去;目录加/,就是将目录里的内容同步过去!)
     
    最简单的目录同步方法:
    如果远程主机的目录中有一个文件被删除了,可使用命令将本机目录中内容进行同步!
    # rsync  -aHAXv --delete /test/ /test2/
     
     

    服务器端的配置:

    第一步:
    # iptables -F                                --关闭防火墙
     
    # vim /etc/rsyncd.conf
     
    motd file=/etc/rsyncd.welcome          --定义欢迎页面文件(不一定要)
    [test]                                        --参数组名称
    path=/test                                   --指定同步目录路径
     
    # vim /etc/rsyncd.welcome          --自定义欢迎信息
    *******************************************
    ****** ^_^ Welcome to use rsync!^_^ ******
    *******************************************
     
     
    第二步:
    # systemctl restart rsyncd     --启动rsync
     
    # netstat -ntlup |grep 873               --服务端就会有873的端口在监听了
    tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      15674/rsync        
    tcp6       0      0 :::873                  :::*                    LISTEN      15674/rsync
     
    第四步:
    # mkdir /test
    # touch /test/{1..5}.txt          --创建测试文件
     
     

    客户端的操作:

    # rsync -v 192.168.1.10::          --查看10这个服务器同步路径名
    *******************************************
    ****** ^_^ Welcome to use rsync!^_^ ******
    *******************************************     --这就是你rsyncd.welcome里写的欢迎内容
     
    test                                --这个就是同步路径名                     
     
     
    # rsync -a 192.168.1.10::test /back/
    --这样同步,是不需要密码的;注意notes为共享路径名称,语法上在该名称前面有两个“:”!
     
    没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file来做验证的用户
    (secrets file = /etc/rsyncd/rsyncd.secrets)
     
    ******************************
    如果同步报permission denied这种错误,可能是服务端selinux没有关闭
    # vim /etc/selinux/config
    SELINUX=disabled          --找到这行,将后面的值改为disabled即可
     
    # setenforce 0               --临时关闭selinux,否则将要重启系统才能生效
     
    # iptables -F               --清空防火墙规则
    ******************************
     
    在上面的基础上加上一些更强大的功能
     
    要求:
    1. 把日志记录到/var/log/rsyncd.log
         --4种方式,xinetd:log_type(SYSLOG/FILE) rsyncd:log file和syslog facility
    2. 共享模块要求隐藏(也就是说客户端查看不到这个模块名(test))
         --list
    3. 同时只能1个客户端连接进行同步这个module(test)
         --2种方式,xinetd:instances rsyncd:max connections
    4. 只能允许192.168.1.107(ip你自定义)同步这个module
         --2种方式,xinetd:only_from rsyncd:hosts allow
    5. 只能早上9点到下午5点同步
         --xinetd:access_times
     
    # vim /etc/rsyncd.conf
    motd file=/etc/rsyncd.welcome
     
    [test]                                             --参数组名称
    path=/var/www/html                              --设置rsync同步文件路径
    list=false                                        --隐藏共享模块名称(test)
    max connections=1                              --设置同一时间内最大的链接数
    log file=/var/log/rsyncd.log               --设置指定的日志文件路径
    hosts allow=192.168.1.107 192.168.1.109 --设置限定的ip或网段192.168.1.0/24
     
    ----------------------------------------------------------------
     
     
    实时同步
    实现实时同步(也就是源目录中的内容发生变化,它就会触发同步,实现两边目录中内容完全相同)
    inotify + rsync
     
    软件名称:
    inotify-tools-3.13.tar.gz
    软件下载路径:(直接输入以下命令)
    # wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
     
    # yum install -y gcc gcc gcc-c++
    # tar xf inotify-tools-3.13.tar.gz -C /usr/src/
    # cd /usr/src/inotify-tools-3.13/
    # ./configure
    # make
    # make install
     
    --安装完后,就会产生下面两个命令
    /usr/local/bin/inotifywait
    /usr/local/bin/inotifywatch
     
     
    # inotifywait --help    
    inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory
    --如果报错,找不到那个库,但这个库实际上是在/usr/local/lib下的,所以解决方法,把/usr/local/lib/加到ldconfig里
     
     
    常用命令选项:
    -m   --monitor                         --监控
    -r   --recursive                    --递归监控,目录和子目录都监控
    -q   --quiet                         --安静模式,尽可能少输出信息
    -e   --event                         --监控的事件,包含以下几类    
         modify     修改
         attrib     改变
         delete     删除
         create     创建
         move      移动
     
    测试inotifywait命令:
    # inotifywait -mrq -e modify,delete,create,attrib,move /test
     
     
    做测试:
    测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test2目录
     
    --使用下面的脚本来做
     
     
    # vim /tmp/1.sh
     
    #!/bin/bash
    inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read files
    do
         rsync -a --delete /test/ /test2/
    done
     
     
    输入以下命令,执行上面写的脚本!
    # nohup sh /tmp/1.sh &
     
     
    再然后对/test进行各种操作,验证可以实时同步到/test2
     
    --实现双向的实时同步
    也有相关的软件(比如unison)可以专门来做双向的实时同步
    但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现
    # vim /tmp/2.sh
    #!/bin/bash
    inotifywait -mrq  -e modify,delete,create,attrib,move /test2 |while read files
    do
         rsync -a --delete /test2/ /test/
    done

    使用rsync实现远程实时同步

    远程被同步端     本地同步端
    192.168.1.107     192.168.1.109
    我要实现把192.168.1.109上的/localtest/目录里的内容实时同步到192.168.1.107的/remotetest/目录
      
    实现过程
    第一大步:在远程被同步端192.168.1.107上操作
    # iptables -F
    # setenforce 0
     
    # mkdir /remotetest/     --创建测试的同步目录
    # yum install -y rsync      --安装rsync
     
    # rsync --version               查看版本是否一致
     
    # vim /etc/rsyncd.conf
    uid=root         
    gid=root          --这里指定使用root身份同步,否则默认使用nobody用户(这样你需要把/remotetest/目录改成757的权限,才有权限写)
     
    [testsource]
    path=/remotetest/
    ignore errors
    read only=no          --是否只读
    auth users=abc          --验证的用户名为abc
    secrets file=/etc/rsyncd.secrets     --验证用户abc的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用这种方式来进行验证,而不需要远程的ssh密码验证了)
    hosts allow=192.168.1.109          --进一步加强安全,只允许192.168.1.109同步
     
    # vim /etc/rsyncd.secrets          --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试)
    abc:321
     
    # chmod 600 /etc/rsyncd.secrets     --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限)
     
    # systemctl restart rsyncd          --重启rsyncd服务
     
     
     
    第二大步:在本地同步端192.168.1.109上操作
    先安装inotify软件,步骤参照上面过程,这里省略
     
    # yum install -y rsync
     
    # rsync --version               查看版本是否一致
     
    # mkdir /localtest/     --创建测试的同步目录
    # vim /etc/rsyncd.secrets     --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定
    321
    # chmod 600 /etc/rsyncd.secrets  --也改成600的权限
     
    # vim /tmp/rsync.sh               --脚本及其内容
     
    #!/bin/bash
    inotifywait -mrq  -e modify,delete,create,attrib,move /localtest |while read files
    do
         rsync -a --delete  --password-file=/etc/rsyncd.secrets /localtest/ abc@192.168.1.107::testsource
    done
     
    # chmod 755 /tmp/rsync.sh   --给执行权限,方便执行
     
    # nohup sh /tmp/rsync.sh &   --后面挂起执行
     
    如果搭建完成后无法同步,可以在本地同步端查看当前目录下的nohup.out文件,如果文件是空的,则说明没问题,如果有问题,系统会将报错信息写入该文件!
    # cat nohup.out
     
    # vim /etc/rc.local          --加到rc.local里让其开机自动启动同步
    nohup sh /root/rsync.sh &
     
    第三步:测试
    在192.168.1.109的/localtest目录中进行任何的操作,然后去192.168.1.107的/remotetest目录中查看是否成功同步!
  • 相关阅读:
    output (Elements) – HTML 中文开发手册
    JavaSE IO类层次关系和Java IO流的用法总结
    PHP attributes() 函数
    math_errhandling (Numerics) – C 中文开发手册
    C while 循环
    HTML <a> hreflang 属性
    static_assert (Error handling) – C 中文开发手册
    C 嵌套 switch 语句
    HTML DOM Input Time name 属性
    Bootstrap 弹出框
  • 原文地址:https://www.cnblogs.com/lanchang/p/12815598.html
Copyright © 2011-2022 走看看