一、Rsync常用参数

1.常用参数

-a      #归档模式传输, 等于-tropgDl -t -r -o -p -g -D -l   ******
-v      #详细模式输出, 打印速率, 文件数量等   ******
-z      #传输时进行压缩以提高效率   ******
-r      #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t      #保持文件时间信息
-o      #保持文件属主信息
-p      #保持文件权限
-g      #保持文件属组信息
-l      #保留软连接
-P     #显示同步的过程及传输时的进度等信息
-D     #保持设备文件信息
-L     #保留软连接指向的目标文件
-e     #使用的信道协议,指定替代rsh的shell程序
--exclude=1.txt     #指定排除不需要传输的文件  *****
--exclude-from=file   #指定排除不需要传输的file下指定的文件内容(不包括file)   ******
--bwlimit=100         #限速传输   ******
--partial             #断点续传
--delete              #让目标目录和源目录数据保持一致   ******
--password-file=xxx   #使用密码文件

2.常用参数详解

#1.--exclude-from=file   排除参数

#创建多个文件
[root@web01 ~]# touch {1..10}.txt
[root@web01 ~]# ll
总用量 12
-rw-r--r--  1 root root    0 4月  28 07:29 10.txt
-rw-r--r--  1 root root    0 4月  28 07:29 1.txt
-rw-r--r--  1 root root    0 4月  28 07:29 2.txt
-rw-r--r--  1 root root    0 4月  28 07:29 3.txt
-rw-r--r--  1 root root    0 4月  28 07:29 4.txt
-rw-r--r--  1 root root    0 4月  28 07:29 5.txt
-rw-r--r--  1 root root    0 4月  28 07:29 6.txt
-rw-r--r--  1 root root    0 4月  28 07:29 7.txt
-rw-r--r--  1 root root    0 4月  28 07:29 8.txt
-rw-r--r--  1 root root    0 4月  28 07:29 9.txt

#编辑要指定的排除文件内容
[root@web01 ~]# vim a.txt
1.txt
2.txt
3.txt

#指定排除文件推送内容
[root@web01 ~]# rsync -avz ./* rsync_backup@17216.1.41::backup --exclude-from
=a.txt


#2.--bwlimit=100   限速传输

#创建一个1G 文件
[root@web01 opt]# dd if=/dev/zero of=./1.txt bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,6.9373 秒,151 MB/秒

#限速1M每秒推送
[root@web01 opt]# rsync -avzP 1.txt rsync_backup@172.16.1.41::backup --bwlimit=1
1.txt
    114,130,944 10% 1.01MB/s 0:15:06


#3.--delete 数据一致(无差异同步)

#查看客户端数据
[root@web01 opt]# rm -rf 1.txt 2.txt 3.txt 
[root@web01 opt]# ll
总用量 4
-rw-r--r-- 1 root root  0 4月  28 07:29 10.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 4.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 5.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 6.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 7.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 8.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 9.txt
-rw-r--r-- 1 root root 18 4月  28 07:31 a.txt

#执行数据一致同步(推送)
[root@web01 opt]# rsync -avz ./* rsync_backup@172.16.1.41::backup --delete

#查看服务端数据
[root@backup backup]# ll
总用量 4
-rw-r--r-- 1 root root  0 4月  28 07:29 10.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 4.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 5.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 6.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 7.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 8.txt
-rw-r--r-- 1 root root  0 4月  28 07:29 9.txt
-rw-r--r-- 1 root root 18 4月  28 07:31 a.txt

#注意:
拉取时:客户端数据与服务端数据一致,以服务端数据为准
推送时:服务端数据一客户端数据一致,以客户端数据为准

二、Rsync备份案例

1.准备服务器

rsync 什么版本支持并行 rsync -w_数据

2.了解需求

  • 客户端需求:
    客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
    客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
    客户端最后将备份的数据进行推送至备份服务器
    客户端每天凌晨1点定时执行该脚本
    客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
  • 服务端需求:
    服务端部署rsync,用于接收客户端推送过来的备份数据
    服务端需要每天校验客户端推送过来的数据是否完整
    服务端需要每天校验的结果通知给管理员
    服务端仅保留6个月的备份数据,其余的全部删除

3.客户端操作

#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 $NF}'
172.16.1.7
[root@web01 ~]# date +%F
2020-11-19

#2.结合获取信息创建目录
[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

#3.打包数据
#打包
[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 zcf /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date
+%F)/conf.tar.gz /var/log/message 

#4.推送文件
[root@web01 ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup
1)将以上步骤写成脚本
[root@web01 ~]# vim 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 $SRC -p
#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./log/messages
#4.推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup
2)将脚本加入定时任务
[root@web01 ~]# crontab -e
#每天凌晨1点执行备份脚本
0 1 * * * /bin/bash /root/client.sh

只保留七天 的数据
#模拟30天数据
[root@web01 ~]# for i in {1..30};do date -s 2020/11/$i;sh client.sh;done
#删除七天前的数据
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
3)加入脚本
[root@web01 ~]# vim 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 $SRC -p
#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./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
4)客户端先判断文件是否存在
[root@web01 ~]# vim 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 $SRC -p
#3.打包文件
[ -f $SRC/conf.tar.gz ] || cd /var && tar zcf $SRC/conf.tar.gz ./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

4.服务端操作

1)部署rsync服务端
2)客户端脚本加入生成校验码的操作

(md5只能对文件生成校验码,对目录不可以)

[root@web01 ~]# vim 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 $SRC -p
#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./log/messages
#4.生成校验码
md5sum $SRC/conf.tar.gz > $SRC/flag
#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@web01 ~]# vim server.sh 
md5sum -c /backup/*_$(date +%F)/flag_2020-11-30  #编辑校验脚本文件
[root@web01 ~]#date -s  2020/11/30    #修改当前时间
[root@web01 ~]#sh server.sh  #执行校验脚本
/backup/web01_172.16.1.7_2020-11-30/conf.tar.gz:OK    #校验成功显示
4)使用邮件发送消息
#1.服务端配置邮件功能
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=253097001@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=253097001@qq.com
set smtp-au
set nss-config-dir=/etc/pki/nssdb/

#2.测试发送邮件
[root@backup backup]# math-password=123123123
set smtp-auth=login
set ssl-verify=ignoreil -s "校验结果" 1240206455@qq.com < server.sh
set from=253097001@qq.com
set smtp

服务端脚本
#!/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 > $DIR/result.txt
#3.将校验结果发送给管理员邮箱
mail -s "$DATE备份文件 校验结果" 1240206455@qq.com < $DIR/result.txt
find $DIR/ -type d -mtime +180 | xargs rm -rf
5)将服务端脚本加入定时任务
[root@backup ~]# crontab -e
#服务端每天7点将校验备份结果发给管理员
0 7 * * * /bin/bash /root/server.sh &> /dev/null

三、Rsync结合inotify

1.安装inotify

[root@web01 ~]# yum -y install inotify-tools

2.常用参数

-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载

3.测试命令

[root@web01 ~]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e
create,modify,delete,attrib,close_write /backup

4.实时备份脚本编写

粗略版
[root@backup ~]# vim rsyn-inotify.sh
#!/bin/bash
dir=/backup
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir |while read line;do
    cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
done &

精油版
#!/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 &