01rsync备份
一、介绍备份的场景
1、什么情况下需要备份
一般数据比较重要的情况下,数据如果丢失很容易找不回来,建议备份
2、什么是备份
把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步
3、为什么做备份
1、数据在公司是很重要的
2、备份就是为了恢复
4、备份工具
本地备份工具:cp
远程本分工具:scp Rsync
scp : 全量备份
rsync : 增量备份
5、scp的格式
1、推数据:将本机的文件上传到其他服务器
scp [参数] [本机文件的路径] [远端服务器用户]@[远端服务器ip]:[远端服务器的路径]
2、拉数据:将其他服务器上的文件下载到本机
scp [参数] [远端服务器用户]@[远端服务器ip]:[远程主机的路径] [本机文件的路径]
3、scp参数
-p: 保留原文件的修改时间,访问时间和访问权限
-r: 递归复制整个目录
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位
案例1、将db01服务器上的etc目录中所有的普通文件打包备份到rsync服务器上的/tmp目录上
[root@db01 ~]# tar -czPf /root/etc.tar.gz $(find /etc -type f)
[root@db01 ~]# scp /root/etc.tar.gz root@172.16.1.41:/tmp/
案例2、要求rsync服务器主动备份db服务器的/tmp目录中
[root@rsync ~]# scp root@172.16.1.51:/root/etc.tar.gz /tmp
案例3、要求备份etc.tar.gz文件,且时间尽可能不改变
[root@db01 ~]# scp -p /tmp/etc.tar.gz root@172.16.1.41:/tmp/
案例4、要求将root目录上传到rsync的/opt目录中
[root@db01 ~]# scp -r /root/ root@172.16.1.41:/opt/
二、介绍Rsync
1、简介
rsync是远程增量文件备份的工具。rsync简称叫做远程同步,可以实现不同主机之间的数据同步,还支持全量和增量
2、特性
1、支持拷贝特殊文件,如连接文件、设备等。
2、可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
3、可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
4、可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
5、可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
6、可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
7、支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
3、场景
cron + rsync :跟定时任务进行绑定
rsync + innotify :以守护进程的方式同步文件
三、Rsync的应用场景
1、备份方式
1、全量备份:将数据完整的复制一份保留
2、增量备份:备份上一次备份后新增的数据
2、rsync的传输方式
1、推:
客户端将数据从本地推送至服务端
2、拉:
客户端将数据从服务端拉取到本地
3、传输存在的问题
1、推的问题:当客户端服务器数量过多,容易造成数据推送缓慢
2、拉的问题:当客户端服务器数量过多,容易造成服务端压力过大
四、Rsync的传输模式
1、本地传输模式
1、格式
rsync [参数] [原来的路径] [现在的路径]
2、参数
-t 保持文件时间信息
-r 递归传输目录及子目录
-o 保持文件属主信息
-g 保持文件属组信息
-l 保留软连接
-a 归档模式传输 = -torpgDl
-p 保持文件权限
-D 保持设备文件信息
-P 显示同步的过程及传输时的进度等信息
-v 详细模式输出, 打印速率, 文件数量等
--bwlimit=100 限速传输
--password-file=xxx 使用密码文件
常用的参数组合:-avzP
案例1、将/tmp/etc.tar.gz上传到/mnt目录下
rsync /tmp/etc.tar.gz /mnt/
案例2、将/root目录传输到/mnt目录
rsync -r /root /mnt
2、远程传输模式
1、推数据
rsync [参数] [本地文件路径] [远端服务器用户]@[远端服务器ip]:[远端服务器的保存路径]
2、拉数据
rsync [参数] [远端服务器用户]@[远端服务器ip]:[远端服务器的文件路径] [本地保存文件路径]
案例1、将1.txt传输到db01服务器上的/opt目录
[root@rsync ~]# rsync -avzP 1.txt root@172.16.1.51:/opt/
案例2、要求rsync服务器主动备份1.txt到/tmp目录中
[root@rsync ~]# rsync -avzP root@172.16.1.41:/tmp/1.txt /tmp
3、以守护进程的方式
1)为什么使用守护进程模式
1、保证数据安全
2、数据归档
2)服务端rsync
1、编写rsync的守护进程的配置文件
1、编写配置文件
[root@rsync ~]# yum install rsync -y
#查找配置文件
[root@rsync ~]# rpm -qa rsync
[root@rsync ~]# 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
logi file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
==============================================
2、创建配置文件运行需要的环境
1、创建rsync的启动用户
[root@rsync ~]# useradd -r -M -s rsync /sbin/nologin
2、创建密码文件
[root@rsync ~]# touch /etc/rsync.passwd
3、创建用户和密码关联数据(一定不能有空格)
[root@rsync ~]# echo 'rsync_backup:123456'>/etc/rsync.passwd
4、授权密码文件
[root@rsync ~]# chmod 600 /etc/rsync.passwd
5、创建备份目录
[root@rsync ~]# mkdir /backup
6、将目录的用户权限修改成rsync
[root@rsync ~]# chown -R rsync.rsync /backup/
3、启动rsync服务
[root@rsync ~]# systemctl start rsyncd
4、验证启动
[root@rsync ~]# netstat -lntp | grep 873
[root@rsync ~]# ps -ef | grep rsync
3)客户端rsync
1、安装rsync
[root@db01 ~]# yum install rsync -y
2、创建认证密码文件
[root@db01 ~]# touch /etc/rsync.passwd
[root@db01 ~]# echo "123456" >/etc/rsync.passwd
3、授权密码文件
[root@db01 ~]# chmod 600 /etc/rsync.passwd
4、客户端推拉数据
方法一:自己输入密码
[root@db01 ~]# rsync -avzP 1.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
方法二:添加环境变量
[root@db01 ~]# export RSYNC_PASSWORD=123456
[root@db01 ~]# rsync -avzP /opt/3.txt rsync_backup@172.16.1.41::backup
方法三:设置密码文件,运行时读取
[root@db01 ~]# rsync -avzP /opt/3.txt rsync_backup@172.16.1.41::backup
4、rsync常见报错
1.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backu@172.16.1.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]
#原因:1)虚拟用户的用户名或者密码错误,2)服务端密码文件权限不为600
2.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
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
3.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backu
@ERROR: Unknown module 'backu'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
#原因:模块名字错误
4.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::/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(1649) [sender=3.1.2]
#原因:双冒号后面跟的是模块名字,而不是目录名字不要加/
5.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
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]
#原因:防火墙开启,没有配置防火墙规则
[root@backup ~]# firewall-cmd --add-port=873/tcp
success
6.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
rewriteip.sh
rsync: mkstemp ".rewriteip.sh.vx4Cry" (in backup) failed: Permission denied (13)
sent 207 bytes received 128 bytes 44.67 bytes/sec
total size is 194 speedup is 0.58
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
#原因:selinux没有关闭
7.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
sending incremental file list
rsync: delete of stat xattr failed for "rewriteip.sh" (in backup): Permission denied (13)
sent 55 bytes received 114 bytes 338.00 bytes/sec
total size is 194 speedup is 1.15
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
#原因:服务端备份目录权限不是rsync
8.报错内容
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
#原因:服务端服务没有启动
9.报错内容
[root@web01 ~]# rsync -avz 1.txt rsync_backup@10.0.0.41::backup
sending incremental file list
rsync: read error: Connection reset by peer (104)
rsync error: error in socket IO (code 10) at io.c(785) [sender=3.1.2]
#原因:服务端配置错误,导致启动问题
三、rsync备份案例
1、了解需求
客户端需求:
1、客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2、客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3、客户端最后将备份的数据进行推送至备份服务器
4、客户端每天凌晨1点定时执行该脚本
5、客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
服务端需求:
1、服务端部署rsync,用于接收客户端推送过来的备份数据
2、服务端需要每天校验客户端推送过来的数据是否完整
3、服务端需要每天校验的结果通知给管理员
4、服务端仅保留6个月的备份数据,其余的全部删除
2、客户端需求
1)创建备份目录
[root@web01 ~]# mkdir /backup
[root@web01 ~]# hostname
web01
[root@web01 ~]# hostname -I
10.0.0.7 172.16.1.7
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7
[root@web01 ~]# date +%F
2020-11-19
#结合信息创建目录
[root@web01 ~]# mkdir /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F)
[root@web01 ~]# mkdir /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`
[root@web01 ~]# ll /backup/
drwxr-xr-x. 2 root root 6 Nov 19 10:00 web01_172.16.1.7_2020-11-19
2)打包数据
#打包
[root@web01 ~]# tar -zcf conf.tar.gz /var/log/messages
#移动
[root@web01 ~]# mv conf.tar.gz /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F)/
#或者使用下面方式
#直接打包到目录
[root@web01 ~]# tar zcPf /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F)/conf.tar.gz /var/log/messages
3)推送文件
[root@web01 ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup
sending incremental file list
./
web01_172.16.1.7_2020-11-19/
web01_172.16.1.7_2020-11-19/conf.tar.gz
sent 124,299 bytes received 54 bytes 248,706.00 bytes/sec
total size is 130,519 speedup is 1.05
4)将以上步骤写成脚本
[root@web01 ~]# vim rsync_client.sh
#!/bin/bash
#1、定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2、创建备份目录
mkdir -p $SRC
#3、打包文件
tar zcPf $SRC/conf.tar.gz /var/log/messages
#4、推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup
5)将脚本加入定时任务
[root@web01 ~]# crontab -e
#每天凌晨1点执行备份脚本
0 1 * * * /bin/bash /root/rsync_client.sh
6)只保留七天数据
#模拟到今天的数据
[root@web01 ~]# for i in {1..19};do date -s 2020/11/$i;sh rsync_client.sh;done
#删除七天前的数据
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
7)加入脚本
[root@web01 ~]# vim rsync_client.sh
#!/bin/bash
#1、定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2、创建备份目录
mkdir -p $SRC
#3、打包文件
tar zcPf $SRC/conf.tar.gz /var/log/messages
#4、推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup
#5、删除七天之前的数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
8)客户端先判断文件是否存在
[root@web01 ~]# vim rsync_client.sh
#!/bin/bash
#1、定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2、创建备份目录
[ -d $SRC ] || mkdir -p $SRC
#3、打包文件
[ -d $SRC/conf.tar.gz ] || tar zcPf $SRC/conf.tar.gz /var/log/messages
#4、推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup
#5、删除七天之前的数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
3、服务端需求
1)部署rsync服务端
2)客户端加入校验码操作
#!/bin/bash
#1、定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2、创建备份目录
[ -d $SRC ] || mkdir -p $SRC
#3、打包文件
[ -d $SRC/conf.tar.gz ] || tar zcPf $SRC/conf.tar.gz /var/log/messages
#4.生成校验码
md5sum $SRC/conf.tar.gz > $SRC/flag_$DATE
#5、推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup
#6、删除七天之前的数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
3)校验文件
[root@backup backup]# md5sum -c /backup/*_$(date +%F)/flag_2020-11-19
4)使用邮件发送消息
#1.服务端配置邮件功能
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=1426115933@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1426115933@qq.com
set smtp-auth-password=pdaoywghqhxuggcg
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
#2.测试发送邮件
[root@backup backup]# mail -s "校验结果" 1426115933@qq.com < 1.txt
5)服务端脚本
[root@backup ~]# vim rsync_server.sh
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}
#2.校验文件
md5sum -c $DIR/*_$DATE/flag_$DATE > $DIR/result.txt
#3.将校验结果发送给管理员邮箱
mail -s "$DATE备份文件 校验结果" 1426115933@qq.com < $DIR/result.txt &> /dev/null
#4.删除6个月之前的数据
find $DIR/ -type d -mtime +180 | xargs rm -rf
6)将服务脚本加入定时任务
[root@backup ~]# crontab -e
#服务端每天7点将校验备份结果发给管理员
0 7 * * * /bin/bash /root/rsync_server.sh
四、Rsync + inotify
inotify就是实时监控目录中文件中的变化
1、安装inotify(客服端)
[root@db01 ~]# yum install inotify -y
2、测试inotify监控目录命令
[root@db01 ~]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /tmp
另起一个db01服务器,在/tmp里执行操作,同时查看监控目录的变化
3、实时同步/tmp目录
[root@db01 ~]# inotifywait -mr --format "%Xe %w %f" -e modify,close_write,create,delete /tmp/ | while read line ;do rsync -avzP /tmp/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd ; done
4、实时备份脚本编写
1)粗略版
[root@db01 ~]# vim rsyn-inotify.sh
DIR=/opt/
USERNAME=rsync_backup
IP="172.16.1.41"
MODULE=backup
inotifywait -mr --format "%Xe %w %f" -e modify,close_write,create,delete ${DIR} | while read line ;do rsync -avzP ${DIR} ${USERNAME}@${IP}::${MODULE} --password-file=/etc/rsync.passwd &>/dev/null; done
2)精油版
#!/bin/bash
src=/data
des=backup
rsync_passwd_file=/etc/rsync.passwd
ip1=172.16.1.41
user=rsync_backup
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
CREATE /backup/ 1.txt
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
then
rsync -azcR --password-file=${rsync_passwd_file} ${INO_FILE} ${user}@${ip1}::${des}
fi
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -azR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
if [ ! -d "$INO_FILE" ]
then
rsync -azcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
fi
done &
5、常用参数
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载