01rsync备份

rsync备份(备份服务器)

一、介绍备份的场景

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 卸载

 

 

posted @ 2021-11-06 20:24  vonmo  阅读(266)  评论(0编辑  收藏  举报