通过lsyncd 设置两个linux(centOS7在线,centos6.5离线)服务器之间的目录文件互相实时同步

注:本文分为两部分讲解 1:centos7在线安装 ;2:centos6.5离线安装

1. 通过lsyncd 设置两个linux(centOS7)服务器之间的目录文件互相实时同步

官网开源地址

https://github.com/axkibe/lsyncd

官网配置手册

https://axkibe.github.io/lsyncd/

注意:Lsyncd存在数据被替换风险,操作前请做好数据备份!

Lsyncd 是一个简单高效的文件同步工具,通过lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。

示例

我们最终目的是配置A和B服务器的/data/file/目录文件互相同步
(注意:按照以下步骤,只安装A服务器,则只单向的将A服务器的资源目录同步到指定B服务器目录下,不会相互同步。)

A服务器 ip:192.168.15.131 同步目录 /data/file/(此目录需要提前创建)
B服务器 ip:192.168.15.134 同步目录 /data/file/

  1. 安装lsyncd
    1.1. 安装epel仓库

    CentOS 7内置的源并没有包括Lsyncd,可以自行编译安装Lsyncd,不过更简单的办法是先安装epel源,就可以直接yum安装了,以下命令再A服务器执行。

    yum -y install epel-release
    

    1.2. 安装lsyncd
    安装依赖(主要是lua和lua-devel,其他的可以先不安装,有需要在安装)

    yum -y install lua lua-devel
    yum -y install pkgconfig gcc asciidoc
    

    安装lsyncd,lsyncd基于rsync,安装lsyncd时会自动安装rsync

    yum -y install lsyncd
    

    查看lsyncd版本

    lsyncd --version
    
  2. 修改lsyncd配置文件

    将A和B服务器的/etc/lsyncd.conf分别修改为如下(建议直接下载下来修改后再上传,而不是vim):

    先看一下改之前的原文件,如下:

    ----
    -- User configuration file for lsyncd.
    --
    -- Simple example for default rsync, but executing moves through on the target.
    --
    -- For more examples, see /usr/share/doc/lsyncd*/examples/
    -- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}
     
    
    

    修改后如下

    A服务器配置文件/etc/lsyncd.conf的内容

    ----
    -- User configuration file for lsyncd.
    --
    -- Simple example for default rsync, but executing moves through on the target.
    --
    -- For more examples, see /usr/share/doc/lsyncd*/examples/
    -- 需要手动建立文件夹  /var/www/html
    -- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}
     
     
    settings {
        logfile      = "/var/log/lsyncd/lsyncd.log",
        statusFile   = "/var/log/lsyncd/lsyncd.status",
        inotifyMode  = "CloseWrite",
        nodaemon     = false,
        insist       = true,
        maxProcesses = 6,
        maxDelays    = 50000,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
        statusInterval = 5,
    }
     
    sync {
        default.rsync,
        source = "/data/file/",--本地需要同步的文件目录
        target = "root@192.168.15.134:/data/file/",--同步到目标linux服务器下文件目录
        delay  = 30,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
        -- excludeFrom = "/data/file/cache/",
        exclude = { ".*", ".tmp" },
        rsync = {
            binary = "/usr/bin/rsync",
            archive = true,
            compress = false,
            verbose = true,
        }  
    }
    

    B服务器配置文件/etc/lsyncd.conf的内容

    ----
    -- User configuration file for lsyncd.
    --
    -- Simple example for default rsync, but executing moves through on the target.
    --
    -- For more examples, see /usr/share/doc/lsyncd*/examples/
    -- 需要手动建立文件夹  /var/www/html
    -- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}
     
     
    settings {
        logfile      = "/var/log/lsyncd/lsyncd.log",
        statusFile   = "/var/log/lsyncd/lsyncd.status",
        inotifyMode  = "CloseWrite",
        nodaemon     = false,
        insist       = true,
        maxProcesses = 6,
        maxDelays    = 50000,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
        statusInterval = 5,
    }
     
    sync {
        default.rsync,
        source = "/data/cnic/",
        target = "root@192.168.15.131:/data/file/",
        delay  = 30,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
        -- excludeFrom = "/data/file/cache/",
        exclude = { ".*", ".tmp" },
        rsync = {
            binary = "/usr/bin/rsync",
            archive = true,
            compress = false,
            verbose = true,
        }  
    }
    

    lsyncd 配置说明

    • settings 部分 关于lsyncd工具自身的一些选项设置

      –: 注释, 因为是lua 语言,所以 --是注释
      logfile : 指定lsyncd工具本身运行所产生的日志文件存放位置
      statusFile : 定义lsyncd监控目录状态文件的存放位置
      statusInterval : 隔多少秒记录一次被监控目录的状态,默认好像是10秒
      nodaemon=true : 默认是不启用守护模式的
      inotifyMode : 指定要监控的事件,如,CloseWrite,Modify,CloseWrite or Modify, 默认是CloseWrite

      insist:继续运行,即使有失败的目标。
      maxProcesses : 指定同步时进程的最大个数
      maxDelays : 当事件被命中累计多少次后才进行一次同步

    • sync 部分 主要用来定义同步时的一些设置,可以同时同步多个目录,只需要在该代码块中事先定义好多个sync即可

      default.rsync : 指定lsyncd运行模式,另外,还有>default.direct,default.rsyncssh模式
      source : 指定要监控的目录,务必全部用绝对路径
      target : 要同步到的目标目录,一般为rsync服务端模块下指定的目录,说明: ‘rsyncuser@192.168.10.20::bak’ , ‘rsyncuser’:同步的用户在备服务器上设置 ,‘192.168.10.20’:备服务器地址, ‘::backup’:模块名称,同步路径在备服务器上设置
      init : 为false时表示只同步lsyncd进程启动以后发生改动事件的文件,否则,反之,默认为true
      delay : 当有命中的事件后多少秒后触发同步
      exclude : 通过此选项排除掉不需要同步的文件,可用它自己的正则进行匹配
      delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。
      delete = true 默认。 Lsyncd将在目标上删除不在源代码中的任何东西。在启动时以及在正常操作过程中被删除的内容
      delete = false Lsyncd不会删除目标上的任何文件。不在启动或正常运行。 (虽然可以覆盖)
      delete = ‘startup’ Lsyncd将在启动时删除目标上的文件,但不会进行正常操作。
      delete = ‘running’ Lsyncd在启动时不会删除目标上的文件,但会删除那些在正常操作期间被删除的文件

  3. 设置A/B两服务器相互免密登录

    ssh-keygen -t rsa.
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.61.56

    上面命令执行后就将本地机器/root/.ssh/id_rsa.pub文件里的公钥安装到远程机器/root/.ssh/authorized_keys文件里面了,完成了

  4. 启动lsyncd(A、B服务器都启动完成可以互相同步了,启动一个可以单向同步)

    启动

    systemctl start lsyncd
    

    启动后出现如下提示,目标机器需要安装 :rsync
    在这里插入图片描述

    停止

    systemctl stop lsyncd
    

    重启

    systemctl restart lsyncd
    

    查看状态

    systemctl status lsyncd
    

    查看日志

    tail -f /var/log/lsyncd/lsyncd.log
    
  5. 设置开机自启动

    在开机时启用一个服务:

    systemctl enable lsyncd
    

    在开机时禁用一个服务:

    systemctl disable lsyncd
    

    查看服务是否开机启动:

    systemctl is-enabled lsyncd
    

