第一章 rsync介绍
作⽤:
Rsync是⼀款开源的传输⼯具,可以⽤于不同主机之间同步传输数据,可以实现全量备份与增量备份
运⾏端⼝:
rsync默认运⾏端⼝:873
⼯作模式:
rsync有三种⼯作模式:
1.本地模式:类似于cp命令,不常⽤
2.远程模式:常⽤,在不同的主机之间传输数据
3.后台服务模式:常⽤,⽤于实时同步数据,安全性较好
第二章 备份⽅式介绍
1.备份的⽅式
从备份的⽅式来说,共有两种备份:
1.全量备份:将客户端所有的数据内容全部备份至服务端(效率低下,占用空间)
2.增量备份:将客户端的增量备份至服务端(提高备份效率,节省空间,适合异地备份)
2.备份的架构

rsync-备份架构-0423.png
第三章 rsync本地模式和远程模式
1.命令说明 (1V4)
安装命令:
yum install rsync -y
命令格式:
Usage:
#本地模式
rsync [OPTION]... SRC [SRC]... DEST
1)本地备份:
src: 要备份的数据信息
dest:备份到什么路径中
#远程服务模式,推送的⽅式,将⾃⼰的数据发送到远程服务器
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
#远程服务模式,拉取的⽅式,从远程服务器拉取数据
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]
2.本地模式
a. 本地备份数据(cp)
[root@nf01 backup]# cp /etc/host /tmp
[root@nf01 backup]# ll /tmp/host
-rw-r--r-- 1 root root 371 May 6 16:11 /tmp/hosts
[root@nf01 backup]# rsync /etc/host /tmp/host_rsync
[root@nf01 backup]# ll /tmp/host_rsync
-rw-r--r-- 1 root root 371 May 6 16:12 /tmp/host_rsync
b. 远程备份数据
说明:scp命令它是全量模式备份
01.命令语法格式说明:
2)远程备份数据:(#最好是以root身份进行远程传输,因为有关权限要求)
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
[USER@] --- 以什么用户身份拉取数据(默认以当前用户)
HOST --- 指定远程主机ip地址或者主机名称
SRC --- 要拉取的数据信息
dest --- 保存到本地的路径信息
Push: rsync [OPTION...] SRC:... [USER@]HOST:DEST
SRC --- 本地要进行远程传输备份的数据
[USER@] --- 以什么用户身份推送数据(默认以当前用户)
HOST --- 指定远程主机ip地址或者主机名称
dest --- 保存到远程的路径信息
实例演示如下:
1.从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下(默认为root用户)
[root@nf01 ~]# rsync -rp /etc/hosts 10.0.0.41:/backup/hosts_rsync
root@10.0.0.41's password:
2.如以oldboy的身份从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下
[root@backup ~]# rsync -rp oldboy@nfs01:/etc/hosts /backup
oldboy@nf101's password:
[root@backup ~]# ll /backup/
-rw-r--r-- 1 root root 434 Jan 25 00:01 hosts
#若以olddog的身份从存储服务器主机上的/etc/hosts文件拉取到本地的/backup目录下,会报错
[root@backup ~]# rsync -rp olddog@10.0.0.31:/etc/hosts /backup
###
#说明:首先备份服务器上要有olddog用户,存储服务器上也要相应的olddog用户,其次还得要有权限(属主属组)
[root@backup ~]# ll /backup/
-rw-r--r-- 1 olddog olddog 434 Jan 25 00:01 hosts
3.需求把存储服务器里的/etc/hosts文件备份到备份服务器指定的目录下
[root@nf01 ~]# scp -rp /etc/hosts root@10.0.0.41:/backup
root@10.0.0.41's password:
hosts 100% 371 42.8KB/s 00:00
-r --- 递归复制传输数据
-p --- 保持文件属性信息不变
[root@nf01 ~]# rsync -rp /etc/hosts root@10.0.0.41:/backup/hosts_rsync
root@10.0.0.41's password:
##说明以上备份的都是文件
02.rsync远程备份目录--(rsync命令它是增量模式备份:如果执行命令多次,它会进行比较看是否已有)
[root@nf01 ~]# rsync -rp /oldboy root@10.0.0.41:/backup (备份的目录后面没有'/')
root@10.0.0.41's password:
[root@backup ~]# ll /backup
total 0
drwxr-xr-x 2 root root 48 May 6 16:22 oldboy
[root@backup ~]# tree /backup/
/backup/
|--oldboy
|-- oldboy01.txt
|-- oldboy02.txt
|-- oldboy03.txt
[root@nf01 ~]# rsync -rp /oldboy/ root@10.0.0.41:/backup (备份的目录后面有'/')
root@10.0.0.41's password:
[root@backup ~]# ll /backup
total 0
-rw-r--r-- 1 root root 0 Dec 18 17:17 oldboy01.txt
-rw-r--r-- 1 root root 0 Dec 18 17:17 oldboy02.txt
-rw-r--r-- 1 root root 0 Dec 18 17:17 oldboy03.txt
03.总结:在使用rsync备份目录时
备份目录后面有 / -- /oldboy/:只将目录下的内容进行备份传输
备份目录后面没有/ -- /oldboy: 会将目录本身及下面的内容进行传输备份
c.替代删除命令(rm)
[root@nf01 ~]# mkdir /unll
[root@nf01 ~]# ll /null/
total 0
[root@nf01 ~]# rsync -rp --delete /null 10.0.0.41:/backup
root@10.0.0.41's password:
--delete 实现无差异同步数据
#说明:
无差异指的是我这个'null'目录没有数据,那么你/backup/目录下也就没有,用--delete就实现这个目的,
也会把你/backup/目录中跟我不一样的文件也会一并删除,这就叫无差异同步
面试题目:有一个存储数据信息的目录,目录中数据存储了50G数据,如何将目录中的数据快速删除: rm /目录/* -rf
使用rm命令删除小文件可以,但删除大文件效率极低,因为它要从磁盘读取数据;故删除大文件时则用rsync命令效率高
d.替代查看文件命令(ls)
[root@backup ~]# ls /etc/hosts
/etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r-- 371 2019/08/08 12:12:12 hosts
3.远程模式
#PUSH 推送模式
rsync -avz bakup41.txt 10.0.0.7:/root/
#PULL 拉取模式
rsync -avz 10.0.0.7:/root/web.txt /opt/web-41.txt
#传输目录注意
rsync -avz dir1 10.0.0.7:/root/ #传输整个目录,包含目录本身
rsync -avz dir1/ 10.0.0.7:/root/ #只传输目录下的文件,不包含目录本身
#不同主机之间同步数据
rsync -avz /root/html/ 10.0.0.41:/backup/web-7/
rsync -avz --delete /root/html/ 10.0.0.41:/backup/web-7/
#坑:如果/和一个空目录进行完全同步,那么效果和删根一样
rsync -avz --delete 10.0.0.41:/backup/web-7/ /
#坑:传输过程不限速导致带宽被占满
dd if=/dev/zero of=/root/5G.txt bs=100M count=50
rsync -avzP --bwlimit=50 5G.txt 10.0.0.7:/opt/
第四章 rsync服务模式-服务端配置
1.为什么需要服务模式
Rsync借助SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全)
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式:rsync自身非常重要的功能(不使用系统用户,更加安全)
2.rsync服务端部署
1) 安装rsync
yum install rsync -y
2) 修改配置文件
cat > /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
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
[data]
path = /data
EOF
3) 配置文件解释
uid = www # 运行进程的用户
gid = www # 运行进程的用户组
port = 873 # 监听端口
fake super = yes # 无需让 rsync 以 root 身份运行,允许接收文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义 rsync 服务用户连接认证密码文件路径
[backup] # 定义模块信息
comment = commit # 模块注释信息
path = /backup # 定义接收备份数据目录
4) 创建用户以及数据目录
[root@backup-41 ~]# useradd -u 1000 -M -s /sbin/nologin www
[root@backup-41 ~]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
[root@backup-41 ~]# mkdir /data
[root@backup-41 ~]# mkdir /backup
[root@backup-41 ~]# chown -R www:www /data/
[root@backup-41 ~]# chown -R www:www /backup/
5) 创建虚拟用户密码文件并授权
[root@backup-41 ~]# cat /etc/rsync.passwd
rsync_backup:oldboy
[root@backup-41 ~]# chmod 600 /etc/rsync.passwd
[root@backup-41 ~]# ll /etc/rsync.passwd
-rw------- 1 root root 20 Apr 20 10:54 /etc/rsync.passwd
5) 加入开机自启动
[root@backup-41 ~]# systemctl start rsyncd
6) 检查服务是否运行
[root@backup-41 ~]# ps -ef|grep [r]sync
root 12312 1 0 10:58 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup-41 ~]# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12312/rsync
tcp6 0 0 :::873 :::* LISTEN 12312/rsync
第五章 rsync服务模式-客户端配置
1) 安装rsync
[root@web-7 ~]# yum install rsync -y
2) 配置密码文件及授权
方法1:将密码写入文件
[root@web-7 ~]# echo "oldboy" > /etc/rsync.pass
[root@web-7 ~]# chmod 600 /etc/rsync.pass
[root@web-7 ~]# cat /etc/rsync.pass
oldboy
[root@web-7 ~]# ll /etc/rsync.pass
-rw------- 1 root root 7 Apr 20 11:16 /etc/rsync.pass
[root@web-7 ~]# rsync -avz --password-file=/etc/rsync.pass /root/web-7.txt rsync_backup@10.0.0.41::backup
[root@web-7 ~]# rsync -avz --password-file=/etc/rsync.pass /root/web-7.txt rsync_backup@10.0.0.41::data
方法2:使用环境变量-推荐
[root@web-7 ~]# export RSYNC_PASSWORD=oldboy
[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::data
疑问??
问题1:配置文件运行用户是www,为什么进程里是root
[root@backup-41 ~]# ps -ef|grep [r]sync
root 12312 1 0 10:58 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
原因:
因为www进程是工作进程,只有出现任务的时候才会被创建启动
问题2:发送主机的文件是root用户的,为什么接收过来显示是www用户
原因:
配置文件里控制,无论客户端的文件是什么用户,接收文件时都强制转换成www用户
第六章 rsync排错指南
1.报错1
[root@backup-41 ~]# rsync -avz bakup41.txt 10.0.0.7:/root/
root@10.0.0.7's password:
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2]
原因:
使用rsync传输,需要两边机器都安装有rsync软件
yum install rsync -y
2.报错2
[root@web-7 ~] # rsync -avz /root/111.txt rsync_backup@10.0.0.41::backup
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
密码文件里的虚拟用户名写错了
3.报错3
[root@web-7 ~]# rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
rsync: failed to connect to 10.0.0.41 (10.0.0.41): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
原因:
服务端启动命令出错,少加了d
systemctl start rsyncd
4.报错4
[root@web-7 ~]#rsync -avz /root/web-7.txt rsync_backup@10.0.0.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
[root@backup-41 ~]#cat /etc/rsyncd.conf
cat > /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
#省略部分信息
复制粘贴没有看清楚,直接一把梭了
5.报错5
[root@web-7 ~]# rsync -avz /root/a/123.txt rsync_backup@10.0.0.41::backup
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
客户端没有配置密码
客户端密码出错
6.报错6
[root@web-7 ~]# export RSYNC_PASSWORD=oldboy
[root@web-7 ~]# rsync -avz /root/456.txt rsync_backup@10.0.0.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:
#####################################
##[backup]
##comment = welcome to oldboyedu backup!
##path = /backup
##
##[data]
##path = /data
#
[root@backup-41 ~]# cat /etc/rsync.passwd
cat: /etc/rsync.passwd: No such file or directory
1.配置文件注释有问题
2.没有创建密码文件
7.报错7
[root@ceisi tmp]# rsync -avzP /tmp/wordpress rsync_backup@10.0.0.7::backup
rsync: failed to connect to 10.0.0.7 (10.0.0.7): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
原因:
#防火墙没有关闭
[root@backup ~]# iptables -nL
[root@backup ~]# systemctl stop firewalld.service
第七章 rsync服务模式实战
1.客户端推送 /backup⽬录下所有内容⾄rsync服务端
export RSYNC_PASSWORD=oldboy
rsync -avz /backup/ rsync_backup@172.16.1.41::backup
2.客户端拉取rsync服务端backup模块数据⾄本地客户端的/backup⽬录
export RSYNC_PASSWORD=oldboy123
rsync -avz rsync_backup@172.16.1.41::backup /backup/
3.rsync 实现数据⽆差异同步
#拉取远端数据:远端与本地保持⼀致,远端没有本地有会被删除, 造成客户端数据丢失
export RSYNC_PASSWORD=oldboy
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/
#推送数据⾄远端:本地与远端保持⼀致, 本地没有远端会被删除, 造成服务器端数据丢失
export RSYNC_PASSWORD=oldboy
rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup
4.rsync的 Limit 限速
#企业案例: 某 DBA 使⽤ rsync 拉取备份数据时,由于⽂件过⼤导致内部交换机带宽被沾满,导致⽤户的请求⽆法响应
export RSYNC_PASSWORD=oldboy
rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup /data/
第八章 全网备份项目
<<每日备份任务需求>>
客户端需求:
1.客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录) ;
2.客户端备份的数据必须存放至以 "主机名_ip地址_当前时间" 命名的目录中;
3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器 ;
4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间.
服务端需求:
1.服务端部署rsync,用于接收客户端推送过来的备份数据 ;
2.服务端需要每天校验客户端推送过来的数据是否完整;
3.服务端需要每天校验的结果通知给管理员 ;
4.服务端仅保留6个月的备份数据,其余的全部删除 ;
注意:所有服务器的备份目录必须都为/backup;
<< 解决方案思路如下:将多个任务需求进行拆分 >>
A:客户端需求拆解
1.打包备份
客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录)
cd /
tar zcvf etc.tar.gz etc
tar zcvf log.tar.gz var/log
2.目录命名
客户端备份的数据必须存放至以 "主机名ip地址当前时间" 命名的目录中,期望的结果:
web-7_172.16.1.7_2021-04-21
命令拆解:
主机名: hostname
ip地址: ifconfig eth1|awk 'NR==2{print $2}'
当前时间: date +%F
命令拼接:
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)
3.文件传输
rsync -avz /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup
4.删除过期文件
find /backup -mtime +7 |xargs rm -rf
5.最终脚本
现在shell里面运行:
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)
cd /
tar zcvf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/etc.tar.gz etc
tar zcvf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/log.tar.gz var/log
rsync -avz /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup
find /backup -mtime +7 |xargs rm -rf
然后再写入脚本,注意,要添加注释:
6.最终客户端备份脚本
[root@ceisi scripts]# vim back_cm.sh
#!/bin/bash
#time:2021-04-21 name: date_backup by:tan
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export RSYNC_PASSWORD=oldboy123
#1.创建备份目录
mkdir /backup/ -p
#2.本地打包备份
cd /
tar -cf backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).etc.tar.gz etc
tar -cf backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).log.tar.gz var/log
#3.将打包文件生成指纹件
md5sum /backup/*.tar.gz >/backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).finger.txt
#4.将本地备份文件推送到备份服务器
rsync -az /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2{print $2}')_$(date +%F).finger.txt rsync_backup@10.0.0.200::backup
rsync -az /backup/*.tar.gz rsync_backup@10.0.0.200::backup
#5.保留最近7天的数据
find /backup/ -time +7|xargs rm -rf
7.客户端定时任务
[root@ceisi scripts]# crontab -l
#time sync by oldboy at 2021-01-24
* * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null 2>&1
#数据备份
#time=2021-04-21 by=tan
00 01 * * * /bin/bash /server/scripts/back_cm.sh 2>&1
B.服务端需求拆解
1.服务部署
服务端部署rsync,用于接收客户端推送过来的备份数据
#!/bin/bash
yum install rsync -y
cat > /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
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
EOF
useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:oldboy" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd
2.校验数据完整性
服务端需要每天校验客户端推送过来的数据是否完整
3.邮件通知
#1.安装配置mailx:
yum install mailx -y
#2.邮箱配置文件
cat > /etc/mail.rc << 'EOF'
set from=526195417@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=526195417@qq.com
set smtp-auth-password=xxxxxxxx
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
EOF
#3.服务端生成校验结果文件:
md5sum -c /backup/md5.txt > /backup/check.txt
#4.校验发送命令
mail -s "check-rsync-$(date +%F)" 526195417@qq.com < /backup/check.txt
4.删除过期文件
find /backup -mtime +180 |xargs rm -rf
5.最终服务端检查备份脚本
#!/bin/bash
#time:2021-04-21 name:check_backup by:tan
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#1.部署rsync服务
#bash /server/scripts/rsync_sv.sh
#2.校验客户端推送过来的数据是否完整
md5sum -c /backup/ceisi_10.0.0.100_$(date +%F).finger.txt >/backup/check.txt
#3.每天校验的结果邮件通知
mail -s "$(date +%F)_log" 1987623828@qq.com </backup/check.txt
#4.仅保留6个月的备份数据,其余的全部删除
find /backup/ -mtime +180|xargs rm -rf
6.服务端检查备份定时任务
[root@oldboy scripts]# crontab -l
#time sync by oldboy at 2021-01-24
* * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null 2>&1
#检查备份数据是否完整
#time:2012-04-21 by:tan
00 01 * * * /bin/bash /server/scripts/check_backup.sh 2>&1