操作系统 / 系统运维

Linux文件实时同步lsyncd

浅时光 · 2月28日 · 2020年 8240次已读

一、软件介绍

文章来源(Source):https://www.dqzboy.com

lsyncd 是一个支持实时、双向、多机器的多模式文件同步工具。

使用 Lua 语言封装了 inotify 文章来源(Source):https://www.dqzboy.com和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。

完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。配置方式很简单

项目地址:https://github.com/axkibe/lsyncd/releases

二、环境描述


Hostname Server IP Program
Web01 192.168.66.50 Lsyncd(源端)
Web02 192.168.66.51 Rsync(源端,目标端)

1、关闭SELINUX

文章来源(Source):https://www.dqzboy.com
  • web01和web02都要关闭
[[email protected] ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
[[email protected] ~]# setenforce 0
文章来源(Source):https://www.dqzboy.com

2、放通端口

  • Rsync默认端口873
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[[email protected] ~]# firewall-cmd --reload
success

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[[email protected] ~]# firewall-cmd --reload
success

三、操作流程


1、安装依赖

  • 在源端与目标端都安装Rsync
  • 源端安装lsyncd所需的依赖程序
[[email protected] ~]# yum -y install vim lrzsz wget git rsync gcc make lsof gcc-c++ lua lua-devel cmake3 asciidoc
# 目标端安装Rsync
[[email protected] ~]# yum -y install rsync

2、源端安装

2.1:YUM方式安装

  • 默认系统源中没有lsyncd,但是epel源中已经收录了lsyncd,版本为2.2.2;最新是2.2.3,已经是2018年发布的版本,后面没有新版本
  • YUM安装后lsyncd的配置文件在/etc/ls文章来源(Source):https://www.dqzboy.comyncd.conf
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum install lsyncd

2.2:源码方式安文章来源(Source):https://www.dqzboy.com

2.2.1:进入目录

[[email protected] ~]# cd /usr/local
[[email protected] local]# git clone https://github.com/axkibe/lsyncd.git
[[email protected] local]# cd lsyncd
[[email protected] local]# mkdir build
[[email protected] local]# cd build

2.2.2:配置生成Makefile

[[email protected] build]# cmake3 ../
Linux文件实时同步lsyncd-浅时光博客
文章来源(Source):https://www.dqzboy.com

2.2.3:编译和安文章来源(Source):https://www.dqzboy.com

[[email protected] build]# make
Linux文件实时同步lsyncd-浅时光博客
[[email protected] build]# make install
Linux文件实时同步lsyncd-浅时光博客

2.2.4:查看版本

[[email protected] build]# lsyncd -version
Version: 2.2.3

2.3:源码安装问题总结

  • 如果文章来源(Source):https://www.dqzboy.com是手动下载的源码安装,会出现类似如下错误,是版本问题,在最新的代码中已修复,建议使用git下载最新代码编译。
Linux文件实时同步lsyncd-浅时光博客

3、配置详解

-- 由于该配置文件实际上是lua语言的语法,所以写注释要用--,--是lua语言的注释符号
-- Lsyncd本身的配置
settings {
    -- 指定日志文件位置
    logfile = "/usr/local/lsyncd/lsyncd.log ",

    -- 指定状态文件位置
    statusFile = "/usr/local/lsyncd/lsyncd.status",

    -- inotify事件模式,什么事件才同步,CloseWrite表示文件关闭的时候同步(创建文件,修改文件后保存都会触发CloseWrite事件)
    inotifyMode = "CloseWrite",

    -- 最大同步进程数(default.rsyncssh模式,则必须设置为1,这就是rsyncssh模式的缺点了,如果是default.rsync模式则可以设置大于1,这样会有多个同步进程,速度更快)
    maxProcesses = 8,
    -- maxProcesses = 1,

    -- 配合下面的delay选项使用,delay单位是秒,当delay时间到了,不管maxDelays设置多少,都会同步,同样,当maxDelays达到了设定值,不管是否到delay时间,都会同步,即两个选项有一个满足即会触发同步,为了实时同步,我们一般设置为1,表示即使只有一个文件改变也同步
    maxDelays = 1,

    -- 是否以后台的方式运行,注意它是nodaemon,所以是双重否定,如果填false,意思就是“不要不后台运行”(即后台运行),非后台运行一般用于调试,把rsync的verbose也设置为true,这样会把同步的细节输出到控制台,方便调试
    nodaemon = false,
}

---- 同步配置default.rsync模式(比如配置从哪同步到哪,要忽略哪些文件,多久同步一次等),可以有多个sync模块,每个模块用于设置一台目标机器
sync {
    -- 有default.rsync/default.direct/default.rsyncssh三种模式,我们默认都用default.rsync即可。
    default.rsync,

    -- 同步源目录(本机某个目录)
    source = "/var/www/html",

    -- 同步目标地址,不同同步模式有不同写法,由于绝大多数情况都采用rsync同步,所以这里写的是rsync的同步地址
    target = "[email protected]:/var/www/html ",

    -- 默认true,允许删除目录服务器中的某些文件(即删除“那些在源服务器中不存在的文件”),可选值有: true/false/startup/running,startup就是只在启动lsyncd服务的时候判断目标服务器中有哪些文件在源服务器中没有,然后把这些文件删除,但启动之后如果目标服务器又新增了文件,这些文件即使在源服务器不存在,也不会被删除;而running与startup正好相反,是在启动的时候不会删除,启动之后会删除,true=running+startup,false相当于running和startup都不做。
    -- delete = true,

    -- 哪些文件不同步(可用正则))
    exclude = {
        '.**',
        '.git/**',
        '*.bak',
        '*.tmp',
       'runtime/**',
       'cache/**'
    },

    -- 与上边的maxDelays配合,maxDelays是累计事件数(单位:个),delay是时间(单位:秒),这两个只要有一个符合条件就会同步一次,但为了确保实时同步,maxDelays我们一般设置为1,也就是只要有一个文件变化事件,就会同步一次,而delay是比较大的,默认是15。当然,假如我们把maxDelays设置为100,那可能15秒到了也没有达到100个文件变化,但由于到达时间了,它也会同步。
    delay = 15,

    -- 当init = false时只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步,如果为true,则启动后如果源目录与目标目录的文件有差异,就会同步,我们当然要设置为true,默认为true,所以这个设置可以不写,写在这里是为了解释它。
    -- init = true,

    -- rsync的配置(这是default.rsync模式,如果是default.rsyncssh模式,该模块的配置会有所不同)
    rsync = {
        -- rsync可执行文件的绝对路径
        binary = "/usr/bin/rsync",

        -- 密码文件路径(default.rsyncssh模式不需要该项)
        password_file = "/etc/rsyncd.password",

        -- 打包后再同步(注意,打包不等于压缩,打包即可以压缩也可以不压缩)
        archive = true,

        -- 压缩后再同步
        compress = false,

        -- 输出同步信息(由于是后台执行,所以没必要输出,如果非后台执行可以设置为true,非后台执行主要用于调试)
        verbose  = false,

        -- 由于rsync有非常多的选项(请自己rsync --help查看),部分非主要选项可以用_extra的方式指定,双引号引住,逗号分隔(bwlimit中的bw是bandwith,即带宽,整个意思是带宽限制,omit-link-times忽略符号链接的修改时间)
        _extra = {"--bwlimit=200", "--omit-link-times"}
    }
}

