A → B 数据同步搭建指南
角色说明:A = RockyLinux 10(无公网IP,数据源),B = OracleLinux 8(有公网IP,接收备份)。同步方向固定为 A 主动推送到 B,因为只有 A 能发起连接。
OracleLinux 8 一般默认已装好 openssh-server,确认一下:
systemctl status sshd
没启动就装并启动:
sudo dnf install -y openssh-server
sudo systemctl enable --now sshd
确认防火墙放行 22 端口(如果用了 firewalld):
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
如果 B 是云服务器,还要去云厂商的安全组/网络策略里放开 22 端口的入方向规则。
第二步:B 上创建专用的接收用户(可选但推荐)
不用 root 直接接收,单独建一个用户,权限收窄,更安全:
sudo useradd -m -s /bin/bash syncuser
sudo mkdir -p /data/backup_from_A
sudo chown syncuser:syncuser /data/backup_from_A
第三步:A 上安装 rsync 和 openssh-client
RockyLinux 10 通常默认都有,确认:
rsync --version
ssh -V
没有就装:
sudo dnf install -y rsync openssh-clients
第四步:A 上生成密钥对,实现免密登录 B
在 A 上,用运行同步任务的那个用户(比如 root,或者你专门建的备份用户)执行:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_to_B -N ""
-N "" 表示不设密码,方便脚本免交互调用;-f 指定单独的文件名,避免跟你已有的默认密钥冲突。
把公钥传到 B:
ssh-copy-id -i ~/.ssh/id_ed25519_to_B.pub syncuser@B的公网IP
如果 B 的 SSH 端口不是默认 22,要加 -p 端口号。这一步会要求输入一次 syncuser 的密码,之后就再也不用了。
验证免密登录:
ssh -i ~/.ssh/id_ed25519_to_B syncuser@B的公网IP
能直接进去不问密码,说明配置成功。
第五步:(可选)在 A 上写 SSH config 简化命令
编辑 ~/.ssh/config:
Host B
HostName B的公网IP
User syncuser
Port 22
IdentityFile ~/.ssh/id_ed25519_to_B
配置好之后,后面 rsync 命令里直接用 B 这个别名代替完整的用户名+IP+端口,命令更简洁,改 IP 或端口也只需要改这一处。
第六步:执行同步
用 SSH config 别名的写法:
rsync -avz --delete /path/to/local/data/ B:/data/backup_from_A/
不用别名的完整写法:
rsync -avz --delete -e "ssh -i ~/.ssh/id_ed25519_to_B -p 22" /path/to/local/data/ syncuser@B的公网IP:/data/backup_from_A/
参数说明:
-a归档模式,保留权限、时间戳、软链接、属主属组-v显示详细过程,便于调试;正式定时任务里可以去掉,减少日志体积-z传输时压缩--delete让目标目录跟源目录保持一致,源里删了的文件目标也会删掉;如果只想增量添加不想同步删除,去掉这个参数- 源路径末尾的
/必须保留,表示只同步目录内容本身,不带这个斜杠会在目标里多套一层目录
第七步:加入定时任务
在 A 上编辑 crontab:
crontab -e
加一行,比如每天凌晨3点同步一次:
0 3 * * * rsync -avz --delete /path/to/local/data/ B:/data/backup_from_A/ >> /var/log/rsync_to_B.log 2>&1
如果同步的是你之前那套本地备份脚本产出的目录(/var/backups/for_rl10),可以直接把这行 rsync 命令追加到备份脚本末尾,本地打包完立刻推送,不用单独再开一个定时任务。
排查要点
- 如果连接失败,先用
ssh -v加详细模式排查,看是密钥没生效还是端口/防火墙问题 - 如果 crontab 里跑失败但手动执行正常,大概率是 cron 环境变量(尤其是
$HOME、$PATH)跟交互式 shell不一致,导致密钥文件路径找不到——排查方式跟之前处理 mysql 认证问题时是同一个思路,可以在 rsync 命令里把密钥路径写成绝对路径,不依赖~ - 同步大量小文件时速度慢,是 rsync 正常特性(要逐个比对文件),可以考虑加
--info=progress2看整体进度,或者用-e "ssh -T -c [email protected] -o Compression=no -x"这类调优参数提升传输速度(前提是数据本身不可再压缩,比如已经是 tar.gz)












