玩转企业常见应用与服务系列(六):数据同步服务 lsyncd 原理与实践

2023-11-20 16:02:24 浏览数 (2)

工具简介

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

功能和特性

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

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

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

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

替代的方案

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

获取并编译
代码语言:javascript复制
# 官方仓库地址
$ git clone https://github.com/axkibe/lsyncd.git

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

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

使用方式

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

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

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

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

全局设置 - settings

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

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

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

全局设置
代码语言:javascript复制
# 全局配置的参数应该很清楚,不需要解释了
settings {
    logfile    = "/tmp/lsyncd.log",
    statusFile = "/tmp/lsyncd.status",
    nodaemon   = true,
}
参数说明

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

默认配置 - sync

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

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

default.rsync
代码语言:javascript复制
# 第四层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"},
    }
}
default.rsyncssh
代码语言:javascript复制
# 第四层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
   }
}
default.direct
代码语言:javascript复制
# 第四层direct配置的一个示例

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

作者: Escape 链接: https://escapelife.site/posts/d5e421c4.html

0 人点赞