4、配置程序

  • 下面配置实在源码安装的方式下进行配置的
[[email protected] ~]# cd /usr/local/lsyncd/
[[email protected] lsyncd]# mkdir etc
[[email protected] lsyncd]# vim etc/lsyncd.conf
settings {
    logfile      ="/usr/local/lsyncd/lsyncd.log",
    statusFile   ="/usr/local/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 8,
    -- nodaemon = false,
}

-- 远程目录同步,rsync模式 + ssh shell
sync {
    default.rsync,
    -- 同步源目录(本机某个目录,必须保证该文件或目录在源服务器上存在,不然启动会报错)
    source    = "/var/www",
    -- 同步目标地址和目标目录,注意target如果是普通需要有写权限,以上是将源服务器上/var/www目录和该目录下的所有文件同步到目标服务器的/var/目录下
    target    = "[email protected]:/var/",
    -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    maxDelays = 1,
    delay = 15,
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true
        }
}

5、配置免密

  • 源端与目标端实现免密登入;源端生成秘钥对,将公钥发给目标端
[[email protected] ~]# ssh-keygen -t rsa
[[email protected] ~]# ssh-copy-id [email protected]
[[email protected] ~]# ssh [email protected]
Last login: Wed Feb 26 22:30:10 2020 from 192.168.66.1
[[email protected] ~]# exit
登出
Connection to 192.168.66.51 closed.

6、系统管理

  • 只在安装了lsyncd服务的机器上配置
[[email protected] ~]# vim /etc/sysconfig/lsyncd
LSYNCD_OPTIONS= "/usr/local/lsyncd/etc/lsyncd.conf"

[[email protected] ~]# vim /usr/lib/systemd/system/lsyncd.service
[Unit]
Description=Live Syncing (Mirror) Daemon
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/lsyncd
ExecStart=/usr/local/lsyncd/build/lsyncd -nodaemon $LSYNCD_OPTIONS

[Install]
WantedBy=multi-user.target

7、启动程序

  • 如果上面的操作都配置好后,那么现在就可以启动服务了
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl start lsyncd
[[email protected] ~]# systemctl status lsyncd
  • 未加入systemd管理使用以下方式启动
文章来源(Source):https://www.dqzboy.com
[[email protected] ~]# lsyncd -log Exec /usr/local/lsyncd/etc/lsyncd.conf
00:11:01 Normal: --- Startup, daemonizing ---
[[email protected] ~]# ps -ef|grep lsyncd
  • 最后到目标端查看结果
Linux文件实时同步lsyncd-浅时光博客
0 条回应
    本站已安全运行: | 耗时 0.412 秒 | 查询 110 次 | 内存 18.78 MB