永州市网站建设_网站建设公司_需求分析_seo优化
2026/1/15 11:36:40 网站建设 项目流程

数据同步服务


一、Rsync 概述

1.1 什么是 Rsync?

  • Rsync(Remote Sync)是 CentOS Stream 9 中用于高效同步与备份文件的开源工具
  • 支持本地 ↔ 本地本地 ↔ 远程的数据同步

1.2 核心特点

  • 增量同步:仅传输变化部分,节省带宽与时间
  • 支持 SSH 加密传输(安全)
  • 保留元数据:权限、时间戳、软硬链接等
  • 压缩传输-z 选项)

1.3 工作原理(差异算法)

  1. 分块比较:将文件切分为固定大小的块
  2. 校验和计算:对每块计算 checksum
  3. 对比差异:仅传输源与目标不同的块
  4. 优化传输:支持压缩、断点续传、增量更新

💡 特别适合大文件或大规模目录同步


二、安装与验证

# 安装 rsync(两端均需安装)
dnf install rsync -y# 验证版本
rsync --version

⚠️ 远程同步前提

  • 双方安装 rsync
  • 配置 SSH 免密登录(否则每次需输密码)

三、Rsync 基本语法与常用选项

3.1 基本格式

rsync [选项] 源路径 目标路径

3.2 常用选项

选项 说明
-v 详细模式(显示传输文件)
-a 归档模式(递归 + 保留属性,最常用)
-z 传输时压缩数据
-P 显示进度条(等价于 --partial --progress
--delete 删除目标端多余文件(实现严格同步)
-e 指定远程 shell(默认 ssh,可指定端口)

3.3 使用示例

本地同步

rsync -av /src/dir/ /dest/dir/

推送至远程(本地 → 远程)

rsync -avz /local/dir/ root@192.168.88.102:/remote/dir/

拉取远程数据(远程 → 本地)

rsync -avz user@192.168.88.102:/remote/dir/ /local/dir/

🔔 路径末尾斜杠 / 的区别

  • /:同步目录内容
  • /:同步整个目录

四、同步方式分类

方式 说明 实现工具
定时同步 按计划周期执行 crontab
实时同步 文件变化立即触发 inotify + rsync

五、案例实践

5.1 本地同步操作

需求:将 /usr/local/nginx-1.8.0/html 同步到 backup/,并删除目标端多余文件

# 创建目标目录
mkdir -p /usr/local/nginx-1.8.0/backup/# 执行同步(注意 html 后无 /)
rsync -av --delete /usr/local/nginx-1.8.0/html /usr/local/nginx-1.8.0/backup/# 若希望只同步 html 内容(不创建 html 子目录),则加 /
rsync -av --delete /usr/local/nginx-1.8.0/html/ /usr/local/nginx-1.8.0/backup/

5.2 远程同步操作

需求:将本地 html 目录同步到 node2 的 ~/backup/

# 在 node2 创建目标目录
ssh root@192.168.88.102 "mkdir -p ~/backup"# 执行同步
rsync -avz /usr/local/nginx-1.8.0/html root@192.168.88.102:~/backup/# 验证
ssh root@192.168.88.102 "tree ~/backup"

5.3 定时备份(crontab + rsync)

需求:每日凌晨 2 点备份 /var/log/messages/secure 到 node2

# 在 node2 创建备份目录
ssh root@192.168.88.102 "mkdir -p /export/data/node1_backup_system_log"# 编写 crontab 任务(在 node1 执行)
crontab -e

添加以下行:

0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root@192.168.88.102:/export/data/node1_backup_system_log

✅ 使用绝对路径(which rsync 获取)


5.4 实时同步(inotify + rsync)

需求:监控 /export/data/logs,变化时立即同步到 node2

步骤 1:安装 inotify-tools

# 启用 EPEL 仓库(若未启用)
dnf install epel-release -y# 安装 inotify-tools
dnf install -y inotify-tools

步骤 2:编写实时同步脚本

vi /root/real_time_sync.sh
#!/bin/bash
SOURCE_DIR="/export/data/logs"
TARGET_DIR="root@192.168.88.102:/export/data/node1_exe_backup_log"
LOG_FILE="/var/log/rsync_realtime_sync.log"# 创建日志目录(若不存在)
mkdir -p "$(dirname "$LOG_FILE")"inotifywait -m -r -e modify,create,delete,move "$SOURCE_DIR" | while read path action file; doecho "$(date): Detected ${action} on ${file}. Starting rsync..." >> "$LOG_FILE"rsync -avz --delete -e ssh "${SOURCE_DIR}/" "${TARGET_DIR}/" >> "$LOG_FILE" 2>&1echo "$(date): Sync completed for ${file}." >> "$LOG_FILE"
done

步骤 3:赋予执行权限并测试

chmod +x /root/real_time_sync.sh
./real_time_sync.sh  # 前台运行测试# 后台运行(生产环境)
nohup /root/real_time_sync.sh > /dev/null 2>&1 &

步骤 4(可选):配置为 systemd 服务

vi /etc/systemd/system/rsync_inotify.service
[Unit]
Description=Real-time Rsync Sync with Inotify
After=network.target[Service]
ExecStart=/root/real_time_sync.sh
Restart=always
User=root
Group=root[Install]
WantedBy=multi-user.target

启用服务:

systemctl daemon-reload
systemctl start rsync_inotify
systemctl enable rsync_inotify

六、基于 Rsync 守护进程(rsyncd)的同步

⚠️ 注意:此方式不加密,仅适用于内网可信环境

6.1 优势 vs 劣势

优势 劣势
性能略高于 SSH(无需加密开销) ❌ 传输不加密(明文)
无需 SSH 密钥管理 ❌ 需开放端口(默认 873)
适合自动化备份 ❌ 配置较复杂

6.2 配置步骤(在 node2 上操作)

(1) 创建专用用户

useradd rsync
useradd backup_user
echo "backup_user:123456" | chpasswd

(2) 编写配置文件 /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# 模块定义
[node1_logs]
path = /export/data/node1_exe_backup_log
comment = Backup Directory
read only = no
secrets file = /etc/rsyncd.passwd
hosts allow = 192.168.88.0/24
hosts deny = *
auth users = backup_user

(3) 创建密码文件

echo "backup_user:123456" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd

(4) 设置目录权限

chown -R rsync:rsync /export/data/node1_exe_backup_log

(5) 开放防火墙端口

firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload

(6) 启动 rsync 守护进程

rsync --daemon

(7) 配置开机自启(systemd)

vi /etc/systemd/system/rsyncd.service
[Unit]
Description=Rsync Daemon
After=network.target[Service]
ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf --no-detach
ExecReload=/bin/kill -HUP $MAINPID
Restart=always[Install]
WantedBy=multi-user.target

启用服务:

systemctl daemon-reload
systemctl enable rsyncd
systemctl start rsyncd

6.3 客户端同步方式(node1)

(1) 测试连接

rsync rsync://backup_user@192.168.88.102/node1_logs

(2) 手动同步(需输入密码)

rsync -avz /export/data/logs/ backup_user@192.168.88.102::node1_logs

(3) 免密同步(使用密码文件)

# 创建密码文件(node1)
echo "123456" > /etc/rsync.password
chmod 600 /etc/rsync.password# 执行同步
rsync -avz --password-file=/etc/rsync.password /export/data/logs/ backup_user@192.168.88.102::node1_logs

📌 连接格式:

  • user@host::module
  • rsync://user@host/module

6.4 实时同步脚本优化(使用 rsyncd)

修改 /root/real_time_sync.sh 中的 TARGET_DIRrsync 命令:

TARGET_DIR="backup_user@192.168.88.102::node1_logs"# rsync 命令
rsync -avz --port=873 --delete --password-file=/etc/rsync.password \"${SOURCE_DIR}/" "${TARGET_DIR}" >> "$LOG_FILE" 2>&1

七、环境清理(还原操作)

node1 清理

# 停止并禁用服务
systemctl stop rsync_inotify
systemctl disable rsync_inotify
rm -f /etc/systemd/system/rsync_inotify.service
systemctl daemon-reload# 删除脚本与数据
rm -rf /root/real_time_sync.sh
rm -rf /export/data/*
rm -rf /usr/local/nginx*# 卸载软件
dnf remove -y rsync
rm -f /etc/rsync.password# 清空定时任务
crontab -e  # 删除所有行后保存

node2 清理

# 停止 rsyncd
systemctl stop rsyncd
systemctl disable rsyncd
rm -f /etc/systemd/system/rsyncd.service
systemctl daemon-reload# 清理数据与用户
rm -rf /export/data/*
rm -rf ~/backup
dnf remove -y rsync
rm -f /etc/rsync.password /etc/rsyncd.conf
userdel -r rsync
userdel -r backup_user

📝 总结:本笔记涵盖 Rsync 的本地/远程同步、定时备份(crontab)、实时同步(inotify)、以及守护进程(rsyncd)四种核心模式,适用于运维自动化、灾备、日志同步等场景。生产环境中推荐 SSH + rsync 组合以保障安全性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询