架构期day3-Rsync结合inotif与NFS介绍

一、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 #文件名所在的目录文件
--bwlimit=100       #限速传输
--partial           #断点续传
--delete            #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件

1)–exclude-from=file 排除参数

#创建多个文件
[root@web01 ~]# touch txt{1..10}
[root@web01 ~]# ll
total 0
drwxr-xr-x. 2 root root 6 Nov 19 08:44 dir
-rw-r--r--. 1 root root 0 Nov 19 08:44 file
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt1
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt10
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt2
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt3
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt4
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt5
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt6
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt7
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt8
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt9

#编辑文件写入要排除的文件名字
[root@web01 ~]# vim 1.txt 
txt1
txt2
txt3
txt4

#指定排除文件推送内容
[root@web01 ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup --exclude-from=1.txt
sending incremental file list
1.txt
txt10
txt5
txt6
txt7
txt8
txt9
dir/

sent 468 bytes  received 165 bytes  422.00 bytes/sec
total size is 20  speedup is 0.03
#发现没有传输1.txt中写入名字的文件

2)–bwlimit=100 限速传输

#创建一个1G的文件
[root@web01 ~]# dd if=/dev/zero of=./1.txt bs=1M count=1000

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

#限速10M每秒推送
[root@web01 ~]# rsync -avzP 1.txt rsync_backup@172.16.1.41::backup --bwlimit=10
sending incremental file list
1.txt
    262,078,464  24%    9.89MB/s

3)–delete 数据一致(无差异同步)

#查看客户端数据
[root@web01 ~]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt2
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt3
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt4
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt5
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt6
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt7
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt8
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt9

#删除数据
[root@web01 ~]# rm -rf txt2
[root@web01 ~]# rm -rf txt3
[root@web01 ~]# rm -rf txt4

#执行数据一致同步
[root@web01 ~]# rsync -avz ./ rsync_backup@172.16.1.41::backup --delete
sending incremental file list
deleting txt4
deleting txt3
deleting txt2
./

sent 332 bytes  received 52 bytes  768.00 bytes/sec
total size is 7,746  speedup is 20.17

#查看服务端
[root@backup backup]# ll
total 0
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt5
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt6
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt7
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt8
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt9

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

二、Rsync备份案例

1.准备服务器

主机IP身份
web0110.0.0.7客户端
backup10.0.0.41服务端

2.了解需求

客户端需求:
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个月的备份数据,其余的全部删除

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 $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 zcf /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

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.创建表备份目录
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

PS:个人另一脚本案例:
#/bin/bash
host=`hostname`
ip=`hostname -I |awk '{print $2}'`
time=`date "+%F"`
src=${host}_${ip}_${time}
export RSYNC_PASSWORD=123
tar zcf /backup/${src}.gz /etc/hosts &>/dev/null
md5sum /backup/* > /tmp/md5.txt
rsync -az /backup/* rsync_backup@10.0.0.31::backup &>/dev/null

5)将脚本加入定时任务

[root@web01 ~]# crontab -e
#每天凌晨1点执行备份脚本
0 1 * * * /bin/bash /root/client.sh

6)只保留七天 的数据

#模拟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

7)加入脚本

[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

8)客户端先判断文件是否存在

[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)客户端脚本加入生成校验码的操作

[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@backup backup]# md5sum -c /backup/*_$(date +%F)/flag_2020-11-30

4)使用邮件发送消息

1.服务端配置邮件功能
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=1710724925@qq.com #更改为你的邮箱
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1710724925@qq.com #更改为你的邮箱
set smtp-auth-password=jbruyyuzywrwejfb #更改为你的邮箱密文(查看复制)
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
保存退出;执行命令:输入想发送的内容,
mail -s "what are you doing?" 1710724925@qq.com < 1.txt
2.测试发送邮件
[root@backup ~] mail -s "what are you doing?" 1710724925@qq.com <1.txt

5)服务端脚本

#!/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

#4.删除6个月之前的数据
find $DIR/ -type d -mtime +180 | xargs rm -rf

6)将服务端脚本加入定时任务

[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.测试命令

/usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /backup

4.实时备份脚本编写

1)粗略版(推荐,简洁直接)

[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  &

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 &

NFS 服务

一、什么是NFS

共享存储,文件服务器

1.基本概述

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

2.为什么使用NFS

1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致

二、NFS应用

1.没有NFS时

1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85woSqAk-1605791526430)(C:\Users\秋风、亦冷\AppData\Roaming\Typora\typora-user-images\image-20201119151151190.png)]

2.如果有NFS

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6j7s1DW-1605791526438)(C:\Users\秋风、亦冷\AppData\Roaming\Typora\typora-user-images\image-20201119151203983.png)]

3.NFS原理

vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-seu3ava4-1605791526456)(C:\Users\秋风、亦冷\AppData\Roaming\Typora\typora-user-images\image-20201119151321296.png)]

1.用户访问NFS客户端,将请求转化为函数
2.NFS通过TCP/IP连接服务端
3.NFS服务端接收请求,会先调用portmap进程进行端口映射
4.Rpc.nfsd进程用于判断NFS客户端能否连接服务端;
5.Rpc.mount进程用于判断客户端对服务端的操作权限
6.如果通过权限验证,可以对服务端进行操作,修改或读取
posted @ 2022-06-09 18:19  秋风お亦冷  阅读(19)  评论(0编辑  收藏  举报