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.107
和192.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.107
和192.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
编写配置文件
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
CloseWrite
和Modify
CloseWrite
包含了以下inotify
事件
IN_ATTRIB
文件属性被修改,如 chmod、chown、touch 等IN_CLOSE_WRITE
可写文件被关闭IN_CREATE
创建新文件IN_DELETE
文件/目录已在监控目录中删除IN_DELETE_SELF
监控的项目本身已删除IN_MOVED_FROM
文件被移出监控目录,如 mvIN_MOVED_TO
文件被移动到监控目录,如 mv、cpIN_DONT_FOLLOW
不追踪符号链接的真实路径IN_ONLYDIR
仅监视目录Modify
是在CloseWrite
的基础上
- 增加了
IN_MODIFY
文件已被修改- 删除了
IN_CLOSE_WRITE
可写文件被关闭
参数解释
sync
rsync
、rsyncssh
、direct
三种模式
default.rsync
:使用rsync
命令完成本地目录间同步,也可以达到使用 ssh 形式的远程 rsync 效果,或 daemon 方式连接远程 rsyncd 进程default.direct
:使用cp
、rm
等命令完成本地目录间差异文件同步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.107
和192.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.107
和192.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