第四章 Rsync 命令详解和实战用法

一、scp命令

1.简介

scp客户端命令:远程拷贝
类似于rsync,scp全量,rsync增量
scp支持推和拉

2.scp推

#把当前目录下的hostname_ip.sh文件推送到172.16.1.31机器的/tmp目录下
[root@web01 ~]# scp hostname_ip.sh 172.16.1.31:/tmp

ps:与rsync不同,推送时不论是加 / 还是不加 / ,推送的都是目录。如果想推送目录下的文件,则使用 *

3.scp拉

[root@web01 ~]# scp 172.16.1.31:/tmp/1.txt ./

#注意:
	与rsync不同,拉取时不论是加 / 还是不加 / ,拉取的都是目录
	如果想拉取目录下的文件,则使用 *

4.常用参数

-P 指定端口,默认22端口可不写
-r 表示递归拷贝目录
-p 表示在拷贝文件前后保持文件或目录属性不变
-l 限制传输使用带宽(默认kb)

[root@web01 /tmp]# scp -l 8096 1.txt 172.16.1.31:/tmp/
root@172.16.1.31's password: 
1.txt    12%   64MB   1.0MB/s   07:19 ETA

5.总结

1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。

二、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=PATTERN   #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--partial           #断点续传
--password-file=xxx #使用密码文件
--bwlimit=100       #限速传输
--delete            #让目标目录和源目录数据保持一致

2.限速演示

--bwlimit=100       #限速传输

[root@web01 /tmp]# rsync -avP --bwlimit 100 /tmp/ rsync_backup@172.16.1.41::backup
sending incremental file list
./
data.txt
      5,537,792   1%  100.04kB/s

3.数据一致

--delete            #让目标目录和源目录数据保持一致

#推:数据与推送数据的源数据一致
[root@web01 /tmp]# rsync -avP --delete /tmp/ rsync_backup@172.16.1.41::backup
sending incremental file list
deleting file2
deleting file1

sent 223 bytes  received 43 bytes  532.00 bytes/sec
total size is 0  speedup is 0.00

#推:数据与拉取数据的源数据一致
[root@web01 /tmp]# rsync -a -v -P rsync_backup@172.16.1.41::backup /tmp --delete
receiving incremental file list
deleting file4
deleting file3
./

sent 32 bytes  received 203 bytes  470.00 bytes/sec
total size is 0  speedup is 0.00

三、rsync备份案例

1.需求

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

2.准备服务器

主机 内网IP
web01 172.16.1.7
backup 172.16.1.41

3.客户端

1.创建备份目录
#备份目录格式
/backup/web01_172.16.1.31_2018-09-02

#取主机名
[root@web01 ~]# hostname
web01

#取IP
[root@web01 ~]# ifconfig eth1 | awk 'NR==2 {print $2}'
172.16.1.7
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7

#取时间
[root@web01 ~]# date +%F
2020-08-12

#创建目录
[root@web01 ~]# mkdir -p /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`

2.打包
[root@web01 ~]# cd /backup/web01_172.16.1.7_2020-08-12/

[root@web01 /backup/web01_172.16.1.7_2020-08-12]# tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

3.推送数据
[root@web01 ~]# rsync -avz /backup/web01_172.16.1.7_2020-08-12 rsync_backup@172.16.1.41::backup
sending incremental file list
web01_172.16.1.7_2020-08-12/
web01_172.16.1.7_2020-08-12/conf.tar.gz

sent 62,567 bytes  received 47 bytes  125,228.00 bytes/sec
total size is 68,669  speedup is 1.10

4.以上内容写成脚本
[root@web01 ~]# mkdir /scripts
[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.创建目录
mkdir -p $DIR

#2.进到目录下并打包文件
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR rsync_backup@172.16.1.41::backup

5.写入定时任务
[root@web01 ~]# crontab -e
#每天凌晨1点进行文件备份
00 01 * * * /bin/bash /scripts/backup.sh &> /dev/null

6.清理数据
#模拟生成一个月数据
[root@web01 ~]# for i in {1..30};do date -s 2020/08/$i;sh /scripts/backup.sh;done

#只保留七天的文件
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
[root@web01 ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 25 Aug 23 00:00 web01_172.16.1.7_2020-08-23
drwxr-xr-x 2 root root 25 Aug 24 00:00 web01_172.16.1.7_2020-08-24
drwxr-xr-x 2 root root 25 Aug 25 00:00 web01_172.16.1.7_2020-08-25
drwxr-xr-x 2 root root 25 Aug 26 00:00 web01_172.16.1.7_2020-08-26
drwxr-xr-x 2 root root 25 Aug 27 00:00 web01_172.16.1.7_2020-08-27
drwxr-xr-x 2 root root 25 Aug 28 00:00 web01_172.16.1.7_2020-08-28
drwxr-xr-x 2 root root 25 Aug 29 00:00 web01_172.16.1.7_2020-08-29
drwxr-xr-x 2 root root 25 Aug 30 00:00 web01_172.16.1.7_2020-08-30

7.完善脚本
[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.创建目录
mkdir -p $DIR

#2.进到目录下并打包文件
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.对文件生成验证文件
md5sum $DIR/conf.tar.gz > $DIR/auth.txt

#4.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR rsync_backup@172.16.1.41::backup

#5.清理数据
find $SRC -type d -mtime +7 | xargs rm -rf

4.服务端

1.安装邮件系统
[root@backup ~]# yum install -y mailx

#编辑邮件系统
[root@backup ~]# vim /etc/mail.rc 
set from=qq号@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=qq号@qq.com
set smtp-auth-password=smtp验证码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

2.编写脚本
[root@backup ~]# vim /scripts/auth.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.验证文件的完整性
md5sum -c $SRC/web01_172.16.1.7_$DATE/auth.txt > $SRC/result.txt

#2.把验证结果发送到QQ
mail -s "备份数据完整性" 1240206455@qq.com < $SRC/result.txt

#3.清理数据
find $SRC -type d -mtime +180 | xargs rm -rf

四、rsync结合inotify实现实时备份

1.安装inotify

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

2.命令测试

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

3.参数详解

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

4.实时监控脚本

1)粗糙版
[root@web01 /backup]# vim /scripts/rsync_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.41::backup --password-file=/etc/rsyncd.password >/dev/null 2>&1
done  &

2)精华版
[root@web01 /backup]# vim /scripts/rsync_inotify.sh 
#!/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
        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 &
posted @ 2020-08-13 21:32  年少纵马且长歌  阅读(321)  评论(0编辑  收藏  举报