rsync数据备份
[TOC]
备份环境准备
主机名 | 内网IP | 外网IP | 角色 |
web01 | 172.16.1.7 | 10.0.0.7 | 备份客户端 |
backup | 172.16.1.41 | 10.0.0.41 | 备份客户端 |
rsync概述
为什么使用rsync不用scp
1.scp是基于ssh协议的命令,不是一个服务
2.scp每次都基于全量拷贝,rsync支持增量拷贝
cp rm scp tar
备份类型
- 全量备份
- 将数据全部备份出来
- 增量备份
- 基于上一次备份,新增备份的数据备份出来
- 差异备份
- 基于全量备份,新增部分的数据备份出来
rsync传输模式
注意:rsync拷贝目录时,加/和不加/是有区别的
举例:
/etc/ :将etc目录下的所有文件拷贝过去,不包括目录本身
/etc :将etc目录本身和目录下的所有文件一并拷贝过去
- 本地模式(cp)
Local: rsync [OPTION...] SRC... [DEST]
cp [OPTION]... SOURCE DEST
rsync [选项] 源文件.. 目标路径
- 远程模式
Access via remote shell:
Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST
拉:rsync [选项] [用户@]主机IP:文件路径 本机目录
推:rsync [选项] 本机文件 [用户@]主机IP:目录
如果不加 用户@ 默认以当前系统登录的用户为用户名
- 守护进程模式
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录
推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名
企业中为啥使用守护进程模式
1.远程模式和scp差不多,基于ssh协议
2.需要知道系统的用户名和密码
3.守护进程不需要ssh协议,服务启动后,自带端口
4.守护进程可以设置匿名用户,不需要使用系统用户
rsync选项
-a:归档模式传输, 等于-tropgDl
-----------------------------------
-t:time 保持文件的时间信息
-r:拷贝目录时,递归拷贝
-o:owner 保持文件的属主信息
-g:group 保持文件的属组信息
-p:perm 保持文件的权限信息
-D:device 保持设备文件的信息
-l:link 保留软链接
------------------------------------
-v:显示同步过程
-z:压缩,提高传输效率
-P:显示进度
-L:保留软链接指向的目标文件
--exclude=PATTERN 指定排除不需要传输的文件模式
--exclude-from=file 指定排除文件
--bwlimit=1 限速传输
--partial 断点续传
--delete 决定数据是否要同步 rm
--password-file= 指定密码文件
rsync备份实战
准备备份环境
主机名 | WanIP | LanIP | 角色 |
web01 | 10.0.0.7 | 172.16.1.7 | rsync客户端 |
backup | 10.0.0.41 | 172.16.1.41 | rsync服务端 |
rsync工作模式
- 本地模式
- 远程模式
- 守护进程模式
rsync官网地址:https://rsync.samba.org/rsync监听端口:873
rsync运行架构:C/S Client/Server
架构类型
C/S Client/Server(客户端)
B/S Browser/Server(服务端)
rsync服务端的作用:存储备份数据的
服务端操作
# 1.安装
yum install -y rsync
# 2.配置
[root@backup <sub>]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
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
# 端口范围:1</sub>65535
# 配置文件详解
[root@backup <sub>]# cat /etc/rsyncd.conf
# 服务的用户
uid = rsync
# 服务的用户组
gid = rsync
# 该服务的监听端口
port = 873
# 不以root身份运行,传输数据不使用系统用户
fake super = yes
# 禁锢目录,不允许获取到root权限
use chroot = no
# 最大连接数,最多能有多少个客户端跟服务端的873端口建立链接
max connections = 200
# 超时时间
timeout = 600
# 忽略错误
ignore errors
# 只读 = false,不只读,可读可写
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.创建rsync系统用户
[root@backup </sub>]# useradd rsync -s /sbin/nologin -M
# 4.创房服务端的密码文件
[root@backup <sub>]# vim /etc/rsync.passwd
rsync_backup:1
[root@backup </sub>]# echo 'rsync_backup:1' > /etc/rsync.passwd
# 5.修改密码文件权限为 600
[root@backup <sub>]# chmod 600 /etc/rsync.passwd
# 6.创建备份目录
[root@backup </sub>]# mkdir /backup
# 7.修改备份目录的属主属组
[root@backup <sub>]# chown rsync:rsync /backup/
# 8.启动rsync服务并加入开机自启
[root@backup </sub>]# systemctl start rsyncd
[root@backup <sub>]# systemctl enable rsyncd
# 9.检查服务进程
[root@backup </sub>]# ps -ef|grep [r]sync
root 14949 1 0 17:47 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
# 10.检查服务端口
[root@backup ~]# netstat -lntup | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4284/rsync
tcp6 0 0 :::873 :::* LISTEN 4284/rsync
客户端操作
推:rsync [option..] 原文件 [用户名@]主机IP::模块名
rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup
# 报错情况:
1)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
1.用户输入错误
2.密码输入错误
3.密码文件的权限不是600
2)
@ERROR: Unknown module 'bak'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
1.模块名不认识
3)
rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
无法和172.16.1.41rsync服务建立连接
1.防火墙
2.selinux
3.服务没启动
4.服务的端口改了
4)
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
客户端的密码文件权限也必须是600,否则报错
# 0.安装
yum install -y rsync
# 1.客户端创建密码文件(客户端密码文件,只需要写密码,不需要写用户)
[root@web01 <sub>]# vim /etc/rsync.pass
1
# 2.客户端上的密码文件的权限也必须是600
[root@web01 </sub>]# chmod 600 /etc/rsync.pass
# 3.推数据
[root@web01 <sub>]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
sending incremental file list
sent 49 bytes received 20 bytes 138.00 bytes/sec
total size is 656 speedup is 9.51
# 4.使用环境变量免交互输入密码
[root@web01 </sub>]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup
排错过程
# 服务端
# 1.检查配置文件
[root@backup <sub>]# cat /etc/rsyncd.conf
# 2.检查密码文件的权限
[root@backup </sub>]# ll /etc/rsync.passwd
-rw------- 1 root root 20 May 16 17:37 /etc/rsync.passwd
# 3.检查密码文件中的内容
检查用户名是否和配置文件中的用户名一致
# 4.检查模块目录的权限
模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限
# 客户端
# 1.检查命令用户名
命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup
# 2.检查命令模块名
命令中的模块名要跟服务端配置文件中的模块名一致 backup
# 3.如果有密码文件,检查权限
600 root root
# 4.检查密码文件内容
只需要写密码
# 5.检查环境变量中的密码
[root@web01 ~]# echo $RSYNC_PASSWORD
1
密码是否和服务端密码文件保持一致
企业级备份案例
环境准备
主机名 | WanIP | LanIP | 角色 |
web01 | 10.0.0.7 | 172.16.1.7 | rsync客户端 |
nfs | 10.0.0.31 | 172.16.1.31 | rsync客户端 |
backup | 10.0.0.41 | 172.16.1.41 | rsync服务端 |
先决条件
# 1.时间同步
yum install -y ntpdate
/usr/sbin/ntpdate time1.aliyun.com
crontab -e
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null
# 2.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 3.关闭selinux
setenforce 0
sed -i 's#selinux=enforcing#selinux=disabled#g' /etc/sysconfig/selinux
客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下: /client_backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名: nfs_172.16.1.31_2022-05-16.tar.gz
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
如何效验一个数据的完整性
1.备份打包后,给压缩包做一个MD5加密
/client_backup/nfs_172.16.1.31_2022-05-16.tar.gz
md5sum nfs_172.16.1.31_2022-05-16.tar.gz > jiaoyan.txt
2.将校验文件,和压缩包一并传递到服务端
3.在服务端使用md5sum -c检查校验
# 完整传输
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: OK
# 被篡改或不完整
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
脚本实现客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下: `/client_backup `
mkdir /client_backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名: `nfs_172.16.1.31_2022-05-16.tar.gz`
cd /etc && tar zcf /client_backup/nfs_172.16.1.31_2022-05-16.tar.gz passwd
3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /client_backup/ rsync_backup@172.16.1.41::backup
4.客户端每天凌晨1点定时执行该脚本
find /client_backup -type f ! -mtime -7|xargs rm -f
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
crontab -e
00 01 * * * /bin/sh /root/bakup.sh >/dev/null
# 编写脚本
[root@web01 <sub>]# vim /root/backup.sh
# ! /bin/bash
bak_dir="/client_backup"
host_name=`hostname`
ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`
export RSYNC_PASSWORD=1
mkdir -p $bak_dir
cd /etc && \
tar zcf $bak_dir/${host_name}_${ip}_${date_time}.tar.gz passwd
cd $bak_dir && \
md5sum ${host_name}_${ip}_${date_time}.tar.gz > ${host_name}_${ip}_${date_time}.md5
#rsync -avz $bak_dir/ rsync_backup@172.16.1.41::backup
#find $bak_dir -type f ! -mtime -7|xargs rm -f
[root@web01 </sub>]# ll /client_backup/(先看一下,完事把后两行#号删了)
total 8
-rw-r--r-- 1 root root 69 May 16 19:55 web01_172.16.1.7_2022-05-16.md5
-rw-r--r-- 1 root root 551 May 16 19:55 web01_172.16.1.7_2022-05-16.tar.gz
# 1.创建客户端的备份目录
mkdir -p $bak_dir
# 2.进入备份目录,压缩备份文件
cd /etc && \
tar zcf $bak_dir/${host_name}_${ip}_${date_time}.tar.gz passwd
# 3.生成校验文件
cd $bak_dir && \
md5sum ${host_name}_${ip}_${date_time}.tar.gz > ${host_name}_${ip}_${date_time}.md5
# 4.推送数据到rsync服务端
rsync -avz $bak_dir/ rsync_backup@172.16.1.41::backup
# 5.保留7天内的文件
find $bak_dir -type f ! -mtime -7|xargs rm -f
脚本实现服务端需求
# 1.服务端部署rsync,用于接收客户端推送过来的备份数据
[root@backup <sub>]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
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
# 2.服务端需要每天校验客户端推送过来的数据是否完整
cd /backup/ && md5sum -c *2022-05-16.md5
# 3.服务端需要每天校验的结果通知给管理员
md5sum -c *2022-05-16.md5 |mail -s 'xxx' 123@qq.com
# 4.服务端仅保留180天的备份数据,其余的全部删除
find /backup -type f ! -mtime -180|xargs rm -f
# 配置发邮件
# 1.安装发邮件服务
yum install -y mailx
# 2.修改配置文件
[root@backup </sub>]# vim /etc/mail.rc
set from=123*<strong>@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=123</strong>*@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
# 编写脚本
bak_dir="/backup"
host_name=`hostname`
ip=`ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`
cd ${bak_dir} && \
md5sum -c *${date_time}.md5|mail -s "${date_time}_数据备份校验" 管理员邮箱 >/dev/null
find /backup -type f ! -mtime -180|xargs rm -f
测试crontab
# 客户端定时任务
crontab -e
# Usage: Sync Date By:zxw Date:2022/05/10
00 01 * * * /bin/sh /root/check_md5.sh &>/dev/null
# 服务端定时任务
crontab -e
# Usage: Sync Date By:zxw Date:2022/05/10
01 01 * * * /bin/sh /root/check_md5.sh &>/dev/null