开机启动参考文章 https://blog.csdn.net/lishuoboy/article/details/89676041

  1. 验证开机自启动成功

    重启

    reboot
    

    通过查看日志验证

    tail -f /var/log/lsyncd/lsyncd.log
    

    通过查看进程验证

    ps -ef|grep lsyncd
    

    传个文件验证一下 :直接通过ftp上传文件到同步目录等待30秒查看目标linux目录是否存在刚刚上传的文件

  2. 防火墙调整、调整SELinux安全策略
    这一步也可以放到最后,如果同步不成功,再看是不是防火墙或者SELinux的问题

    1. 关闭防火墙

       systemctl stop firewalld
      
    2. 查看防火墙状态

       systemctl status firewalld
      

      你也可以不关闭防火墙,而是添加例外端口。防火墙的命令参考https://blog.csdn.net/lishuoboy/article/details/88301273

    3. 将SELinux策略改为警告
      SELinux知识参考:https://blog.51cto.com/13570193/2093299

      先临时改了

       setenforce 0
       ps:setenforce 0|1  分别代表permissive(放纵的)、enforcing(强制) 
      

      查看SELinux状态

       getenforce
      

      设置SELinux永久为permissive(放纵的)
      为防止服务器重启后SELinux模式改变,需要设置SELINUX=permissive永久生效。

       vim /etc/selinux/config
      

      重启后验证一下

       reboot
       getenforce
      

