当前位置: 首页 > 工具软件 > lsyncd > 使用案例 >

lsyncd 配合 rsync 实时差异同步节点文件

岳凯康
2023-12-01

说明书

  • rsync
    • rsync 是一个开源的实用程序,可提供快速增量文件传输
    • rsync 官网
    • 和 sync 命令是完全两个玩意,sync 是将内存 buff 中的资料强制写入磁盘,rsync 是增量文件传输
  • lsyncd
    • Lsyncd监视本地目录树事件监视器接口( inotify 或 fsevents )
    • 它聚合并组合事件几秒钟,然后生成一个(或多个)进程来同步更改,(默认情况下是 rsync )
    • lsyncd 2.2.1 要求所有源计算机和目标计算机上的 rsync >= 3.1
    • lsyncd github

lsyncd + rsync 可以用来做数据的备份,也可以代替 nfs 做 web 服务器的共享根目录

192.168.16.100 这个节点用来充当服务端的角色,192.168.16.107192.168.16.108 用来充当客户端的角色(当服务端指定目录内发生修改[增删改]操作后,将修改的操作同步给客户端)

需要整理一下场景和思路

  • 192.168.16.100
    • 需要部署 lsyncd 和 rsync (因为 lsyncd 是一个采用 linux 内核的 inotify 触发机制去调用 rsync 做增量文件传输)
    • lsyncd 需要编写配置文件
    • rsync 不需要编写配置文件
  • 192.168.16.107 和 192.168.16.108
    • 只需要部署 rsync (用来接收 192.168.16.100 传输过来的增量文件)
    • rsync 需要编写配置文件,指定接收哪个节点传输过来的增量文件
IPSERVICE/ROLEOS_VERSION
192.168.16.100lsyncd & rsync/serverCentOS-7.6.1810
192.168.16.107rsync/clientCentOS-7.6.1810
192.168.16.108rsync/clientCentOS-7.6.1810

部署客户端

安装 rsync 服务

192.168.16.107192.168.16.108 两个节点做一样的操作

yum install -y rsync

编写配置文件

配置文件模板 [过滤EXAMPLES]

mv /etc/rsyncd.conf{,.bak}
vim /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
timeout = 300
[data]
path = /data/
read only = false
list = false
hosts allow = 192.168.16.100
hosts deny = 0.0.0.0/32
auth users = rsync
secrets file = /etc/rsyncd.secrets

参数解释

uid: 运行 rsync 服务使用的用户
gid: 运行 rsync 服务使用的用户组
use chroot: 安全相关,需要 root 权限,默认为 true
max connections: 最大链接数(默认值为 0,表示没有限制。负值禁用模块。)
pid file: pid 文件存放路径
lock file: rsync 守护进程在此文件上使用记录锁定,以确保共享锁定文件的模块不会超过最大连接限制
log file: 指定日志存储路径,默认为 syslog
timeout: 超时时间
[data]: 模块名称(自定义,服务端同步文件的时候指定的名称)
path: 服务端的同步目录
read only: 客户端是否只读,若不是只读,客户端也可以同步文件到服务端
list: 是否列出模块
hosts allow: rsync 的服务端地址,多个主机用逗号或者空格分隔,也可以写网段(不写的话,服务端链接不上客户端,无法传输增量文件)
hosts deny: 拒绝的链接的ip(不写这个参数,表示谁都可以连)
auth users: 用户以及权限
secrets file: 密码文件

创建 rsync 用户

useradd rsync -s /sbin/nologin

创建目录并赋权

mkdir /data
chown -R rsync.rsync /data

创建认证用户和密码文件

密码文件的权限必须是 600,不然后期会报错无法认证

echo 'rsync:rsync' > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

启动 rsync

rsync --daemon --config=/etc/rsyncd.conf

查看 rsync 是否启动成功

cat /var/log/rsyncd.log

rsyncd 的版本是 3.1.2

rsyncd 的进程 pid 是 21654

rsyncd 的端口是 873

2022/03/28 15:27:50 [21654] rsyncd version 3.1.2 starting, listening on port 873

部署服务端

安装 rsync 服务

yum install -y rsync

创建 rsync 用户

useradd rsync -s /sbin/nologin
创建目录并赋权

顺便造点数据

mkdir /data
for i in $(seq 1 10);do mkdir /data/test_$i;echo "this is no.$i" > /data/test_$i/test.log;done
chown -R rsync.rsync /data
创建认证用户和密码文件

密码文件的权限必须是 600,不然后期会报错无法认证

后面执行 rsync 命令的时候会指定用户,这里就只写入密码就可以了

echo 'rsync' > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
测试 rsync 文件同步

注意格式

  • /data/:服务端的目录
  • rsync@192.168.16.107:用户@需要同步的客户端主机ip
  • ::data:双冒号是格式规定,data是模块的名称,和客户端配置的有关
    • 不存在会报错:@ERROR: Unknown module 'test'
rsync -avz /data/ rsync@192.168.16.107::data --password-file=/etc/rsyncd.secrets

输出传输的进度

sending incremental file list
./
test_1/
test_1/test.log
test_10/
test_10/test.log
test_2/
test_2/test.log
test_3/
test_3/test.log
test_4/
test_4/test.log
test_5/
test_5/test.log
test_6/
test_6/test.log
test_7/
test_7/test.log
test_8/
test_8/test.log
test_9/
test_9/test.log

sent 1,022 bytes  received 261 bytes  2,566.00 bytes/sec
total size is 131  speedup is 0.10
客户端查看文件

登录到 192.168.16.107 服务器查看

for i in $(seq 1 10);do cat /data/test_$i/test.log;done

