使用lsyncd来完成实时同步


实际上 Lsyncd 就是对 inotifyrsync 工具的一个二次封装,只是简化使用操作而已!

使用lsyncd来完成实时同步


1. 工具简介

使用我能够帮你干一些什么事情呢?

  • [1] 功能和特性

最开始我们先介绍一下该工具的功能和特性,对以后使用做一个基础说明。Lsyncd 工具 使用文件系统事件接口 inotifyfsevents 来监视对本地文件和目录的更改,在很短的时间内 Lsyncd 将这些事件整理,然后生成一个或多个进程以将更改的内容同步到远程文件系统中,默认的同步方法是使用 rsync 工具。Lsyncd 对于将数据从安全区域同步到不太安全的区域特别有用。

Lsyncd 是一种轻量级的实时镜像解决方案,其安装相对容易,且不需要新的文件系统或块设备的支持。同时,Lysncd 同步的时候还不会妨碍本地文件系统的运转。

作为 rsync 的替代方案,Lsyncd 还可以通过 rsync+ssh 方式推送文件。当文件或目录重命名或移动到本地树中的新位置时,rsync+ssh 可以更加高效的同步。相反,使用 rsync 则通过删除旧文件然后重新传输整个文件来执行移动。

可以通过配置文件实现细粒度的自定义。自定义操作配置甚至可以从头开始编写,从 shell 脚本到用 Lua 语言编写的代码。因此,简单,强大和灵活的配置是可能的。需要注意的是,在 Lsyncd2.2 的版本中要求同步双方的主机上的 rsync 版本不低于 3.1 方可正常使用。

  • [2] 替代的方案

当然,同步工具很有很多种,且功能和适用性上都各有不同。如果要同步数据库,我们可以选择 DRBD 工具,因为它在块设备级别上运行且非常适合用于同步负载较重的系统。而 Mirror 工具 是一种异步同步的工具,它像 Lsyncd 一样使用 inotify 作为事件通知。但是,其主要区别在于是专门为 master-master 的使用方式而开发的,因此在两个系统上运行守护进程,使用自己的传输层而不是 rsync 工具。

  • [3] 获取并编译
# 官方仓库地址
$ git clone https://github.com/axkibe/lsyncd.git

# 系统需求需要
Lua >= 5.2
cmake >= 2.8
rsync >= 3.1

# 编译方式
$ cmake .
$ make
$ sudo make install

2. 使用方式

你应该怎么使用我来完成工作呢?

  • [1] 在测试时使用
# 在测试配置时使用-nodaemon选项,Lsyncd将不会作为为守护程序运行
# 所有日志消息都是打印在控制台(stdout和stderr)的已配置日志记录工具
# 这里的CONFIGFILE参数表示Lsyncd工具的配置文件路径,需使用绝对路径
$ lsyncd -nodaemon CONFIGFILE

# 将会记录又有的同步信息,输出内容会变得很多
$ lsyncd -log all CONFIGFILE

# 将只记录Lsyncd生成的所有进程的命令
$ lsyncd -log Exec CONFIGFILE
  • [2] 本地文件之间的同步
# 使用rsync工具同步
$ lsyncd -rsync /home/USER/src /home/USER/dst
  • [3] 本地文件同步到远程 - rsync
# 使用rsync工具同步
# 同步本地的home目录到远程主机的share目录中去
$ lsyncd -rsync /home remotehost::share/
  • [4] 本地文件同步到远程 - ssh
# 使用ssh工具同步
# 是要注意使用ssh的方式需要和rsync有区别
# REMOTEHOST => 本地源目录
# TARGETDIR  => 远程主机和目标目录
$ lsyncd -rsyncssh /home REMOTEHOST TARGETDIR
$ lsyncd -rsyncssh /home remotehost.org backup-home/
  • [5] 可以同时同步多个文件路径
# 多个目录同步
$ lsyncd -rsync /home/USER/src remotehost1:dst \
         -rsync /home/USER/src remotehost2:dst

3. 全局设置 - settings

如何更好地让我配合你的工作呢?

Lsyncd 的配置文件遵从 Lua 的语法格式,它的设计简单而有效,有非常多的配置选项。为了更改更好地满足不同用户的使用需求,可以在不同的层上完成 Lsyncd 的配置。较低的层增加了适应性,同时界面变得更具吸引力。

配置文件分为四个层级,越往下越底层,如需更加具体的操作可以向下配置,如自定义同步行为等方式。我们这里只介绍全局配置和默认配置,其他可以参见官方文档

  • [1] 全局设置
# 全局配置的参数应该很清楚,不需要解释了
settings {
    logfile    = "/tmp/lsyncd.log",
    statusFile = "/tmp/lsyncd.status",
    nodaemon   = true,
}
  • [2] 参数说明
参数名称 对应值 解释说明
logfile FILENAME 日志输出信息存储到此文件
pidfile FILENAME 程序运行的 PID 存储到此文件
nodaemon BOOL 将不会作为为守护程序运行
statusFile FILENAME 定期将状态报告写入此文件
statusInterval NUMBER 在多少秒过后将状态写入文件,默认为10s
logfacility STRING 日志类型,默认格式为user
logident STRING 日志标识,默认为lsyncd
insist BOOL 及时由于之前无法访问导致失败但启动时会继续运行
inotifyMode STRING 设置操作系统侦听的事件类型
maxProcesses NUMBER 指定同步产生的进程数量

注释:事件类型主要有Modify/CloseWrite/CloseWrite or Modify三种


4. 默认配置 - sync

如何更好地让我配合你的工作呢?

这一次就是使用 Lsyncd 工具主要需要个性化配置的文件,其中最基础的同步模式主要有三种,分别是 rsyncrsyncsshdirect

  • [1] default.rsync
# 第四层rsync配置的一个示例

sync{
    default.rsyncssh,
    source = "/var/www/live_site_resources",
    host = "192.168.129.90",
    targetdir = "/var/www/live_site_resources",
    delete = "running",
    delay = 15,
    exclude={ ".*", "*.tmp" },
    rsync = {
        binary = "/usr/local/bin/rsync",
        archive = true,
        compress = true,
        checksums = false,
        _extra = {"--bwlimit=50000"},
    }
}
  • [2] default.rsyncssh
# 第四层rsyncssh配置的一个示例

settings {
    logfile = "/var/log/lsyncd.log",
    statusFile = "/var/log/lsyncd-status.log",
    statusInterval = 20
}

sync {
   default.rsyncssh,
   source="/srcdir",
   host="remotehost",
   excludeFrom="/etc/lsyncd.exclude",
   targetdir="/dstdir",
   rsync = {
     archive = true,
     compress = false,
     whole_file = false
   },
   ssh = {
     port = 1234
   }
}
  • [3] default.direct
# 第四层direct配置的一个示例

sync {
    default.direct,
    source  = "/home/user/src/",
    target  = "/home/user/trg/"
}

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录