文章目录
- 🌀使用 Rsync + Lsyncd 实现 CentOS 7 实时文件同步
- 前言
- 介绍
- 架构图
- 🧱系统环境
- 🔧Rsync配置(两台都需安装)
- 关闭SELinux(两台都需)
- 📦配置目标端(client)为 Rsync 服务端
- 创建用户和目录
- 配置 /etc/rsyncd.conf
- rsyncd.conf 配置文件讲解
- 创建认证文件
- 启动并设置开机自启
- 在这里插入图片描述
- 🚀配置源端(server)安装并使用 Lsyncd 实现实时同步
- 安装 lsyncd
- 创建用户、目录及认证文件
- 测试 Rsync 是否能正常使用
- 参数解释
- 作用总结
- ⚙️配置 Lsyncd 实现实时监听同步
- 配置 /etc/lsyncd.conf
- lsyncd.conf配置讲解
- 全局配置
- 同步设置
- rsync 配置
- 启动并设置 Lsyncd 自启动
- 🧪测试同步效果
- 📝总结
- 📚推荐扩展
🌀使用 Rsync + Lsyncd 实现 CentOS 7 实时文件同步
在日常运维中,我们经常遇到需要将一台服务器上的数据实时同步到另一台服务器的场景,比如配置文件同步、数据热备、静态资源同步等。本文将基于以下环境,通过 Rsync + Lsyncd 来实现文件的实时同步。
前言
在分布式系统中,数据同步是一个重要的需求,尤其是当我们希望将两台服务器的数据保持一致时。rsync
和 lsyncd
是两种常见的数据同步工具,它们能高效地处理文件同步和实时数据同步。本文将通过在两台 CentOS 7.9 服务器上配置 rsync
和 lsyncd
,展示如何进行数据同步的操作和配置。
介绍
- rsync:是一款用于远程和本地文件同步的工具,支持增量传输,能有效减少网络带宽的使用。它通常用于备份和镜像操作。
- lsyncd:是一个基于
rsync
的实时同步工具,它利用inotify
机制监听文件变化,实时同步指定的目录。lsyncd
配合rsync
使用,能够实现近乎实时的数据同步。
本文将介绍如何通过 rsync
配合 lsyncd
实现文件同步,并通过配置文件和命令展示如何设置。
架构图
以下是本次同步任务的架构图:
+---------------------+ rsync/lsyncd +---------------------+
| |<--------------------->| |
| Server | | Client |
| 10.255.101.216 | | 10.255.101.217 |
| | | |
| - Data Directory | | - Data Directory |
| - Rsync + Lsyncd | | - Rsync Daemon |
| | | |
+---------------------+ +---------------------+
通过这种架构,server
上的文件会通过 rsync
和 lsyncd
实时同步到 client
上,确保两个节点的数据保持一致。
🧱系统环境
主机名 | IP地址 | 系统版本 | 备注 |
---|---|---|---|
server | 10.255.101.216 | CentOS Linux release 7.9.2009 (Core) | 源服务器 |
client | 10.255.101.217 | CentOS Linux release 7.9.2009 (Core) | 目标服务器 |
- CPU:2核
- 内存:4G
- 存储:50G
- rsync:3.1.2
- lsyncd:2.2.2
🔧Rsync配置(两台都需安装)
yum -y install rsync
关闭SELinux(两台都需)
getenforce
# 如果输出不是 Disabled,则执行
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
📦配置目标端(client)为 Rsync 服务端
创建用户和目录
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync # 组名在前,用户名在后
echo "test123456." | passwd --stdin rsync # 设置密码
mkdir /data/
chown -R rsync:rsync /data/
配置 /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors = yes
read only = false
list = false
auth users = rsync
secrets file = /etc/rsync.password
[client-10.255.101.217]
comment = "test"
path = /data/
rsyncd.conf 配置文件讲解
下面对 rsyncd.conf
配置文件中的各个参数进行详细讲解:
- uid 和 gid:这两个参数设置
rsync
守护进程运行时使用的用户和用户组。rsync
进程将以该用户身份进行操作,这有助于限制进程的权限,避免过高的安全风险。此配置确保rsync
进程不会以 root 权限运行,从而提高安全性。 - port:指定
rsync
服务监听的端口。默认情况下,rsync
使用 873 端口。可以根据需要修改端口号,但修改后需确保客户端连接时也指定相应的端口。 - fake super:启用此选项后,
rsync
会模拟root
用户的权限,允许传输文件时保持文件的所有者和权限信息。这对于普通用户的权限不足情况下,允许同步时模拟一些root
权限以便传输文件。 - use chroot:此选项设置是否在 chroot 环境中运行
rsync
服务。设置为no
可以避免使用 chroot 环境,从而让rsync
可以访问系统的其他部分,而不局限于一个虚拟文件系统。设置为yes
会把rsync
进程限制在指定的目录路径中,增加安全性。 - max connections:限制
rsync
守护进程可以同时处理的最大连接数。此配置项的目的是防止过多的连接导致系统资源被占用过多。 - timeout:设置
rsync
连接的超时时间(单位:秒)。如果在超时时间内没有数据传输,rsync
会自动断开连接。 - pid file:指定存储
rsync
守护进程 PID(进程 ID)的文件路径。这对于管理rsync
服务非常有用,可以帮助查看进程是否正常运行,并进行相应的操作(如停止进程等)。 - lock file:此选项指定
rsync
守护进程使用的锁文件。该文件防止多个rsync
进程同时访问相同的资源,避免出现数据冲突或文件损坏。 - log file:指定
rsync
守护进程日志文件的路径。所有的活动日志都会记录到这个文件中,可以用来检查同步操作的状态和排查问题。 - ignore errors:启用此选项后,
rsync
将忽略在传输过程中遇到的错误,而不会立即停止同步过程。通常用在需要保证同步不间断的场景,但请注意,忽略错误可能会导致一些文件传输失败而未被及时发现。 - read only:设置为
false
表示目标目录是可写的,允许进行数据同步时的修改。如果设置为true
,则目标目录将变为只读,rsync
只会将文件从源同步到目标,而不会修改目标文件。 - list:设置为
false
时,客户端无法列出同步模块的内容。通过禁用列表功能,可以提高安全性,避免泄露不应公开的目录信息。 - auth users:指定允许进行身份验证的用户列表。在此配置中,
rsync
只允许名为rsync
的用户连接和同步数据。客户端连接时需要提供有效的用户名和密码。 - secrets file:指定存储
rsync
用户密码的文件路径。该文件存储了与auth users
配对的用户名和密码,用于身份验证。密码文件通常有严格的权限控制,确保只有rsync
进程可以读取。 - [client-10.255.101.217]:这是一个同步模块的定义。在此模块下,
rsync
会同步指定路径的文件。模块名称通常与目标机器的 IP 地址、主机名或其他标识符相关,以便在多个同步任务中进行区分。 - comment:为该同步模块添加注释,用于描述该模块的作用或用途。在此配置中,
comment
被设置为"test"
,可以根据实际需求更改。 - path:指定
rsync
服务需要同步的目录路径。在此配置中,rsync
将同步client
上的/data/
目录。
创建认证文件
echo "rsync:test123456." > /etc/rsync.password
chmod 600 /etc/rsync.password
启动并设置开机自启
systemctl start rsyncd
systemctl enable rsyncd
验证运行状态:
systemctl status rsyncd
🚀配置源端(server)安装并使用 Lsyncd 实现实时同步
安装 lsyncd
yum install -y epel-release
yum install -y lsyncd
创建用户、目录及认证文件
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync # 组名在前,用户名在后
echo "test123456." | passwd --stdin rsync # 设置密码
mkdir /data
touch /data/file{1..10}.txt # 创建模拟数据
# 创建 rsync 密码文件
echo "test123456." > /etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd
测试 Rsync 是否能正常使用
rsync -avz --password-file=/etc/rsyncd.pwd /data/ rsync@10.255.101.217::client-10.255.101.217
目标端
/data
目录应成功收到同步的文件。
参数解释
-
rsync
:调用rsync
工具进行文件同步。 -
-a
:归档模式(archive mode)。这个选项会递归地同步文件,并保留文件的权限、符号链接、时间戳等信息。它等同于-rlptgoD
,即:-r
:递归同步目录。-l
:复制符号链接为符号链接。-p
:保留文件的权限信息。-t
:保留文件的修改时间。-g
:保留文件的组信息。-o
:保留文件的所有者信息。-D
:保留设备信息和特殊文件。
-
-v
:详细模式(verbose)。使rsync
输出详细的同步过程,包括每个文件的同步状态。此选项会显示文件传输的进度和文件列表,便于跟踪同步情况。 -
-z
:压缩传输。在传输文件时启用压缩,以减少网络带宽的使用,尤其适用于较大的文件。 -
--password-file=/etc/rsyncd.pwd
:指定存放密码的文件路径。rsync
会从这个文件中读取与指定的rsync
用户(本例中是rsync
)相关的密码,而不是通过交互式的方式输入密码。该文件的权限应设置为仅rsync
用户可读,以保障安全性。 -
/data/
:指定本地源目录路径。这个路径表示需要同步的本地目录。rsync
会将这个目录中的文件同步到远程主机的指定目录。 -
rsync@10.255.101.217::client-10.255.101.217
:rsync
:指定用于连接远程rsync
服务的用户。10.255.101.217
:远程rsync
服务的 IP 地址。::client-10.255.101.217
:指定rsync
服务上的模块名。模块名是在rsyncd.conf
配置文件中定义的,这里指向client-10.255.101.217
模块,表示同步目标为rsync
服务端的该模块所对应的目录。
作用总结
该命令会将本地 /data/
目录中的文件递归同步到远程 rsync
服务器上,目标路径由 rsync
服务器上的 client-10.255.101.217
模块决定。同步过程中会保留文件的权限、时间戳等元数据,且传输数据时会进行压缩以节省带宽,同时通过指定的密码文件实现自动认证。
⚙️配置 Lsyncd 实现实时监听同步
配置 /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite or Modify",
maxProcesses = 8,
insist = true,
}
sync {
default.rsync,
source = "/data/",
target = "rsync@10.255.101.217::client-10.255.101.217",
delete = false,
exclude = { ".*", "logs/*.log" },
delay = 1,
init = false,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsyncd.pwd",
_extra = {"--bwlimit=200"}
}
}
lsyncd.conf配置讲解
全局配置
-
logfile = "/var/log/lsyncd/lsyncd.log"
:指定日志文件的保存路径。所有同步操作的日志信息将写入此文件,便于后续查看和调试。 -
statusFile = "/var/log/lsyncd/lsyncd.status"
:指定状态文件的路径,记录当前同步的状态信息。 -
inotifyMode = "CloseWrite or Modify"
:inotify
监听模式。lsyncd
使用inotify
监听文件系统事件来触发文件同步。这个配置指示lsyncd
监听文件的修改操作(Modify
)或者文件关闭写入操作(CloseWrite
)。当文件发生这些事件时,lsyncd
会启动同步任务。 -
maxProcesses = 8
:最大同步进程数。lsyncd
会使用多进程并行执行同步操作,这个选项限制了最大进程数为 8。 -
insist = true
:该选项指定如果进程出现异常终止,是否继续运行。true
表示lsyncd
会尝试在出现异常后继续运行。
同步设置
-
default.rsync
:表示同步方式是rsync
,即使用rsync
协议进行数据传输。 -
source = "/data/"
:本地同步的源目录,指向/data/
目录。 -
target = "rsync@10.255.101.217::client-10.255.101.217"
:指定远程目标路径,使用rsync
协议通过rsync
用户连接到远程主机10.255.101.217
,并同步到client-10.255.101.217
模块。 -
delete = false
:指定是否删除目标目录中不在源目录中的文件。false
表示不同步删除操作,即目标目录中未在源目录的文件不会被删除。 -
exclude = { ".*", "logs/*.log" }
:排除的文件和目录。这个选项指定了不需要同步的文件或目录:"*.*"
:排除所有以.
开头的隐藏文件或目录。"logs/*.log"
:排除logs
目录中的所有.log
文件。
-
delay = 1
:设置每次文件同步的延迟时间为 1 秒。这样可以避免文件频繁变化时导致的过度同步操作。 -
init = false
:指定是否在lsyncd
启动时立即执行同步。如果设置为false
,则lsyncd
启动时不会自动同步数据,等待监控到文件变化后才会执行同步。
rsync 配置
这些选项用于配置 rsync
的具体参数:
-
binary = "/usr/bin/rsync"
:指定rsync
可执行文件的路径,通常不需要修改,除非rsync
安装在非标准路径。 -
archive = true
:启用rsync
的归档模式,确保文件的符号链接、权限、时间戳等信息都能被保留。 -
compress = true
:启用压缩,在同步时对数据进行压缩,从而减少传输的数据量,特别适用于网络带宽有限的情况。 -
verbose = true
:启用详细模式,输出详细的同步过程,帮助调试和查看同步的文件。 -
password_file = "/etc/rsyncd.pwd"
:指定存储rsync
密码的文件路径,这样可以避免每次同步时都要手动输入密码。 -
_extra = {"--bwlimit=200"}
:添加额外的rsync
参数,这里设置了带宽限制为200KB/s
,用于限制同步过程中的带宽使用。
启动并设置 Lsyncd 自启动
systemctl start lsyncd
systemctl enable lsyncd
🧪测试同步效果
在 server 添加新文件:
touch /data/file{11..20}.txt
在 client 上查看是否实时同步:
ls -l /data/
✅ 你将看到 file11.txt ~ file20.txt 自动同步到目标机的 /data
目录。
📝总结
通过本方案:
- ✅ 利用了 rsync 进行安全、高效的数据传输;
- ✅ 使用 Lsyncd 实现了源端目录的实时监听;
- ✅ 达到数据实时同步的效果,适合小文件频繁变更的场景;
- ✅ 配置灵活,支持压缩、排除规则、带宽限制等。
📚推荐扩展
- 日志查看:
tail -f /var/log/lsyncd/lsyncd.log
- 支持双向同步请参考:
lsyncd
+inotifywait
或使用Unison
- 实时同步大量小文件建议优化 inotify 参数或调大 fs.inotify.max_user_watches
如果你也有类似需求,不妨动手试试吧!有什么问题欢迎留言讨论~