网络文件共享(8)之使用lsyncd完成实时同步

网络文件共享(8)之使用lsyncd完成实时同步

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

介绍

Lsyncd 功能跟 Inotify 和 Sersync 相同,属于实时同步工具,但是 Lsyncd 功能更加强大,Lysncd 实际上是 lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。Lsyncd 最强大之处在于简单高效传输海量数据并且 Lsyncd 支持多种工作模式。

github 地址:https://github.com/axkibe/lsyncd

安装与配置

直接使用 yum 安装即可:

$ yum -y install lsyncd

它的配置文件为 /etc/lsyncd.conf,其结构与说明如下:

# 全局设置;
settings                
{
    # 定义日志文件;
    logfile       
    # 定义状态文件;          
    stausFile            
    # 默认不启用守护模式;   
    nodaemon=true           
    # 将 lsyncd 的状态写入上面的 statusFile 的间隔,默认 10 秒;
    statusInterval          
    # 指定 inotify 监控的事件,默认是 CloseWrite,还可以是 Modify 或 CloseWrite or Modify;
    inotifyMode             
    # 同步进程的最大个数。假如同时有 20 个文件需要同步,而 maxProcesses = 8,则最多能看到有 8 个 rysnc 进程;
    maxProcesses            
    # 累计到多少所监控的事件激活一次同步,即使后面的 delay 延迟时间还未到;
    maxDelays               
}
# 里面是定义同步参数,可以继续使用 maxDelays 来重写 settings 的全局变量。一般第一个参数指定 lsyncd 以什么模式运行:rsync、rsyncssh、direct 三种模式;
sync                                
{
    # 使用 rsync 完成同步,也可以达到使用 ssh 形式的远程 rsync 效果,或 daemon 方式连接远程 rsyncd 进程;
    default.rsync                 
    # 本地目录间同步,使用 cp、rm 等命令完成差异文件备份;      
    default.direct                   
    # 同步到远程主机目录,rsync 的 ssh 模式,需要使用 key 来认证;
    default.rsyncssh      

    # 监控的、同步的源目录,使用绝对路径;
    source                              
    # 定义目标地址,对应不同的模式有几种写法:
    target                  
        # 本地目录同步,可用于 direct 和 rsync 模式;
        /tmp/dest             
        # 同步到远程服务器目录,可用于 rsync 和 rsyncssh 模式;     
        172.29.88.223:/tmp/dest
        # 同步到开启 rsyncd 守护进程的远程服务器目录,用于 rsync 模式;
        172.29.88.223::module
    # 为了保持 target 与 source 完全同步,lsyncd 默认会 delete = true 来允许同步删除;
    delete                              
    # 这是一个优化选项,当 init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是 true;
    init                                
    # 等待 rsync 同步延时时间,默认 15 秒。也就是 15s 内监控目录下发生的改动,会累积到一次 rsync 同步,避免过于频繁的同步;
    delay                               
    # 排除选项,后面指定排除的列表文件,如 excludeFrom = "/etc/lsyncd.exclude" 如果是简单的排除,可以使用 exclude = LIST。这里的排除规则写法与原生 rsync 有点不同,更为简单;监控路径里的任何部分匹配到一个文本,都会被排除,例如 /bin/foo/bar 可以匹配规则 foo;
    excludeFrom                         
        # 如果规则以斜线 / 开头,则从头开始要匹配全部
        # 如果规则以 / 结尾,则要匹配监控路径的末尾
        # ? 匹配任何字符,但不包括 /
        # * 匹配 0 或多个字符,但不包括 /
        # ** 匹配 0 或多个字符,可以是 /
    rsync
    {
        # perms 默认保留文件权限。
        perms
        # 指定 rsync 二进制文件位置
        binary
        # 是否打包传输
        archive
        # 压缩传输默认为 true。在带宽与 cpu 负载之间权衡,本地目录同步可以考虑把它设为 false
        compress = true,
        # 输出过程信息
        verbose = true,
        # rsync 密码文件
        password_file = "/etc/rsync.passwd",
        # bwlimit 限速,单位 kb/s,与 rsync 相同
        _extra = {"--bwlimit=200"}
    }
}

当有多个需要监控的目录时可以配置多个 sync 块。

使用

下面我在 10.0.1.201 主机开启一个 rsyncd 守护进程服务,关于 rsyncd 守护进程配置可参考「rsyncd 守护进程模式」,监听本机的 /backup 目录。

1、配置 lsyncd 服务如下:

$ vim /etc/lsyncd.conf
settings {
  logfile = "/var/log/lsyncd/lsyncd.log",
  statusFile = "/var/log/lsyncd/lsyncd.status",
  inotifyMode = "CloseWrite",
  maxProcesses = 8,
}
sync {
  default.rsync,
  source = "/backup",
  target = "rsync_backup@10.0.1.201::backup",
  delete = true,
  exclude = { ".*" },
  delay = 1,
  rsync = {
    binary = "/usr/bin/rsync",
    archive = true,
    compress = true,
    verbose = true,
    password_file = "/etc/rsync.passwd",
    _extra = {"--bwlimit=200"}
  }
}

2、创建密码文件并修改权限:

$ echo 1 > /etc/rsync.passwd
$ chown 600 /etc/rsync.passwd

3、启动服务:

$ systemctl start lsyncd.service

4、在本机 /backup 目录测试创建文件:

$ touch {1,2,3}.txt

5、在提供 rsyncd 服务的主机上查看对应模块映射目录:

$ ls
1.txt  2.txt  3.txt

同步成功~

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/linux-file-sharing8.html

Buy me a cup of coffee ☕.