使用lsyncd来完成实时同步
实际上 Lsyncd 就是对 inotify 和 rsync 工具的一个二次封装,只是简化使用操作而已!
1. 工具简介
使用我能够帮你干一些什么事情呢?
- [1] 功能和特性
最开始我们先介绍一下该工具的功能和特性,对以后使用做一个基础说明。Lsyncd 工具 使用文件系统事件接口 inotify 或 fsevents 来监视对本地文件和目录的更改,在很短的时间内 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 工具主要需要个性化配置的文件,其中最基础的同步模式主要有三种,分别是 rsync、rsyncssh 和 direct。
- [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/" }