数据同步Rsync部署
基于SSH的Rsync同步
# 注: 需要数据同步双方均安装rsync,同时配置了SSH密钥(免密登录)(否则需要输入密码)
# 在node1和node2这两台主机中同时安装
# node1/2主机中安装 rpm -qa | grep rsync
dnf install -y rsync
rpm -qa rsync
# 语法
rsync [选项] 源路径 目标路径
# 选项 -az
-a 归档模式(递归+保留权限、时间、软链等)
-v 显示详细信息
-z 压缩传输
-P 显示进度+断点续传
--delete 删除目标端多余文件
-e ssh 指定使用 SSH 方式,默认ssh
--exclude 指定排除文件 --exclude 'file1.txt' --exclude 'dir1/*' 黑名单
注: /data/ 末尾的 / 表示同步目录内容,不加 / 表示连目录一起同步。
路径后面的 / 一定要注意,有和无是有区别的,在操作时一定要记得操作后检查一下。
# 本地同步
[root@node1 /data]# rsync -azvP /data/web /backup/
# 远程同步
# rsync 选项 源 目标 末尾的 / 不能少
[root@node1 /data]# rsync -azvP /data/web root@node2:/data/
[root@node1 /data]# rsync -azvP --exclude='*.txt' /data/web root@node2:/data/
# 远程拉取
# rsync 选项 远程地址 目标地址(本地地址)
# rsync 在拉取时,它的权限要看执行这个命令时它的用户,对应本地目录的权限
[root@node1 /data]# rsync -azPv root@node2:/data/web /data/
案例
# 目录中的messages、secure日志文件进行定时的备份到node2节点的/data/node1_backup_system_log目录中, 要求每日凌晨2点进行备份一次
# 执行:crontab -e 添加如下内容
0 2 * * * /usr/bin/rsync /var/log/ root@192.168.88.162:/data/node1_backup_system_log/
Rsync服务的方式实现同步
Rsync 以 守护进程(daemon) (root用户)方式运行,其实就是把 rsync 当成一个独立的服务,常驻后台等待客户端连接,而不是临时命令执行
优点:
-
不依赖于SSH
-
更灵活的权限控制 :通过
rsyncd.conf进行精确控制(只读/可写、特定模块、IP 限制) -
不必每次输入密码:可用
secrets file保存密码,自动验证,适合自动化脚本
缺点:
-
安全性低于 SSH:如果没有额外加密,传输是明文,可能被抓包分析
-
端口暴露风险:默认监听 TCP
873端口 -
配置复杂 :要额外维护
rsyncd.conf、防火墙、用户密码文件等

