Rsync 服务实战练习

一、备份的概念

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特性

  1. rsync 支持复制特殊文件,包括符号链接、设备文件等特殊文件类型。
  2. 提供排除功能,可指定不需要同步的文件或目录,类似 tar 命令的排除选项。
  3. 通过 -P 参数可保持源文件的完整属性,包括权限、时间戳、软硬链接、所有者和组信息。
  4. 采用增量同步机制,仅传输变化的数据,显著提升传输效率,类似 tar -N 的功能。
  5. 支持多种传输协议,可与 rcp、rsh、ssh 等配合使用,但本身不提供数据加密。
  6. 支持进程模式传输,可通过 socket 实现服务端和客户端之间的文件传输,支持匿名或认证方式。

2.3 生产场景备份方案

  1. 使用 cron 定时任务配合 rsync 实现客户服务器数据自动同步到备份服务器。
  2. 制定全网数据备份方案,解决公司重要数据备份混乱问题。
  3. 采用本地打包后通过 rsync 和 inotify 实现全网数据统一备份,并设置备份结果监控告警机制。
  4. 定期将 IDC 机房数据备份至公司内部服务器,防范自然灾害导致的数据丢失风险。
  5. 通过实时同步机制解决存储服务器单点故障问题,确保数据高可用性。

2.4 Rsync的备份方式

  1. 全量备份:将数据完全拷贝下来
  2. 增量备份:将只发生变化的数据再次备份

三、Rsync应用场景

3.1 Rsync的传输方式

  1. pull:拉(客户端将需要的数据下载到本地)
  2. push:推(将客户端的数据上传到服务器)

3.2 传输过程中存在的问题

推:如果推送的客户端机器过多,容易造成推送数据缓慢
拉:如果客户端过多,下载数据会对服务端造成压力过大

3.3 面试题

  1. rsync对多个server端,怎么有效快速的环节推送和拉取时的速度和压力?

首先是传输优化。我一般会使用-az参数,这样可以压缩传输并保留文件属性,大幅减少网络占用。对于大规模备份任务,我会用–bwlimit控制带宽使用,避免影响正常业务运行。
其次是采用并行处理策略。我会把不同目录分组,创建多个rsync任务同时执行。
第三,分层架构很重要。我习惯设计树状备份结构,而不是所有服务器直接连到备份中心。比如先在各区域设置中转服务器收集数据,再统一传到主备份中心,这样主备份服务器压力会小很多。
时间调度也不能忽视。我会错开各服务器的备份窗口,用crontab设置不同时段执行不同任务,避免网络拥堵。

  1. 异地备份,你会怎么解决?

安全性是第一位的。我通常使用SSH隧道加密传输:rsync -avz -e ssh。对于金融这类高安全要求的客户,我会建议专用VPN或加密专线连接异地中心。
关于网络传输,条件允许的话当然是专线最好。如果只能走公网,我会部署WAN加速设备,并根据业务情况调整带宽限制 - 比如工作日白天限制在30%带宽,晚上和周末则可以放宽到70%。
在备份策略上,我采用分级方案:本地保留7天完整备份用于快速恢复,异地主要存储重要数据的长期备份。根据数据重要性,我会对数据分类,核心业务数据优先传输。
传输优化很关键。rsync的增量特性非常适合异地备份,第一次全量备份后(大数据量时甚至考虑物理介质离线传输初始数据),后续只传变化部分,配合去重和压缩,可以大大减少传输量。
自动化是我特别关注的点。我会构建完整的验证系统,每次备份后自动检查数据完整性,通过邮件或短信通知管理员结果。我在一家电商做运维时,就是通过这套系统及时发现了备份异常,避免了潜在的数据丢失风险。
最后,我推荐多级备份架构:本地→同城异地→远程异地的多层保护,同时用不同存储介质增强容灾能力。

四、Rsync传输模式

1. 传输模式

  1. 本地传输模式
  2. 远程传输模式
  3. 守护进程模式

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 守护进程传输模式

  1. 为什么使用守护进程模式?
    1. sync 传输时,使用系统用户和系统密码(不安全)
    2. 使用普通用户的时,会出现权限不足的情况
  2. 守护进程传输模式语法
# 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  # 模块名

注意:

  1. 拉取服务端模块名对应的目录下的文件,拉取的文件可以使任意属主属组
  2. 推送时,远端模块对应的目录权限一定是 rsyncd 服务配置的用户

1.2 守护进程模式实战

1.2.1 环境准备

主机角色IP主机名
Rsync 服务端10.0.0.200backup
Rsync 客户端10.0.0.201web

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
web10.0.0.201
backup10.0.0.200

5.2 需求

5.2.1 客户端:

  1. 客户端提前准备好要放的备份的目录
  2. 客户端在本地打包备份(系统配置文件、应用配置等)拷贝至备份目录
  3. 客户端最后将备份的数据进行推送至备份服务器
  4. 客户端每次凌晨1点定时执行该脚本
  5. 客户端服务器本地保留最近7天的数据,避免浪费磁盘空间

5.2.2 服务端需求:

  1. 服务端部署rsync,用于接收客户端推送过来的备份数据
  2. 服务端需要每天校验客户端推送过来的数据是否完整
  3. 服务端需要每天校验的结果通知给管理员
  4. 服务端仅保留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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值