Rsync数据备份工具
1、Rsync基本概述
rsync是一款开源的备份工具,可以在不同主机之间进行同步(windows和Linux之间 Mac和 Linux Linux和Linux),可实现全量备份与增量备份,因此非常适合用于架构集中式备份或异地等应用。
rsync官方地址:https://rsync.samba.org/
rsync监听端口:873
rsync运行架构:
C/S Client/Server
B/S Browser/Server
rsync常见的两种备份方式
- 完全备份
- 将数据全部备份
- 增量备份
- 基于上一次备份,新增部分的数据备份
示例:
假设客户端上有
file1file2file3文件,服务端上有file1文件,现要将客户端上的数据备份至服务端

完全备份,将客户端所有的数据内容file1、file2、file3全部备份至服务端 (效率低下, 占用空间)

增量备份,将客户端的file2、file3增量备份至服务端 (提高备份效率,节省空间, 适合异地备份 )
2、Rsync应用场景
2.1 数据推送(上传)
所有主机推送本地数据至Rsync备份服务器,这样会导致数据同步缓慢(适合少量数据备份)

2.2 数据拉取(下载)
rsync备份服务端拉取所有主机上的数据,这样操作会导致备份服务器压力比较大(适合较少服务器场景)

2.3 大量服务器备份场景

2.4 异地备份实现思路

