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

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

说明书

  • 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 需要编写配置文件,指定接收哪个节点传输过来的增量文件
IP SERVICE/ROLE OS_VERSION
192.168.16.100 lsyncd & rsync/server CentOS-7.6.1810
192.168.16.107 rsync/client CentOS-7.6.1810
192.168.16.108 rsync/client CentOS-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
目录
相关文章
|
6天前
|
存储 监控 网络安全
rsync 远程同步 基础介绍
rsync 远程同步 基础介绍
|
监控 Linux Shell
rsync + inotify 实现文件实时双向自动同步
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出更好的要求,rsync 在高端业务系统中也逐渐暴露出了很多不足。
1626 0
Confluence 6 从外部目录中同步数据配置同步间隔
在用户目录(User Directories)界面中显示了最后的系统同步时间,包括有这次同步所花费的时间。 注意:针对 Crowd  和 Jira 目录同步时间的配置只在 Confluence 3.5.3 及其后续版本中可以设置。
819 0
sersync实现主机实时双向同步
查看原文:http://www.chenqmc.com/?p=336
1109 0
|
监控 Shell 关系型数据库

热门文章

最新文章