RSYNC+全网备份
RSYNC=Remote Sync 远程同步 高效,一定要结合shell
官方网站:https://rsync.samba.org/
Author: Andrew Tridgell, Wayne Davison, and others
Andrew Tridgell是Samba项目的领导者和主要开发人员,同时还在参与开发rsync、Linux Kernel。rsync --version
#查看rsync版本,可以看到相关作者信息
与SCP的比较:scp=无法备份大量数据,类似windows的复制
rsync=边复制 ,边统计,边比较
Rysnc特性和优点
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
选择性保持:符号连接,硬链接,文件属性,权限,时间等
常见备份分类
完整备份,差异备份,增量备份
- 完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地
- 差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)
- 增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)
运行模式和端口
- 采用C/S模式(客户端/服务器模式) [ 就是一个点到点的传输,直接使用rsync命令 ]
- 端口:873
发起端和备份源
四个名词的解释:
- 发起端:负责发起rsync同步操作的客户机叫做发起端,通知服务器我要备份你的数据
- 备份源:负责相应来自客户机rsync同步操作的服务器脚在备份源,需要备份的服务器
- 服务端:运行rsyncd服务,一般来说,需要备份的服务器
- 客户端:存放备份数据
数据同步方式
- 推push:一台主机负责把数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况
- 拉pull:所有主机定时去找一主机拉数据,可能就会导致数据缓慢
- 推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)
- 拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)两种方案,rsync都有对应的命令来实现
Xinetd管理Rsync工作原理
使用rsync来同步是先通过xinetd监听873号端口,如果rsync进来的是873号端口,那么xinetd就会通知它所管辖的rsync服务来做回应,接下来就是rsync俩服务于之间的通讯
rsync程序功能: 1 vs 4
rsync == cp
[root@backup ~]# cp -a /etc/hosts /tmp/cp_hosts
[root@backup ~]# ll /tmp/cp_hosts
-rw-r--r-- 1 root root 375 Feb 21 17:17 /tmp/cp_hosts
[root@backup ~]# rsync -a /etc/hosts /tmp/rsync_hosts
[root@backup ~]# ll /tmp/rsync_hosts
-rw-r--r-- 1 root root 375 Feb 21 17:17 /tmp/rsync_hosts
rsync == scp(远程备份)
scp -rp /etc/sysconfig/ 172.16.1.31:/tmp/
rsync -rp /oldboy_dir/ 172.16.1.31:/tmp/
利用rsync传输目录时:
传输的目录后面如果存在 / == /xoxo_dir/ 表示将目录下面的数据内容进行全部传输
传输的目录后面如果不存在 / == /xoxo_dir 表示将目录本身和目录下面的数据内容进行全部传输
rsync == rm
[root@backup ~]# mkdir /null
[root@backup ~]# ll /null/
total 0
[root@backup ~]# rsync -rp --delete /null/ 172.16.1.31:/tmp/
root@172.16.1.31's password:
--delete : 无差异同步--我有什么,你也有什么;我没有什么,你也不能有
实现不同主机之间数据高度一致
rsync == ls
[root@nfs01 tmp]# ls /tmp/
oldboy.txt
[root@nfs01 tmp]# rsync /tmp/
drwxr-xr-x 24 2019/02/21 17:42:52 .
-rw-r--r-- 0 2019/02/21 17:41:46 xoxo.txt
rsync命令的工作模式
本地备份数据 cp
Local: rsync [OPTION...] SRC... [DEST]
src: 要备份的数据信息
DEST: 将数据存储在什么位置
远程备份数据 scp
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] -- 下载
[USER@] -- 指定以什么用户身份传输数据
HOST -- 指定远程主机IP地址或者主机名称
SRC -- 远程主机上要进行下载的数据信息
DEST -- 将远程主机信息保存到本地主机的什么路径中
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST -- 上传
SRC -- 本地主机上要进行上传的数据信息
DEST -- 将本地主机信息保存到远程主机的什么路径中
守护进程方式远程备份数据:(推荐)
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] -- 下载
[USER@] -- 指定一个认证用户信息
HOST -- 指定远程主机IP地址或者主机名称
SRC -- 远程主机上要进行下载的模块信息???
DEST -- 将远程主机信息保存到本地主机的什么路径中
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST -- 上传
SRC -- 本地主机上要进行上传的数据信息
[USER@] -- 指定一个认证用户信息
HOST -- 指定远程主机IP地址或者主机名称
DEST -- 将本地主机信息保存到远程主机的什么模块信息???
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
- 可以控制传输的连接数量(同一时刻)
- 可以实现免交互方式进行传输数据
- 具有单独的传输认证进制
rsync服务守护进程方式部署流程(YUM)
rsync服务端(rsync服务进程)
第一个: 安装部署软件
[root@backup ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64
第二个: 编写配置文件
PS: 只要是一个守护进程服务, 都会存在配置文件
vim /etc/rsyncd.conf
#rsync_config
#created by HQ at 2017
##rsyncd.conf start## -- 注释信息
uid = rsync -- 管理备份目录(属主信息是rsync)
gid = rsync -- 管理备份目录(属组信息是rsync)
port = 873 -- 守护进程服务端口信息
fake super = yes -- 假超级
use chroot = no -- 安全的配置
max connections = 200 -- 同时可以有多少客户端连接rsync服务器
timeout = 300 -- 超时时间,显示空闲连接存活时间
pid file = /var/run/rsyncd.pid --- 保存进程pid号码信息
lock file = /var/run/rsync.lock --- 真正的限制同时的连接数
log file = /var/log/rsyncd.log --- rsync程序日志文件
ignore errors -- 在备份传输数据时,一些不严重问题先进行忽略
read only = false -- 备份目录设置为可读可写
list = true -- 使客户端可以查看服务端的模块信息
hosts allow = 172.16.1.0/24 --- 设置允许哪些主机或网段可以向备份服务器存储数据(白名单)
hosts deny = 0.0.0.0/32 --- 设置禁止哪些主机或网段可以向备份服务器存储数据(黑名单)
auth users = rsync_backup --- 认证用户
secrets file = /etc/rsync.password --- 认证用户密码文件(信息:rsync_backup:oldboy123)
[backup] --- 模块信息
comment = "backup dir by oldboy" --- 模块注释说明信息
path = /backup --- 定义一个备份目录
第三个: 创建一个rsync虚拟用户
useradd -s /sbin/nologin -M rsync
第四个: 创建备份目录 授予备份目录相关权限
mkdir /backup
chmod rsync.rsync -R /backup
第五个: 创建认证密码文件
echo "rsync_backup:oldboy123" >/etc/rsync.password
chmod 600 /etc/rsync.password
第六个: 启动rsync服务
systemctl start rsyncd
systemctl enable rsyncd
rsync客户端
进行传输测试 切记关闭SElinux与防火墙
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
rsync守护进程模式传输数据原理(centos7 rsync - 3.1.2)
a 在客户端执行守护进程备份数据命令
b 完成数据传输认证过程(用户名 密码信息)
c 完成用户映射过程 将客户端用户 --- 服务端的rsync用户
d 完成传输文件属主 属组信息的修改 --- 修改为rsync
如何实现免交互传输数据
完成rsync客户端配置过程
第一: 创建密码文件 修改密码文件权限为600
echo 123456 >/etc/rsync.password
chmod 600 /etc/rsync.password
第二: 进行传输测试
rsync -avz /tmp/123456.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
rsync命令参数说明
-v, --verbose --- 显示传输数据过程信息
-z, --compress --- 将传输数据进行压缩
-a, --archive --- 归档参数 -rtopgDl
-r, --recursive --- 递归传输数据
-t, --times --- 保持文件修改时间不变
-o, --owner --- 保持文件属主信息不变(在配置文件中uid设置为root用户)
-g, --group --- 保持文件属组信息不变(在配置文件中gid设置为root用户)
-p, --perms --- 保持文件权限不变
-D --- 保持设置文件信息不变
-l, --links --- 只传输链接文件,不会传输源文件中的内容 (bug)
-L, --- 只传输链接文件,会传输源文件中的内容
-P, --progress --- 显示数据传输的进度信息
PS:如果想让选项-o和-g参数生效,需要将配置文件的uid和gid改为root,需要将fake super参数进行注释或者改为no
rsync服务实现备份数据排除功能(过滤)
--exclude=PATTERN 注意: 排除数据信息要写上相对路径
--exclude-from=file 利用exclude-from参数排除数据信息时, 建议后面接绝对路径信息
准备环境:
[root@nfs01 tmp]# mkdir /xoxo/{01..03} -p
[root@nfs01 tmp]# touch /xoxo/{01..03}/{a..c}.txt
[root@nfs01 tmp]# tree /xoxo/
/xoxo/
├── 01
│?? ├── a.txt
│?? ├── b.txt
│?? └── c.txt
├── 02
│?? ├── a.txt
│?? ├── b.txt
│?? └── c.txt
└── 03
├── a.txt
├── b.txt
└── c.txt
进行排除操作: 排除01目录都不传输 排除02目录c.txt文件不要传输
[root@nfs01 tmp]# rsync -avz /xoxo/ --exclude=01/ --exclude=02/c.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
./
02/
02/a.txt
02/b.txt
03/
03/a.txt
03/b.txt
03/c.txt
sent 375 bytes received 134 bytes 1,018.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 xoxo]# rsync -avz /xoxo/ --exclude-from=/xoxo/exlude_file rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
./
02/
02/a.txt
02/b.txt
03/
03/a.txt
03/b.txt
03/c.txt
sent 375 bytes received 134 bytes 1,018.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 xoxo]# cat exlude_file
01/
02/c.txt
exlude_file
PS: 利用exclude-from参数排除数据信息时, 建议后面接绝对路径信息
rsync服务实现无差异同步
--delete : 使客户端数据信息和备份服务端数据信息保持高度一致
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
deleting 01/c.txt
deleting 01/b.txt
deleting 01/a.txt
deleting 01/
./
sent 235 bytes received 72 bytes 614.00 bytes/sec
total size is 25 speedup is 0.08
rsync备份服务实现存储数据访问控制
hosts allow = 172.16.1.0/24 白名单
hosts deny = 0.0.0.0/32 黑名单
理解rsync服务访问控制原理
第一种情况: 只有白名单 没有黑名单
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
sent 228 bytes received 22 bytes 500.00 bytes/sec
total size is 25 speedup is 0.10
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@10.0.0.41::backup --password-file=/etc/rsync.password
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
rsync服务模块列表功能
list = false 在客户端上可以显示服务端的所有模块信息
PS: 建议将此功能关闭
rsync服务备份目录层级创建功能
PS: 无法创建多级目录
[root@nfs01 xoxo]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/01/ --password-file=/etc/rsync.password
sending incremental file list
created directory 01
hosts
sent 227 bytes received 68 bytes 590.00 bytes/sec
total size is 371 speedup is 1.26
[root@nfs01 xoxo]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/01/02/03/04/ --password-file=/etc/rsync.password
sending incremental file list
rsync: mkdir "01/02/03/04" (in backup) failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]
[root@nfs01 xoxo]#
[root@nfs01 xoxo]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/01/02/ --password-file=/etc/rsync.password
sending incremental file list
created directory 01/02
hosts
sent 227 bytes received 71 bytes 596.00 bytes/sec
total size is 371 speedup is 1.24
6.66实战内容
6.1 客户端推送 backup 目录下所有内容至 Rsync 服务端
export RSYNC_PASSWORD=123456
rsync -avz /backup/ rsync_backup@172.16.1.41::backup
6.2 客户端拉取 Rsync 服务端 backup 模块数据至本地客户端的 /backup 目录
export RSYNC_PASSWORD=123456
rsync -avz rsync_backup@172.16.1.41::backup /backup/
6.3 Rsync 实现数据无差异同步
拉取远端数据:远端与本地保持一致,远端没有本地有会被删除, 造成客户端数据丢失
export RSYNC_PASSWORD=123456
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/
推送数据至远端:本地与远端保持一致, 本地没有远端会被删除, 造成服务器端数据丢失
export RSYNC_PASSWORD=123456
rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup
6.4 Rsync 的 Limit 限速
企业案例: 某 DBA 使用 rsync 拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应
export RSYNC_PASSWORD=123456
rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup /data/
7.77 全网备份案例
7.1 客户端需求:
客户端需求:
- 1.客户端 每天凌晨1点在服务器本地打包备份(系统配置文件日志文件其他目录应用配置等文件)
- 2.客户端备份的数据必须存放至以主机名ip地址当前时间命名的目录中
- 3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器
- 4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
7.2任务 拆解
1.客户端 每天凌晨1点在服务器本地打包备份(系统配置文件日志文件其他目录应用配置等文件)
系统配置文件:
/etc/fstab
/etc/passwd
日志文件:
/var/log/messages
/var/log/secure
打包压缩:
cd / && tar zcvf /backup/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf /backup/log.tar.gz var/log/messages var/log/secure
2.客户端备份的数据必须存放至以主机名ip地址当前时间命名的目录中
命名要求:
nfs_172.16.1.31_2019-07-17
主机名:
hostname
ip地址:
ifconfig eth1|awk 'NR==2{print $2}'或者hostname -i (前提需要定义好hosts文件)
时间:
date +%F
拼接在一起:
[root@nfs ~]# echo "$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date
+%F)"
nfs_172.16.1.31_2019-07-17
3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器的/backup
rsync -avzP /backup/ oldzhang@172.16.1.41::backup
4.创建测试数据
[root@nfs /backup]# cat date.sh
#!/bin/bash
for i in {1..30}
do
Backup="/backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date
+%F)"
date -s 2019/07/${i}
mkdir -p ${Backup}
cd / && tar zcvf ${Backup}/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf ${Backup}/log.tar.gz var/log/messages var/log/secure
done
5.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
find /backup/ -mtime +7 |xargs rm -rf
6.调试脚本参数
bash -x xxx.sh
7.最终脚本
[root@nfs /server/scripts]# cat push_rsync.sh
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
BACKUP=/backup
HOST=$(hostname)
TIME=$(date +%F)
IP=$(ifconfig eth1|awk 'NR==2{print $2}')
DEST=${HOST}_${IP}_${TIME}
#1.创建目录
mkdir ${BACKUP}/${DEST} -p
#2.打包数据
cd / && tar zcvf ${BACKUP}/${DEST}/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf ${BACKUP}/${DEST}/log.tar.gz var/log/messages
var/log/secure
7.3推送
export RSYNC_PASSWORD=123456
rsync -avzP ${BACKUP}/ rsync_backup@172.16.1.41::backup
删除7天前文件
find ${BACKUP}/ -mtime +7 |xargs rm -rf
8.注意踩坑
我们的备份脚本最终会以定时任务的形式实现,而定时任务能识别的PATH变量有限,所以最好在脚本里添加PATH变量,或者脚本里命令写绝对路径。
7.4 服务端需求:
1.服务端部署 rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留 6 个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup
7.5 服务端步骤:
服务端需要每天校验客户端推送过来的数据是否完整
1.要在客户端做
2.做一个标记,贴一个防撕贴
第一种
cd nfs_172.16.1.31_2019-07-23/ && md5sum log.tar.gz > md5.txt
第二种
md5sum log.tar.gz sys.tar.gz >md5.txt
第三种
md5sum *.tar.gz >md5.txt
实现命令
:
1.客户端增加md5校验的步骤:
md5sum ${BACKUP}/${DEST}/*.tar.gz > ${BACKUP}/${DEST}/md5.txt
2.服务端校验命令:
find /backup/*_$(date +%F) -name "md5.txt"|xargs md5sum -c
服务端需要每天邮件校验的结果通知给管理员
1.安装配置mailx:
yum install mailx -y
2.邮件配置文件
[root@backup /server/scripts]# cat /etc/mail.rc
set from=38867033@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=38867033@qq.com
set smtp-auth-password=xxxxxxxxSMTP授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
3.服务端生成校验结果文件:
find /backup/*_$(date +%F) -name "md5.txt"|xargs md5sum -c >
/backup/check.txt
4.校验发送命令:
mail -s "check-rsync-$(date +%F)" 38867033@qq.com < /backup/check.txt
第八章 配置文件汇总
8.1 客户端脚本:
[root@nfs01 /server/scripts]# cat push_rsync.sh
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Host=$(hostname)
Addr=$(ifconfig eth1|awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}
Path=/backup
#2.创建备份目录
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
#3.备份对应的文件
cd / && \
[ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \
[ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz var/log/messages var/log/secure && \
#4.携带 md5 验证信息
[ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date
#5.推送本地数据至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
#6.本地保留最近 7 天的数据
find $Path/ -type d -mtime +7|xargs rm -rf
8.2 服务端脚本:
[root@backup /server/scripts]# cat check_backup.sh
#!/bin/bash
#1.定义全局的变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#2.定义局部变量
Path=/backup
Date=$(date +%F)
#3.查看 flag 文件,并对该文件进行校验, 然后将校验的结果保存至 result_时间
find $Path/ -type f -name "flag_$Date"|xargs md5sum -c >$Path/result_${Date}
#4.将校验的结果发送邮件给管理员
mail -s "Rsync Backup $Date" 38867033@qq.com <$Path/result_${Date}
#5.删除超过 7 天的校验结果文件, 删除超过 180 天的备份数据文件
find $Path/ -type f -name "result*" -mtime +7|xargs rm -f
find $Path/ -type d -mtime +180|xargs rm -rf
8.3 服务端rsync配置文件
[root@backup /server/scripts]# cat /etc/rsyncd.conf
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 123456edu backup!
path = /backup
[data]
path = /data
[player id='712292593' type='collect' autoplay='true'/]