2. centos6.5离线安装lsyncd(单向同步):

  1. 下载必要的rpm包:

    lua-devel-5.1.4-4.1.el6.x86_64 提取码:72si
    rsync-3.0.6-12.el6.x86_64 提取码:o6p2 (源机器和目标机器都需要安装rsync;这里需要注意:centos6会自带rsync,centos7则无,如果是centos7离线情况下,不要忘记安装)
    lsyncd-2.1.5-0.el6.x86_64 提取码:6tpm

    rpm -ivh lua-devel-5.1.4-4.1.el6.x86_64
    rpm -ivh rsync-3.0.6-12.el6.x86_64 --nodeps --force   //--nodeps --force表示忽略依赖检查,强制安装
    rpm -ivh lsyncd-2.1.5-0.el6.x86_64
    

    查看版本

    lsyncd --version
    
  2. 将以下配置添加到/etc/lsyncd.conf 中 ,更改source 源,target 目标,rsh 端口

    lsyncd配置说明

    	settings {
    		    logfile      = "/var/log/lsyncd/lsyncd.log",--生成日志文件目录
    		    statusFile   = "/var/log/lsyncd/lsyncd.status",
    		    inotifyMode  = "CloseWrite",
    		    nodaemon     = false,
    		    insist       = true,
    		    maxProcesses = 6,
    		    maxDelays    = 50000,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
    		    statusInterval = 5,
    	}
    		 
    	sync {
    	    default.rsync,
    	    source = "/data/cnic/",--源文件目录
    	    target = "root@192.168.174.139:/data/cnic/", --目标文件目录
    	    delay  = 30,  -- 不能设置很小,防止文件还没同步完就反向同步了,我设置很大值
    	    -- excludeFrom = "/data/cnic/cache/",
    	    exclude = { ".*", ".tmp" },
    	    delete = false, --此处默认为true 。(true:启动lsyncd时会把‘目标机器’ 与 ‘源机器’ 不一致的文件删除,来保持 ‘目标数据’ 与 ‘源数据’ 的相同;false:则关闭此行为,更详细解释请看此块代码上方的【lsyncd配置说明】)
    	    rsync = {
    	        binary = "/usr/bin/rsync",
    	        archive = true,
    	        compress = false,
    	        verbose = true,
    		rsh = "/usr/bin/ssh -p 2222 -o StrictHostKeyChecking=no" --指定连接端口
    	    }  
    	}
    
  3. ssh免登录

    在源文件服务器生成密钥(运行过程中需要点击三次回车enter,驱动继续执行):

     ssh-keygen -t rsa   
    

    将生成的公钥,发送到ssh免登录目标机,实现免密登录(运行时会出现询问yes/no 输入yes,之后需要输入远程目标服务器的密码):

     ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.61.56" //请将ip改为自己要同步到的目标服务器的ip
    

    相关命令:

     启动 systemctl start lsyncd   /service lsyncd start
     
     停止 systemctl stop lsyncd   /service lsyncd stop
     
     重启 systemctl restart lsyncd /service lsyncd restart
     
     查看状态 systemctl status lsyncd
     
     查看日志 tail -f /var/log/lsyncd/lsyncd.log 
    

附:

  1. 启动时出现如下图错误,需要关闭SELinux 的enforce模式 :
    2.

    查看SELinux 状态命令:

     getenforce
     输出:Enforcing 默认是开启状态 
    

    临时关闭enforce模式 :

     setenforce 0
    

    永久关闭:
    设置SELinux永久为permissive
    为防止服务器重启后SELinux模式改变,需要设置SELINUX=permissive永久生效。

     vim /etc/selinux/config
    

    重启后验证一下

     reboot
    

    刷新配置:

     getenforce
     输出:Permissive  即成功关闭
    
  2. 如果启动报有关GLIBC的错误

    首先查看系统glibc支持的版本(centos6.5默认最高支持GLIBC 2.13)

    strings /lib64/libc.so.6 |grep GLIBC_
    

    附:解决libc.so.6: version `GLIBC_2.14’ not found问题

  3. 启动后报如下图所示错误:
    在这里插入图片描述
    解决方案:解决启动时报terminating since out of inotify watches consider increasing错误问题

  4. 启动后出现如下错误,目标机器需要安装 :rsync
    在这里插入图片描述

  5. 启动报如下图错误:
    在这里插入图片描述
    使用 如下命令尝试ssh进入目标机器,如果需要输入目标机密码,则ssh免密配置有误,需要重复之前的ssh免密配置步骤。

    ssh root@192.168.174.139  (请将ip改为自己的目标机器ip)
    

create by lwj

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值