可以查看得到内容

this is no.1
this is no.2
this is no.3
this is no.4
this is no.5
this is no.6
this is no.7
this is no.8
this is no.9
this is no.10

安装 lsyncd 服务

lsyncd 需要 epel 源

yum install -y epel* && yum install -y lsyncd
编写配置文件

lsyncd settings 层配置

lsyncd sync 层配置

mv /etc/lsyncd.conf{,.bak}
vim /etc/lsyncd.conf

lua 语法中 -- 表示注释

多个 sync 表示配置多个同步作业

-- 全局配置
settings {
  -- 定义日志文件路径和名称
  logfile = "/var/log/lsyncd/lsyncd.log",
  -- 定义状态文件路径和名称
  statusFile = "/var/log/lsyncd/lsyncd.status",
  -- 指定inotify监控的事件
     -- 默认是"CloseWrite",还可以是"Modify"
  inotifyMode = "CloseWrite",
  -- 最大进程数
  maxProcesses = 8,
  -- 累计到多少所监控的事件激活一次同步,即使后面的sync配置的delay延迟时间还未到
  maxDelays = 1,
  -- true 表示不启用守护进程模式(默认是true)
  nodaemon = false,
}

-- 定义同步的配置
sync {
  -- 使用 rsync 进行目录同步
  default.rsync,
  -- 源目录
  source = "/data/",
  -- 虚拟用户和远程主机ip以及模块名称
     -- 如果是 default.direct ,target 直接写同步到哪个目录即可,不需要写虚拟用户和主机ip以及模块名称
  target = "rsync@192.168.16.107::data",
  -- 排除选项
     -- excludeFrom = "/etc/lsyncd.exclude" 指定列表文件
     -- exclude = { LIST } 指定规则
  exclude = {
  '.**',
  '.git/**',
  '*.bak',
  '*.tmp',
  'runtime/**',
  'cache/**'
  },
  -- 累计事件,默认15秒
     -- 15s内两次修改了同一文件,最后只同步最新的文件
  delay = 15,
  -- rsync 配置
  rsync = {
    -- rsync 二进制文件绝对路径 [使用'whereis rsync'命令可以查看 rsync 二进制文件的绝对路径]
    binary = "/usr/bin/rsync",
    -- 指定密码文件
    password_file = "/etc/rsyncd.secrets",
    -- 是否归档
    archive = true,
    -- 是否压缩传输
       -- 默认是 true ,根据文件大小等因素决定是否开启压缩
    compress = false,
    verbose = false,
    -- 其他参数
       -- bwlimit 限速,单位kb/s
    _extra = {"--bwlimit=200", "--omit-link-times"}
  }
}

sync {
  default.rsync,
  source = "/data/",
  target = "rsync@192.168.16.108::data",
  exclude = {
  '.**',
  '.git/**',
  '*.bak',
  '*.tmp',
  'runtime/**',
  'cache/**'
  },

  delay = 15,
  rsync = {
    binary = "/usr/bin/rsync",
    password_file = "/etc/rsyncd.secrets",
    archive = true,
    compress = false,
    verbose = false,
    _extra = {"--bwlimit=200", "--omit-link-times"}
  }
}

参数解释 settings

  • inotifyMode
    • CloseWriteModify
      • CloseWrite 包含了以下 inotify 事件
        • IN_ATTRIB 文件属性被修改,如 chmod、chown、touch 等
        • IN_CLOSE_WRITE 可写文件被关闭
        • IN_CREATE创建新文件
        • IN_DELETE 文件/目录已在监控目录中删除
        • IN_DELETE_SELF 监控的项目本身已删除
        • IN_MOVED_FROM 文件被移出监控目录,如 mv
        • IN_MOVED_TO 文件被移动到监控目录,如 mv、cp
        • IN_DONT_FOLLOW 不追踪符号链接的真实路径
        • IN_ONLYDIR 仅监视目录
      • Modify 是在 CloseWrite 的基础上
        • 增加了
          • IN_MODIFY 文件已被修改
        • 删除了
          • IN_CLOSE_WRITE 可写文件被关闭

参数解释 sync

  • rsyncrsyncsshdirect三种模式
    • default.rsync :使用 rsync 命令完成本地目录间同步,也可以达到使用 ssh 形式的远程 rsync 效果,或 daemon 方式连接远程 rsyncd 进程
    • default.direct :使用 cprm 等命令完成本地目录间差异文件同步
    • default.rsyncssh :同步到远程主机目录,rsync 的 ssh 模式,需要使用 key 来认证;
启动 lsyncd 服务

同时设置为开机自启

systemctl enable lsyncd
systemctl start lsyncd
测试 lsyncd 功能

查看服务端监听目录下的文件和目录

ssh 192.168.16.100 "ls /data/"

得到了如下的输出

test_1
test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9

同时也查看 192.168.16.107192.168.16.108 两个客户端是否也是存在这些文件和目录(前面手动同步过,所以是存在的)

for i in 107 108;do ssh 192.168.16.$i "ls /data/";done

预期是返回两次内容

test_1
test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9
test_1
test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9

现在我们删除服务端(192.168.16.100)上的 /data/test_1 目录,验证客户端(192.168.16.107192.168.16.108)是否也会删除这个目录

ssh 192.168.16.100 "rm -rf /data/test_1"

此时查看服务端和客户端是否还存在 test_1 这个目录

for i in 100 107 108;do ssh 192.168.16.$i "ls /data/";done

此时得到如下的返回

说明 lsyncd 配和 rsync 成功同步

test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9
test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9
test_10
test_2
test_3
test_4
test_5
test_6
test_7
test_8
test_9
 类似资料: