一、备份的概念
1.1 备份的介绍以及原因
备份概念:备份就是把重要的数据或文件再次复制一份保存起来(增加一个与原来一摸一样的文件)
原因: 因为数据非常重要,假如出现事故,就需要恢复数据
1.2 备份的常用工具
本地复制 cp
远程传输 scp、rsync
二、Rsync服务概念
2.1 Rsync介绍
rsync 是一个强大的文件同步工具,它最大的特点就是"增量同步"。简单来说,当你要复制或同步文件时,rsync 会先比较源文件和目标文件的差异,只传输那些发生变化的部分,而不是每次都完整复制所有文件。这就像是你和朋友一起写作业,第二次交作业时,你只需要把修改过的部分告诉老师,而不是重新写一遍整份作业。这种工作方式让 rsync 比传统的复制命令(如 scp 或 cp)要快得多,特别是在处理大文件或需要频繁同步的场景下。它既可以在本地不同目录之间同步,也可以通过网络在远程服务器之间同步,是一个非常实用的文件管理工具。
rsync 的"快速检查"(quick check)算法是其高效同步的核心。这个算法会先检查文件的大小和最后修改时间,只有当这些基本属性发生变化时,才会触发同步操作。比如,如果你有一个 1GB 的文件,但只修改了其中的一小部分,rsync 会通过比较发现只有这部分内容发生了变化,就只传输这变化的部分,而不是整个 1GB 的文件。这种智能的检查机制大大减少了数据传输量,提高了同步效率。如果你需要更细致的同步控制,比如基于文件权限、所有者等属性的变化来同步,也可以通过指定相应的参数来实现。
Rsync的默认监听端口:873
Rsync运行模式是c/s架构(client/server)
2.2 Rsync特性
- rsync 支持复制特殊文件,包括符号链接、设备文件等特殊文件类型。
- 提供排除功能,可指定不需要同步的文件或目录,类似 tar 命令的排除选项。
- 通过 -P 参数可保持源文件的完整属性,包括权限、时间戳、软硬链接、所有者和组信息。
- 采用增量同步机制,仅传输变化的数据,显著提升传输效率,类似 tar -N 的功能。
- 支持多种传输协议,可与 rcp、rsh、ssh 等配合使用,但本身不提供数据加密。
- 支持进程模式传输,可通过 socket 实现服务端和客户端之间的文件传输,支持匿名或认证方式。
2.3 生产场景备份方案
- 使用 cron 定时任务配合 rsync 实现客户服务器数据自动同步到备份服务器。
- 制定全网数据备份方案,解决公司重要数据备份混乱问题。
- 采用本地打包后通过 rsync 和 inotify 实现全网数据统一备份,并设置备份结果监控告警机制。
- 定期将 IDC 机房数据备份至公司内部服务器,防范自然灾害导致的数据丢失风险。
- 通过实时同步机制解决存储服务器单点故障问题,确保数据高可用性。
2.4 Rsync的备份方式
- 全量备份:将数据完全拷贝下来
- 增量备份:将只发生变化的数据再次备份
三、Rsync应用场景
3.1 Rsync的传输方式
- pull:拉(客户端将需要的数据下载到本地)
- push:推(将客户端的数据上传到服务器)
3.2 传输过程中存在的问题
推:如果推送的客户端机器过多,容易造成推送数据缓慢
拉:如果客户端过多,下载数据会对服务端造成压力过大
3.3 面试题
- rsync对多个server端,怎么有效快速的环节推送和拉取时的速度和压力?
首先是传输优化。我一般会使用-az参数,这样可以压缩传输并保留文件属性,大幅减少网络占用。对于大规模备份任务,我会用–bwlimit控制带宽使用,避免影响正常业务运行。
其次是采用并行处理策略。我会把不同目录分组,创建多个rsync任务同时执行。
第三,分层架构很重要。我习惯设计树状备份结构,而不是所有服务器直接连到备份中心。比如先在各区域设置中转服务器收集数据,再统一传到主备份中心,这样主备份服务器压力会小很多。
时间调度也不能忽视。我会错开各服务器的备份窗口,用crontab设置不同时段执行不同任务,避免网络拥堵。
- 异地备份,你会怎么解决?
安全性是第一位的。我通常使用SSH隧道加密传输:rsync -avz -e ssh。对于金融这类高安全要求的客户,我会建议专用VPN或加密专线连接异地中心。
关于网络传输,条件允许的话当然是专线最好。如果只能走公网,我会部署WAN加速设备,并根据业务情况调整带宽限制 - 比如工作日白天限制在30%带宽,晚上和周末则可以放宽到70%。
在备份策略上,我采用分级方案:本地保留7天完整备份用于快速恢复,异地主要存储重要数据的长期备份。根据数据重要性,我会对数据分类,核心业务数据优先传输。
传输优化很关键。rsync的增量特性非常适合异地备份,第一次全量备份后(大数据量时甚至考虑物理介质离线传输初始数据),后续只传变化部分,配合去重和压缩,可以大大减少传输量。
自动化是我特别关注的点。我会构建完整的验证系统,每次备份后自动检查数据完整性,通过邮件或短信通知管理员结果。我在一家电商做运维时,就是通过这套系统及时发现了备份异常,避免了潜在的数据丢失风险。
最后,我推荐多级备份架构:本地→同城异地→远程异地的多层保护,同时用不同存储介质增强容灾能力。
四、Rsync传输模式
1. 传输模式
- 本地传输模式
- 远程传输模式
- 守护进程模式
1.1.1 本地方式
类似于 cp-复制,不支持推送和拉取,只是单纯复制
# 本地文件同步示例
rsync -avz ./1.txt /mnt/
# 参数说明:
# -a: 归档模式,保持文件属性
# -v: 显示详细输出
# -z: 压缩传输
# ./1.txt: 源文件
# /mnt/: 目标目录
# 与 cp 命令对比
cp ./1.txt /mnt/ # cp 每次都是全量复制,会提示覆盖
rsync -avz ./1.txt /mnt/ # rsync 只传输变化的部分,文件未变化则不传输
1.1.2 远程传输模式
# Pull 模式拉取数据示例
rsync -avz root@10.0.0.200:/root/1.txt ./
# 命令结构说明:
# rsync: 同步命令
# -avz: 参数组合
# -a: 归档模式
# -v: 显示详细输出
# -z: 压缩传输
# root@10.0.0.200: 远程服务器用户和IP
# /root/1.txt: 远程源文件路径
# ./: 本地目标目录
# 实际应用场景:
# 从 web(10.0.0.200) 拉取文件到 web
rsync -avz root@10.0.0.200:/root/1.txt ./
# 拉取远程目录示例
rsync -avz root@10.0.0.200:/data/backup/ ./
rsync -avz root@10.0.0.200:/data/backup ./
# Push 推送命令语法
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
# 推送目录示例 - 本地推送到远程服务器
rsync -avz ./backup/ root@10.0.0.200:/data/
rsync -avz ./backup root@10.0.0.200:/data/
# 命令结构分析
rsync # 命令
-avz # 参数
./backup # 本地文件/目录
root # 远端服务器用户
10.0.0.200 # 远端主机 ip
/data/ # 远端服务器位置
# 普通用户推送示例
rsync -avz ./backup 10.0.0.200:/data/
rsync -avz ./backup admin@10.0.0.200:/home/admin/backup
注意:当不写用户推送或拉取时,默认使用当前用户连接远端主机同样的用户。普通用户也可以推送,只能推送至普通用户有权限的目录下
1.1.3 守护进程传输模式
- 为什么使用守护进程模式?
- sync 传输时,使用系统用户和系统密码(不安全)
- 使用普通用户的时,会出现权限不足的情况
- 守护进程传输模式语法
# pull 拉取数据命令语法
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
# pull 拉取数据示例
# 客户端从备份服务器拉取数据
rsync -avz backup_user@10.0.0.200::data_backup ./
# 命令结构分析
rsync # 命令
-avz # 参数
backup_user # 虚拟用户
@ # 分隔符
10.0.0.200 # 远端主机
::data_backup # 模块名
# push 推送数据命令语法
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
# 客户端推送数据到备份服务器示例
rsync -avz data_files/ backup_sync@10.0.0.200::daily_backup
# 命令结构分析
rsync # 命令
-avz # 参数
data_files/ # 本地文件
backup_sync # 虚拟用户
@ # 分隔符
10.0.0.201 # 远端主机
::daily_backup # 模块名
注意:
- 拉取服务端模块名对应的目录下的文件,拉取的文件可以使任意属主属组
- 推送时,远端模块对应的目录权限一定是 rsyncd 服务配置的用户
1.2 守护进程模式实战
1.2.1 环境准备
主机角色 | IP | 主机名 |
---|---|---|
Rsync 服务端 | 10.0.0.200 | backup |
Rsync 客户端 | 10.0.0.201 | web |
1.2.2 安装rsync(客户端和服务端都安装)
yum install -y rsync
1.2.3 配置rsync(服务端)
# 全局设置
uid = rsync # 运行rsync守护进程的用户
gid = rsync # 运行rsync守护进程的组
port = 873 # 监听端口(rsync标准端口)
fake super = yes # 允许保留文件权限和所有者信息
use chroot = no # 不使用chroot环境(安全性较低)
max connections = 200 # 最大允许连接数
timeout = 600 # 连接超时时间(秒)
ignore errors # 忽略传输错误继续运行
read only = false # 允许写入操作(非只读)
list = false # 禁止列出可用模块
auth users = rsync_backup # 授权用户名
secrets file = /etc/rsyncd.passwd # 密码文件位置
log file = /var/log/rsyncd.log # 日志文件位置
# 模块定义
[backup] # 模块名称为"backup"
comment = welcome to backup! # 模块描述信息
path = /backup # 模块对应的实际目录路径
1.2.4 创建系统用户(服务端)
useradd rsync -s /sbin/nologin -M
1.2.5 创建虚拟用户的密码文件并授权(服务端)
echo "rsync_backup:123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
1.2.6 创建文件目录(服务端)
mkdir /backup
chown -R rsync.rsync /backup/
1.2.7 启动服务(服务端)
systemctl start rsyncd
systemctl enable rsyncd
netstat -lntp / ss -lntp
1.2.8 客户端验证
# 方式一:输入密码的方式
rsync -avz rsync_backup@10.0.0.200::backup ./
sync -avz backup/ rsync_backup@10.0.0.200::backup
# 方式二:指定密码文件的方式
# 客户端添加密码文件
echo "123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
rsync -avz rsync_backup@10.0.0.200::backup ./ --password-file=/etc/rsync.passwd
sync -avz backup/ rsync_backup@10.0.0.200::backup --password-file=/etc/rsync.passwd
# 方式三:配置环境变量的方式
export RSYNC_PASSWORD=123456
rsync -avz rsync_backup@10.0.0.200::backup ./
rsync -avz backup/ rsync_backup@10.0.0.200::backup
1.2.9 rsync常见错误
# 1. 报错内容:
rsync -avz rsync_backup@10.0.0.200::backup ./backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
# 原因: 模块名字配置错误
# 2. 报错内容:
rsync -avz rsync_backup@10.0.0.200::backup ./backup
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
# 原因:
1. 服务端密码文件不存在(名字写错了/没有创建/配置文件错了)
2. 密码文件权限不是600
3. 服务端密码文件用户名或密码错误
4. 客户端密码输入错误或密码文件内容与服务端不一致
# 3. 报错内容:
rsync -avz rsync_backup@10.0.0.200::backup ./backup
rsync: failed to connect to 10.0.0.200 (10.0.0.200): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [Receiver=3.1.2]
# 原因: 服务端防火墙开启
# 4. 报错内容:
rsync -avz rsync_backup@10.0.0.200::/backup ./backup
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
# 原因: "::"守护进程模式双冒号后面为模块名,不能使用目录
# 5. 报错内容:
rsync -avz ./backup rsync_backup@10.0.0.200::backup
sending incremental file list
rsync: failed to write xattr user.rsync.%stat for "backup" (in backup): Permission denied (13)
rsync: failed to write xattr user.rsync.%stat for "backup/file1" (in backup): Permission denied (13)
backup/
sent 215 bytes received 1,099 bytes 2,628.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
# 原因: 服务端推送文件的目录权限不足
# 6. 报错内容:
rsync -avz ./backup rsync_backup@10.0.0.200::backup
rsync: failed to connect to 10.0.0.200 (10.0.0.200): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
# 原因: 服务端rsyncd服务没有启动
# 7. 报错内容:
rsync -avz ./backup rsync_backup@10.0.0.200::backup
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
# 原因: 服务端模块对应的目录不存在
# 8. 报错内容:
rsync -avz /data/ rsync_backup@10.0.0.200::data
Password:
sending incremental file list
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: recv_generator: failed to stat "11_class.xlsx" (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
sent 81 bytes received 476 bytes 222.80 bytes/sec
total size is 12,437 speedup is 22.33
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
# 原因: selinux没有关闭
1.2.10 rsync命令选项/参数
选项 | 说明 |
---|---|
-a | 归档模式传输,等于-tropgDl |
-v | 详细模式输出,打印速率,文件数量等 |
-z | 传输时进行压缩以提高效率 |
-r | 递归传输目录及子目录,即目录下得所有目录都同样传输 |
-t | 保持文件时间信息 |
-o | 保持文件属主信息 |
-p | 保持文件权限 |
-g | 保持文件属组信息 |
-l | 保留软连接 |
-P | 显示同步过程及传输时的进度等信息 |
-D | 保持设备文件信息 |
-L | 保留软连接指向的目标文件 |
-e | 使用的信道协议,指定替代rsh的shell程序 |
–exclude=PATTERN | 指定排除不需要传输的文件模式 |
–exclude-from=file | 文件名所在的目录文件 |
–bwlimit=100 | 限速传输 |
–partial | 断点续传 |
–delete | 让目标目录和源目录数据保持一致 |
–password-file=xxx | 使用密码文件 |
五、Rsync备份案例
5.1 准备服务器
主机名 | IP |
---|---|
web | 10.0.0.201 |
backup | 10.0.0.200 |
5.2 需求
5.2.1 客户端:
- 客户端提前准备好要放的备份的目录
- 客户端在本地打包备份(系统配置文件、应用配置等)拷贝至备份目录
- 客户端最后将备份的数据进行推送至备份服务器
- 客户端每次凌晨1点定时执行该脚本
- 客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
5.2.2 服务端需求:
- 服务端部署rsync,用于接收客户端推送过来的备份数据
- 服务端需要每天校验客户端推送过来的数据是否完整
- 服务端需要每天校验的结果通知给管理员
- 服务端仅保留6个月的备份数据,其余的全部删除
5.3 客户端
5.3.1 创建备份目录
hostname
hostname -I | awk '{print $1}'
date +%F
mkdir /backup/`hostname`_`hostname -I | awk '{print $1}'_`date +%F` -p
mkdir /backup/$(hostname)_$(hostname -I | awk '{print $1}')_$(date +%F) -p
cd /backup/
5.3.2 打包文件并放到指定目录下
tar zcf /backup/`hostname`_`hostname -I | awk '{print $1}'_`date +%F`/file2.tar.gz /etc/passwd
5.3.3 推送文件
rsync -avz /backup/web_10.0.0.200_2025-02-13 rsync_backup@10.0.0.200::backup
5.3.4 写成脚本并优化
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}'
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.推送文件
export RSYNC_PASSWORD=123
rsync -az $SRC/$DEST rsync_backup@10.0.0.200::backup
5.3.5 客户端设置凌晨1点定时执行该脚本
crontab -e
#备份文件
* * * * * /bin/bash /scripts/client.sh
crontab -l
5.3.6 删除七天的数据
#创建一个月数据
for i in {1..30};do date -s 2020/02/$i;sh /scripts/client.sh;done
#删除七天前数据
find /backup/ -type d -mtime +7 | xargs rm -rf
5.3.7 最终客户端脚本完整版
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $1}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.给文件添加证书信息
md5sum $SRC/$DEST/file.tar.gz > $SRC/$DEST/flag.txt
#5.推送文件
export RSYNC_PASSWORD=123456
rsync -az $SRC/$DEST rsync_backup@10.0.0.200::backup
#6.只保留七天的数据
find $SRC -type d -mtime +7 | xargs rm -rf
5.3.8 客户端脚本判断文件是否存在
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
HOST=$(hostname)
ADDR=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F)
DEST=${HOST}_${ADDR}_${DATE}
#2.创建目录
mkdir -p $SRC/$DEST
#3.备份文件
cd / && \
[ -f $SRC/$DEST/sys.tar.gz ] || tar czf $SRC/$DEST/sys.tar.gz etc/fstab etc/passwd && \
#4.使用md5sum做标记
[ -f $SRC/$DEST/flag_$DATE ] || md5sum $SRC/$DEST/sys.tar.gz > $SRC/$DEST/flag_$DATE
#5.本地推送到备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $SRC/$DEST rsync_backup@10.0.0.200::backup
#6.保留最近七天数据
find $SRC/ -type d -mtime +7|xargs rm -rf
5.4 服务端
服务端脚本
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
DATE=$(date +%F)
#2.验证文件的完整性
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
#3.报验证结果发送给管理员
mail -s "数据验证结果" admin@qq.com < $SRC/result_$DATE
#4.只保留180天数据
find $SRC -type d -mtime +180 | xargs rm -rf