1. 服务器node2端创建一个非登录用户rsync用于服务运行时身份
# 创建一个rsync的用户,且此用户不能登录
useradd -s /sbin/nologin rsync
# 检查是否创建成功
tail -1 /etc/passwd
id rsync
2. 准备接受数据的目录
rm -rf /data
mkdir -p /data
3. node2进行配置文件配置
vi /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
port = 873
max connections = 200
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = yes
ignore nonreadable = yes
[dataweb]
path = /data
comment = web backup
read only = no
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.88.0/24
hosts deny = *
auth users = sync_web_itwu
4. node2设置认证用户名和密码
# 用户名和 auth users 指定的用户名一致
# 文件名和secrets file 批定的路径文件一致
vi /etc/rsyncd.secrets
sync_web_itwu:123abc
5. 修改权限 必须为600
chmod 600 /etc/rsyncd.secrets
6. node2开放rsyncd服务的防火墙
systemctl stop firewalld
# 或者
firewall-cmd --permanent --add-service=rsyncd --zone=public
firewall-cmd --reload
firewall-cmd --list-all --zone=public
7. node2中给同步目录修改权限并启动rsync服务
chown -R rsync.rsync /data
ll -d /data
# --no-detach 不进入后台运行,rsyncd 在前台运行,终端被占用 (调试或当作服务时要使用此选项)
# --daemon 启动 rsync 守护进程模式
rsync --daemon --no-detach
1.node1测试是否可以正常访问
# --delete 在目标端删除源端没有的文件
rsync -azvP --delete /data/web sync_web_itwu@node2::dataweb
Password: 输入虚拟用户的密码123abc
# 客户端node1设置免密(可选)
# 配置rsync密码文件
# 密码为配置服务端,设置的密码
echo '123abc' > /etc/rsync_client.passwd
# 密码文件的权限必须是600
chmod 600 /etc/rsync_client.passwd
# 使用密码文件, 实现不需要输入密码
rsync -avz --password-file=/etc/rsync_client.passwd /data/web sync_web_itwu@node2::dataweb
完整逻辑
-
systemctl start rsyncd→ 主进程以 root 用户启动 -
rsyncd 读取配置
/etc/rsyncd.conf,遇到配置:secrets file = /etc/rsyncd.secrets
-
由 root 身份打开读取
/etc/rsyncd.secrets
- 文件权限 600:root 完全可以读;普通用户、rsync 系统用户都不能读
- 读到
sync_web_itwu:123abc用户密码,用于客户端密码校验 - 客户端连接过来 fork 子进程,子进程切换为
uid=rsync,gid=rsync,子进程不需要读取这个密码文件。密码已经在 root 主进程阶段加载到内存。
/etc/rsyncd.secrets 设置权限 600 → -rw------- 属主 root,只有 root 能读、写;其他用户完全没任何权限。
rsync‑daemon 主进程是 root 在运行,root 不受 600 权限限制,可以正常读取这个密码文件
所以:600 权限完全没问题,也是官方强制要求。
如果权限大于 600(例如 644),rsyncd 直接拒绝启动,报错: secret file must not be other‑accessible(密钥文件不能对其他用户可访问)
区分两个密码文件
服务端:/etc/rsyncd.secrets
- 格式:
虚拟用户:密码- 权限必须:
chmod 600- 读取者:root(rsyncd 主进程)
客户端:/etc/rsync_client.passwd
- 格式:只写密码,不要用户名
- 权限也必须
chmod 600- 读取者:客户端执行 rsync 命令的用户(一般是 root)
到底是谁在运行sync?
root@rocky02 data# ps -ef | grep sync
root 2955 1 0 11:56 ? 00:00:00 rsync --daemon
rsync --daemon是 root 启动的主守护进程 ,所以ps -ef看到进程属主是root;但是实际读写文件的时候,会切换到你配置里的
uid=rsync、gid=rsync当客户端成功连上,开始传输文件 的时候: rsync daemon 会fork 子进程 ,然后把这个子进程的身份切换为
uid=rsync,gid=rsync,使用 rsync 用户去读写path=/data目录下的文件。总结: 主监听进程 root,真正干活读写文件的子进程是 rsync 用户
验证方法
在 rocky01 执行 rsync 同步,同步过程中,立刻在 rocky02 执行:
ps -ef | grep rsync
你会看到两条 rsync 进程:
- root:
rsync --daemon(常驻主进程) - rsync:
rsync --daemon子进程(临时,负责本次文件传输)
验证方法--2
# 切换到rsync系统用户,尝试读取密码文件,会权限拒绝
su -s /bin/bash rsync
cat /etc/rsyncd.secrets
会报 Permission denied,这是正常现象,不影响 rsyncd 工作。
面试考点:为什么 rsyncd.secrets 必须 600?
防止普通用户读取窃取虚拟用户的备份密码;虽然 rsync 子进程没有权限读,但是 root 主进程可以正常加载。
# 补充
uid/gid是传输文件阶段的身份,不是主进程身份,很多人容易踩这个坑。/data目录必须对 rsync 用户有读写权限,不然同步写文件会报错 permission denieduse chroot = no不开启 chroot;如果开启use chroot=yes,也是 fork 子进程后切换 uid/gid。