zoukankan      html  css  js  c++  java
  • Rsync + Lsyncd服务实现文件实时同步/备份

    1.接受端安装rsync

    1 yum -y install rsync

    2.配置同步模块

     1 vim /etc/rsyncd.conf
     2 
     3 # any name you like
     4 [backup]
     5 # destination directory for copy
     6 path = /data/backup
     7 # hosts you allow to access
     8 hosts allow = 192.168.88.88
     9 hosts deny = *
    10 list = true
    11 uid = root
    12 gid = root
    13 read only = false

    3.创建同步文件夹

    1 mkdir /data/backup

    4.启动服务并设置开机启动

    /etc/init.d/rsyncd start

    5.发送端配置安装rsync+lsyncd

    1 yum -y install rsync
    2 yum install lua lua-devel pkgconfig gcc asciidoc
    3 rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
    4 yum install lsyncd

    6.配置lsyncd

    cp /usr/share/doc/lsyncd-2.1.5/examples/lrsync.lua /etc/lsyncd.conf
    vi /etc/lsyncd.conf
    ----
    -- User configuration file for lsyncd.
    --
    -- Simple example for default rsync.
    --
    
    settings {
        logfile ="/var/log/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
    }
    sync {
        default.rsync,
        source="/usr/blues/",
        target="192.168.16.144::backup",
        rsync = {
         rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",
         binary = "/usr/bin/rsync",
         archive = true,
         compress = true,
         verbose = true
       }
    }

    lsyncd.conf配置选项说明

    settings

    里面是全局设置,--开头表示注释,下面是几个常用选项说明:

    • logfile 定义日志文件
    • stausFile 定义状态文件
    • nodaemon=true 表示不启用守护模式,默认
    • statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
    • inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是ModifyCloseWrite or Modify
    • maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
    • maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到

    sync

    里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:rsyncrsyncsshdirect三种模式:

    • default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
      default.direct :本地目录间同步,使用cprm等命令完成差异文件备份;
      default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证

    • source 同步的源目录,使用绝对路径。

    • target 定义目的地址.对应不同的模式有几种写法:
      /tmp/dest :本地目录同步,可用于directrsync模式
      172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsyncrsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步
      172.29.88.223::module :同步到远程服务器目录,用于rsync模式
      三种模式的示例会在后面给出。

    • init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true

    • delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)

    • excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST
      这里的排除规则写法与原生rsync有点不同,更为简单:
      • 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo
      • 如果规则以斜线/开头,则从头开始要匹配全部
      • 如果规则以/结尾,则要匹配监控路径的末尾
      • ?匹配任何字符,但不包括/
      • *匹配0或多个字符,但不包括/
      • **匹配0或多个字符,可以是/

    rsync

    (提示一下,deleteexclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)

    • bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
    • compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
    • perms 默认保留文件权限。
    • 其它rsync的选项

    其它还有rsyncssh模式独有的配置项,如hosttargetdirrsync_pathpassword_file,见后文示例。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。

    lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。

    lsyncd.conf其它模式示例

    以下配置本人都已经过验证可行,必须根据实际需要裁剪配置:

    1. settings {
    2. logfile = "/var/log/lsyncd/lsyncd.log",
    3. statusFile = "/var/log/lsyncd/lsyncd.status",
    4.  inotifyMode = "CloseWrite",
    5.  maxProcesses = 8,
    6. }
    7. -- I. 本地目录同步,directcp/rm/mv 适用:500+万文件,变动不大
    8. sync {
    9.  default.direct,
    10.  source = "/tmp/src",
    11.  target = "/tmp/dest",
    12.  delay = 1
    13.  maxProcesses = 1
    14. }
    15. -- II. 本地目录同步,rsync模式:rsync
    16. sync {
    17.  default.rsync,
    18.  source = "/tmp/src",
    19.  target = "/tmp/dest1",
    20.  excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    21.  rsync = {
    22.   binary = "/usr/bin/rsync",
    23.   archive = true,
    24.   compress = true,
    25.   bwlimit = 2000
    26.  }
    27. }
    28. -- III. 远程目录同步,rsync模式 + rsyncd daemon
    29. sync {
    30.  default.rsync,
    31.  source = "/tmp/src",
    32.  target = "syncuser@172.29.88.223::module1",
    33.  delete="running",
    34.  exclude = { ".*", ".tmp" },
    35.  delay = 30,
    36.  init = false,
    37. rsync = {
    38.  binary = "/usr/bin/rsync",
    39.  archive = true,
    40.  compress = true,
    41.  verbose = true,
    42.  password_file = "/etc/rsyncd.d/rsync.pwd",
    43.  _extra = {"--bwlimit=200"}
    44. }
    45. }
    46. -- IV. 远程目录同步,rsync模式 + ssh shell
    47. sync {
    48.  default.rsync,
    49.  source = "/tmp/src",
    50.  target = "172.29.88.223:/tmp/dest",
    51. -- target = "root@172.29.88.223:/remote/dest",
    52. -- 上面target,注意如果是普通用户,必须拥有写权限
    53.  maxDelays = 5,
    54.  delay = 30,
    55. -- init = true,
    56. rsync = {
    57.  binary = "/usr/bin/rsync",
    58.  archive = true,
    59.  compress = true,
    60.  bwlimit = 2000
    61. -- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
    62. -- 如果要指定其它端口,请用上面的rsh
    63. }
    64. }
    65. -- V. 远程目录同步,rsync模式 + rsyncssh,效果与上面相同
    66. sync {
    67.  default.rsyncssh,
    68.  source = "/tmp/src2",
    69.  host = "172.29.88.223",
    70.  targetdir = "/remote/dir",
    71.  excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    72. -- maxDelays = 5,
    73.  delay = 0,
    74. -- init = false,
    75. rsync = {
    76.  binary = "/usr/bin/rsync",
    77.  archive = true,
    78.  compress = true,
    79.  verbose = true,
    80.  _extra = {"--bwlimit=2000"},
    81. },
    82. ssh = {
    83. port = 1234
    84. }
    85. }

    上面的内容几乎涵盖了所有同步的模式,其中第III个要求像rsync一样配置rsyncd服务端,见本文开头。第IVV配置ssh方式同步,达到的效果相同,但实际同步时你会发现每次同步都会提示输入ssh的密码,可以通过以下方法解决:

    在远端被同步的服务器上开启ssh无密码登录,请注意用户身份:

    1. user$ ssh-keygen -t rsa
    2. ...一路回车...
    3. user$ cd ~/.ssh
    4. user$ cat id_rsa.pub >> authorized_keys

    id_rsa私钥拷贝到执行lsyncd的机器上

    1. user$ chmod 600 ~/.ssh/id_rsa
    2. 测试能否无密码登录
    3. user$ ssh user@172.29.88.223

    配置lsyncd日志文件轮转,防止日志文件太大

    修改/etc/logrotate.d/lsyncd配置文件

    /var/log/lsyncd/*log { 
        missingok 
        notifempty 
        sharedscripts 
        postrotate 
            /etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true 
        endscript 
    }

    7.启动服务并设置开机启动

    /etc/init.d/lsyncd start

    8.错误处理

      配置过程中遇到的错误与查看日志

      以下错误是在服务正常开启的情况下发生的,请先查看服务是否正常启动。

      1. rsync: failed to set times on "." (in backup): Permission denied (13)

        更新.文件的时间失败:原因是权限不够。

        此处为selinux权限限制,临时更改为setenforce 0,永久更改为修改/etc/sysconfig/selinux, 将 SELINUX=enforcing 修改为 SELINUX=diabled 或者 SELINUX=permissive

      2. rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)

        文件夹权限问题

        查看同步的目录权限是否为755

      3. time out

        可能因为客户端或者服务端的防火墙开启 导致无法通信,可以设置规则放行 rsync(873端口) 或者直接关闭防火墙。

      4.查看日志信息

    tail -10 /var/log/lsyncd.log

      如返回: Normal: Finished a list after exitcode: 0   表示同步正常。

    o(=•ェ•=)m纸上得来终觉浅,绝知此事要躬行o(=•ェ•=)m
  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/occl/p/9722826.html
Copyright © 2011-2022 走看看