3、Rsync传输模式
Rsync大致使用三种主要的数据传输方式
本地方式
远程方式
守护进程
3.1 rsync命令选项
-a //归档模式传输,等于-tropglD -v //详细模式输出,显示速率,文件数量等 -z //传输时进行压缩,提高效率 -r //递归传输,传输目录,传输目录时目录名称后加"/"表示传输目录下的所有文件 -t //保持文件时间信息 -o //保持文件属主信息 -g //保持文件属组信息 -p //保持文件权限 -l //保留软链接 -D //保持设备文件信息 -P //显示同步的过程及传输时的进度等信息 -L //保留软连接指向的目标文件 --delete //让目标目录和源目录数据保持一致 --bwlimit //限速传输 --exclude=PATTERN //指定排除不需要传输的文件模式 --exclude-from=FILE //排除FILE中指定模式的文件
3.2 本地模式
适用单个主机之间的数据传输(类似于cp命令)
具体用法如下:
Local: rsync [OPTION...] SRC... [DEST] rsync [选项] 源文件.. 目标路径
3.3 远程模式
基于ssh通道传输(类似scp命令)
注意:rsync借助ssh协议同步数据存在一些缺陷问题
- 使用系统用户(不安全)
- 使用普通用户(会导致权限不足的情况)
具体用法如下:
Access via remote shell: Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST 拉:rsync [选项] [用户@]主机IP:文件路径 本机目录 推:rsync [选项] 本机文件 [用户@]主机IP:目录
3.4 守护进程模式
Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录 推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名
4、Rsync服务实践
| 主机名 | IP | 角色 |
|---|---|---|
| server | 192.168.111.30 | rsync服务端 |
| client | 192.168.111.40 | rsync客户端 |
4.1 服务端配置
# 1.安装rsync [root@server ~]# yum install -y rsync # 2.修改服务配置文件/etc/rsyncd.conf [root@server ~]# vim /etc/rsyncd.conf uid = rsync #运行服务的用户 gid = rsync #运行服务的组 port = 873 #服务监听端口 fake super = yes #服务无需使用root用户身份,即可接收文件的完整属性 use chroot = no #禁锢目录,不允许获取root权限 max connections = 4 #最大连接数,最多能有多少个客户端跟服务端的873端口建立连接 timeout = 600 #超时时间 ignore errors #忽略错误 read only = false #客户是否只读 list = false #不允许查看模块信息 auth users = rsync_backup #定义虚拟用户,用户数据传输 secrets file = /etc/rsync.passwd #定义虚拟用户密码认证文件 log file = /var/log/rsyncd.log #日志文件存放的位置 ################################# [backup] # 模块名 comment = welcome to oldboyedu backup! # 模块的描述信息 path = /backup # 数据存放目录 # 3.创建用户以及数据存放目录 [root@server ~]# useradd -r -M -s /sbin/nologin rsync [root@server ~]# mkdir /backup [root@server ~]# chown -R rsync.rsync /backup # 4.创建虚拟用户密码文件并设置权限 [root@server ~]# vim /etc/rsync.passwd rsync_backup:passwd123 [root@server ~]# chmod 600 /etc/rsync.passwd # 5.关闭防火墙、selinux [root@server ~]#systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) # 6.重启服务并设置服务开机自启 [root@server ~]# systemctl restart rsyncd [root@server ~]# systemctl enable rsyncd # 7.检查服务端口是否开启 [root@server ~]# ss -anltup | grep "rsync" tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2320,fd=3)) tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2320,fd=5))
4.2 客户端配置
# 1.安装rsync [root@client ~]# yum -y install rsync # 2.配置传输密码 ---方法1:将密码写入文件 [root@client ~]# echo 'passwd123' > /etc/rsync.pass [root@client ~]# cat /etc/rsync.pass passwd123 [root@client ~]# chmod 600 /etc/rsync.pass --测试收发数据: [root@client ~]#rsync -avz --password-file=/etc/rsync.pass /root/file1 rsync_backup@192.168.111.30::backup sending incremental file list file1 sent 87 bytes received 43 bytes 260.00 bytes/sec total size is 0 speedup is 0.00 [root@server ~]# ls /backup/ file1 ---方法2:使用密码环境变量RSYNC_PASSWORD [root@client ~]# export RSYNC_PASSWORD='passwd123' --测试收发数据: [root@client ~]# touch file2 [root@client ~]#rsync -avz /root/file2 rsync_backup@192.168.111.30::backup sending incremental file list file2 sent 88 bytes received 43 bytes 87.33 bytes/sec total size is 0 speedup is 0.00 [root@server ~]# ls /backup/ file1 file2
4.3 设置systemctl 管理 rsync 服务
# 1.创建/etc/sysconfig/rsyncd 文件 [root@server ~]#vim /etc/sysconfig/rsyncd OPTIONS="" # 2. 创建rsyncd.service 文件 [root@server ~]#vim /lib/systemd/system/rsyncd.service [Unit] Description=fast remote file copy program daemon [Service] EnvironmentFile=/etc/sysconfig/rsyncd ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf --no-detach ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=30s [Install] WantedBy=multi-user.target
4.4 报错信息
# 用户密码认证失败 [root@client ~]#rsync -avz --password-file=/etc/rsync.pass /root/file1 rsync_hzz@192.168.111.30::backup @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1661) [sender=3.1.3] ## 原因: 1.用户输入错误 2.密码输入错误 3.密码文件的权限不是600 4.传输的文件不存在 [root@client ~]# rsync -avz /etc/passwd rsync_backup@192.168.111.30::backup rsync: failed to connect to 192.168.111.30 (192.168.111.30): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.3] 无法和192.168.111.30rsync服务建立连接 ## 原因: 1.防火墙 2.selinux 3.服务没启动 4.服务的端口改了
4.5 排错思路
## 服务端 # 1.检查配置文件 [root@server ~]# cat /etc/rsyncd.conf # 2.检查密码文件的权限 [root@server ~]#ll /etc/rsync.passwd -rw-------. 1 root root 23 9月 2 16:30 /etc/rsync.passwd # 3.检查密码文件中的内容 检查用户名是否和配置文件中的用户名一致 # 4.检查模块目录的权限 模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限 ## 客户端 # 1.检查命令用户名 命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup # 2.检查命令模块名 命令中的模块名要跟服务端配置文件中的模块名一致 backup # 3.如果有密码文件,检查权限 600 root root # 4.检查密码文件内容 只需要写密码 # 5.检查环境变量中的密码 [root@server ~]# echo $RSYNC_PASSWORD passwd123
5、Rsync企业级备份案例
环境准备
| 主机名 | IP | 角色 |
|---|---|---|
| server | 192.168.111.30 | rsync服务端 |
| client | 192.168.111.40 | rsync客户端 |
客户端需求
- 客户端每天凌晨3点备份/etc目录至/backup下以"主机名_IP地址_当前时间命名"的目录中
- 客户端推送/backup目录下数据备份目录至Rsync备份服务器
- 客户端只保留最近七天的备份数据,避免浪费磁盘空间
服务端需求
- 服务端部署rsync服务,用于接收用户的备份数据
- 服务端每天校验客户端推送过来的数据是否完整,并将结果以邮件的方式发送给管理员
- 服务端仅保留6个月的备份数据
注意:所有服务器的备份目录均为/backup,所有脚本存放目录均为/scripts。
服务端部署rsync服务
[root@server ~]# mkdir /scripts [root@server ~]# vim /scripts/rsync_server.sh #!/bin/bash #安装rsync服务 yum -y install rsync #修改服务配置文件 cat > /etc/rsyncd.conf << EOF uid = rsync gid = rsync port = 873 fake super = yes use chroot = no max connections = 4 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.passwd log file = /var/log/rsyncd.log [backup] comment = welcome to oldboyedu backup! path = /backup EOF #创建服务用户,创建数据备份目录并设置权限 useradd -r -M -s /sbin/nologin rsync mkdir /backup chown -R rsync.rsync /backup #生成数据传输用户密码文件并设置权限 echo "rsync_backup:passwd123" > /etc/rsync.passwd chmod 600 /etc/rsync.passwd #关闭防火墙和selinux systemctl stop firewalld setenforce 0 #设置服务开机自启,并重启服务 systemctl enable rsyncd systemctl restart rsyncd [root@server ~]# chmod +x /scripts/rsync_server.sh [root@server ~]# /scripts/rsync_server.sh
客户端备份数据并推送至rsync服务器
[root@client ~]# mkdir /scripts [root@client ~]# vim /scripts/etc_backup.sh #!/bin/bash #客户端安装rsync yum -y install rsync #配置rsync客户端虚拟用户密码 export RSYNC_PASSWORD='passwd123' #创建备份目录 mkdir -p /backup/$(hostname)_$(ifconfig | awk 'NR==2{print $2}')_$(date "+%F") #打包备份/etc目录下的数据至备份目录中 tar -zcf /backup/$(hostname)_$(ifconfig | awk 'NR==2{print $2}')_$(date "+%F")/etc_backup.tar.gz /etc/ #计算备份文件的校验值 md5sum /backup/$(hostname)_$(ifconfig | awk 'NR==2{print $2}')_$(date "+%F")/etc_backup.tar.gz > /backup/$(hostname)_$(ifconfig | awk 'NR==2{print $2}')_$(date "+%F")/checksum.txt #将打包备份好的数据推送到rsync备份服务器 rsync -az /backup/$(hostname)_$(ifconfig | awk 'NR==2{print $2}')_$(date "+%F") rsync_backup@192.168.111.30::backup #删除七天前的备份文件 find /backup/ -mtime +7 | xargs rm -rf [root@client ~]# chmod +x /scripts/etc_backup.sh [root@client ~]# crontab -e 0 3 * * * /scripts/etc_backup.sh
服务端校验数据并将结果以邮件发送给管理员:
#配置邮件服务 [root@server ~]# yum -y install mailx [root@server ~]# cat > /etc/mail.rc << EOF # 发送的邮件地址 set from=483607723@qq.com # 发送邮件服务器 set smtp=smtps://smtp.qq.com:465 # 发件人账号,一般情况下为邮件地址 set smtp-auth-user=483607723@qq.com # 发件邮箱的授权码 set smtp-auth-password=xxxxxxxxxx # 认证方式 set smtp-auth=login # 忽略证书警告 set ssl-verify=ignore # 证书所在目录 set nss-config-dir=/etc/pki/nssdb/ EOF #配置脚本校验数据并将结果发送给管理员 [root@server ~]# vim /scripts/checksum.sh #!/bin/bash #校验备份数据并将结果发送给管理员 md5sum -c /backup/client_192.168.111.30_$(date "+%F")/checksum.txt | mail -s "/backup/client_192.168.111.30_$(date "+%F")" 483607723@qq.com #删除6个月以前的备份数据 find /backup/ -mtime +180 | xargs rm -rf [root@server ~]# chmod +x /scripts/checksum.sh [root@server ~]# crontab -e 0 5 * * * /scripts/checksum.sh
QQ邮箱的授权码获取
进入邮箱后–>设置–>账户,开启下图中的SMTP,点击生成授权码
