0
点赞
收藏
分享

微信扫一扫

小胖学Linux day39~41:rsync数据备份

rsync数据备份

环境准备

主机名

内网ip:WanIP

外网ip:LanIIP

角色

web01

172.16.1.7

10.0.0.7

rsync客户端

backup

172.16.1.41

10.0.0.41

rsync服务端

rsync概述

rsync作用:

数据备份,数据同步

为什么使用rsync不用scp

1.scp是基于ssh协议的命令,不是一个服务
2.scp每次都基于全量拷贝,rsync支持增量拷贝
rsync 相当于 cp rm scp tar

备份类型

rsync只支持全量备份和增量备份

  • 全量备份
  • 将数据全部备份出来
  • 增量备份
  • 基于上一次备份,新增部分的数据备份出来
  • 差异备份
  • 基于上一次全量备份,所有新增部分的数据备份出来

小胖学Linux day39~41:rsync数据备份_客户端

rsync传输模式,工作模式

注意:rsync拷贝目录时,加/和不加/是有区别的
例↓
/etc/ :将etc目录下的所有文件拷贝过去,不包括目录本身
/etc :将etc目录本身和目录下的所有文件一并拷贝过去
模式一:本地模式(local)

# 类似于cp命令:可以拷贝本地的文件目录等...
rsync [选项] 源文件.. 目标路径

## 当需要拷贝比较大的目录,或者文件比较多的目录,建议使用rsync

模式二:远程模式(remote)

# 类似于scp命令:基于ssh协议,会受到ssh协议的限制
# 语法:
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

拉:rsync [选项] [用户@]主机IP:远端文件 本机目录
推:rsync [选项] 本机文件 [用户@]主机IP:目标路径

如果不加 用户@ 默认以当前系统登录的用户为用户名

模式三:守护进程模式(daemon)

# 将rsync当成是一个服务启动起来
优势:
1.不受到ssh协议影响
2.不需要知道系统用户的密码

# 语法:
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录
推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名

rsync官网地址:​​rsync (samba.org)​​

rsync监听端口:873
rsync运行架构:C/S Client/Server

架构类型

C/S = Client/Server = 客户端/服务端
B/S = Browser/Server = 浏览器/服务端
rsync服务端的作用:存储备份数据的

企业中为啥使用守护进程模式

1.远程模式和scp差不多,基于ssh协议
2..远程模式需要知道系统的用户名和密码
3.守护进程不需要ssh协议,服务启动后,自带端口
4.守护进程可以设置匿名用户,不需要使用系统用户(更加安全)

rsync选项

-a:归档模式传输, 等于-tropgDl
==============================
-t:time 保持文件的时间信息
-r:拷贝目录时,递归拷贝
-o:owner 保持文件的属主信息
-g:group 保持文件的属组信息
-p:perm 保持文件的权限信息
-D:device 保持设备文件的信息
-l:link 保留软链接
==============================
-v:显示同步过程
-z:压缩,提高传输效率
-P:显示进度
-L:保留软链接指向的目标文件
--exclude=PATTERN 指定排除不需要传输的文件模式
--exclude-from=file 指定排除文件
--bwlimit=1 限速传输
--partial 断点续传
--delete 保存数据的同步 相当于rm
--password-file= 指定密码文件
--potr 新端口号 :如果服务端改了端口 那么客户端传输数据时要 加上这个指令

服务端操作

# 1.安装
[root@backup <sub>]# yum install -y rsync

# 2.配置
[root@backup </sub>]# 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
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

## 配置文件详情注释↓
uid = rsync # 指定服务的用户
gid = rsync # 指定服务的用户组
port = 873 # 指定该服务监听的端口(端口的范围:1<sub>65535)
fake super = yes # 不以root身份运行,传输数据时不使用系统用户,使用匿名虚拟用户
use chroot = no # 将传输内容禁锢在指定传输的目录下,不允许获取到root权限
max connections = 200 # 指定最大连接数,最多能有多少个客户端跟服务端的873端口建立连接
timeout = 600 # 指定超时时间:传输数据时如果网络波动了 超过600秒没完成任务 就断开连接
# 超出最大连接客户时 等待的客户也是超过600秒后就断开连接
ignore errors # 忽略错误
read only = false # 只读 = false :不只读 可读可写
list = false # 不允许查看模块信息,时间传输时,客户只能看到模块名,看不到文件目录路径
auth users = rsync_backup # 指定匿名虚拟用户
secrets file = /etc/rsync.passwd # 指定匿名虚拟用户的密码文件
log file = /var/log/rsyncd.log # 指定日志文件存放的位置
#####################################
[backup] # 指定模块名
comment = welcome to oldboyedu backup! # 指定模块的描述信息
path = /backup # 指定备份的目录

# 3.创建rsync系统用户
[root@backup </sub>]# useradd rsync -s /sbin/nologin -M

# 4.创建服务端的密码文件
[root@backup <sub>]# vim /etc/rsync.passwd
rsync_backup:123

[root@backup </sub>]# echo 'rsync_backup:123456' > /etc/rsync.passwd

# 5.修改密码文件的权限为 600
[root@backup <sub>]# chmod 600 /etc/rsync.passwd
## 注:规定600 只能由这个文件的属主 也就是root用户看到密码

# 6.创建备份目录
[root@backup </sub>]# mkdir /backup

# 7.修改备份目录的属组和属主
[root@backup <sub>]# chown rsync:rsync /backup/

# 8.启动rsync服务并加入开机自启
[root@backup </sub>]# systemctl start rsyncd
[root@backup <sub>]# systemctl enable rsyncd

# 9.检查服务进程
[root@backup </sub>]# ps -ef|grep [r]sync
root 1610 1 0 09:48 ? 00:00:00 /usr/bin/rsync --daemon --no-detach

# 10.检查服务端口
[root@backup ~]# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1610/rsync
tcp6 0 0 :::873 :::* LISTEN 1610/rsync

客户端操作

# 推拉语法:
推:rsync [option..] 原文件 [用户名@]主机IP::模块名
rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup

拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录
rsync -avz rsync_backup@172.16.1.41::backup /etc/passwd

## 安装
[root@web01 <sub>]# yum install -y rsync

### 客户端免密码传输的方法:
## 方法一:客户端创建密码文件
# 1.客户端上的密码文件,只需要写密码,不需要写用户
[root@web01 </sub>]# vim /etc/rsync.pass
123
# 2.客户端上的密码文件也必须是600权限
[root@web01 <sub>]# chmod 600 /etc/rsync.pass
# 3.推拉数据时加上 --password-file=密码文件 指定密码文件
[root@web01 </sub>]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass

## 方法二:将密码写入环境变量免交互输入密码
[root@web01 <sub>]# export RSYNC_PASSWORD=123
(立即生效指令↑)(环境变量↑)

### 报错案例
# 1.用户密码认证失败
[root@web01 </sub>]# rsync -avz /etc/passwd rsync_backup@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.密码输入错误
3.密码文件的权限不是600

# 2,模块名错误
[root@web01 <sub>]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::bak
@ERROR: Unknown module 'bak'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]

# 3,无法和172.16.1.41rsync服务建立连接
[root@web01 </sub>]# rsync -avz /etc/passwd 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]
错误原因:
1.防火墙
2.selinux
3.服务没启动
4.服务的端口改了
## 连接问题检验方法
# 检验网络通不通
ping baidu.com
# 检验通信是否有问题
ping 172.16.1.41
# 检验端口通不通


# 4密码文件权限错误(客户端的密码文件权限也必须是600,否则报错)
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]

排错过程

## 服务端
# 1.检查配置文件写入内容
[root@backup <sub>]# cat /etc/rsyncd.conf
# 2.检查密码文件的权限是否是600
[root@backup </sub>]# ll /etc/rsync.passwd
-rw------- 1 root root 20 May 16 17:37 /etc/rsync.passwd
# 3.检查密码文件中的内容
检查用户名是否和配置文件中的用户名一致
# 4.检查模块目录的权限
模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限

## 客户端
# 1.检查命令用户名
命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup
# 2.检查命令模块名
命令中的模块名要跟服务端配置文件中的模块名一致 backup
# 3.如果有密码文件,检查权限是否是600
[root@web01 <sub>]# ll /etc/rsync.pass
-rw------- 1 root root 4 May 16 10:26 /etc/rsync.pass
# 4.如果是把密码写入密码文件 就检查密码文件内容
密码文件内容只需要写入密码
# 5.如果是把密码写入环境变量 就检查环境变量中的密码
[root@web01 </sub>]# echo $RSYNC_PASSWORD
123
密码是否和服务端密码文件保持一致

rsync命令底层运行过程

小胖学Linux day39~41:rsync数据备份_服务端_02

# 第一步
和172.16.1.41IP地址建立连接
# 第二步
和该P地址的873端口建立连接
# 第三步
检查配置文 检查以下内容
1.用户名检查
-检查服务端配置文件中指定的用户名
-检查服务端配置文件中指定密码的用户名
-检查rsync命令中指定的用户名
2.密码
-检查服务端配置文件中指定的密码
-检查客户端配置的密码是否一致
3.检查服务端密码文件权限是否为600
4.检查rsync命令和服务端配置文件中指定模块名是否一致
# 第四步
读取配置文件中模块名的path
1.检查服务端配置文件中指定的目录是否存在
2.检查服务端配置文件中指定的目录权限
# 第五步
全部没问题后 完成远程传输数据

企业级备份案例

环境准备

主机名

WanIP

LanIP

角色

web01

10.0.0.7

172.16.1.7

rsync客户端

nfs

10.0.0.31

172.16.1.31

rsync客户端

backup

10.0.0.41

172.16.1.41

rsync服务端

先决条件

# 1.时间同步
crontab -e
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null

# 2.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 3.关闭selinux
setenforce 0

sed -i 's#selinux=enforcing#selinux=disabled#g' /etc/sysconfig/selinux

内容需求

## 客户端需求:
1.客户端提前准备存放的备份的目录,目录规则如下: /client_backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名: nfs_172.16.1.31_2022-05-16.tar.gz
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

## 服务端需求:
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除

如何校验一个数据的完整性

# md5加密算法
md5sum 文件名 ## 给指定的文件生成一个加密字符串

1.备份打包后,给压缩包做一个MD5加密
/client_backup/nfs_172.16.1.31_2022-05-16.tar.gz
md5sum nfs_172.16.1.31_2022-05-16.tar.gz > jiaoyan.txt
2.将校验文件,和压缩包一并传递到服务端
3.在服务端使用 md5sum -c 检查校验

## 完整传输
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: OK

## 被篡改或不完整
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

脚本实现客户端需求

1.客户端提前准备存放的备份的目录,目录规则如下:`/client_backup`
mkdir /client_backup

2.客户端在本地打包备份(/etc/passwd)拷贝至`/client_backup`
包名规则:`nfs_172.16.1.31_2022-05-16.tar.gz`
cd /etc && tar zcf /client_backup/nfs_172.16.1.31_2022-05-16.tar.gz passwd

3.客户端最后将备份的数据进行推送至备份服务器
rsync -avz /client_backup/ rsync_backup@172.16.1.41::backup

4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /client_backup -type f ! -mtime -7|xargs rm -f

5.客户端每天凌晨1点定时执行该脚本
crontab -e
00 01 * * * /bin/sh /root/bakup.sh &>/dev/null

## 编写脚本
[root@web01 ~]# vim /root/backup.sh
#!/bin/bash
bak_dir="/client_backup"
host_name=`hostname`
ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`
export RSYNC_PASSWORD=123

# 1.创建客户端的备份目录
mkdir $bak_dir -p
# 2.进入备份目录,压缩备份文件
cd /etc && \
tar zcf $bak_dir/${host_name}_${ip}_${date_time}.tar.gz passwd
# 3.生成校验文件
cd $bak_dir && \
md5sum ${host_name}_${ip}_${date_time}.tar.gz > ${host_name}_${ip}_${date_time}.md5
# 4.推送数据到rsync服务端
rsync -avz $bak_dir/ rsync_backup@172.16.1.41::backup
# 5.保留7天内的文件
find $bak_dir -type f ! -mtime -7|xargs rm -f

脚本实现服务端需求

1.服务端部署rsync,用于接收客户端推送过来的备份数据
[root@backup <sub>]# 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
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

2.服务端需要每天校验客户端推送过来的数据是否完整
cd /backup/ && md5sum -c *2022-05-16.md5

3.服务端需要每天校验的结果通知给管理员
md5sum -c *2022-05-16.md5 |mail -s 'xxx' 123@qq.com
## 配置发邮件
# 1.安装发邮件服务
[root@backup </sub>]# yum install -y mailx
# 2.修改邮箱配置文件
[root@backup <sub>]# vim /etc/mail.rc
该配置文件末行输入以下内容:
set from=441384871@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=441384871@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

4.服务端仅保留6个月的备份数据,其余的全部删除
find /backup -type f ! -mtime -180|xargs rm -f

## 编写脚本
[root@backup </sub>]# vim check_md5.sh
#!/bin/bash
bak_dir="/backup"
host_name=`hostname`
ip=`ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`

cd ${bak_dir} && \
md5sum -c *${date_time}.md5|mail -s "${date_time}_数据备份校验" 管理员邮箱 >/dev/null
find /backup -type f ! -mtime -180|xargs rm -f

测试crontab

## 客户端定时任务
[root@web01 <sub>]# crontab -e
# Usage: File Backup Task By:wyk Date:2022/05/16
00 01 * * * /bin/sh /root/backup.sh &>/dev/null

[root@nfs </sub>]# crontab -e
# Usage: File Backup Task By:wyk Date:2022/05/16
00 01 * * * /bin/sh /root/backup.sh &>/dev/null

## 服务端定时任务
[root@backup ~]# crontab -e
# Usage: File Backup Task By:wyk Date:2022/05/16
01 01 * * * /bin/sh /root/check_md5.sh &>/dev/null
## 注:时间上需要在客户端定时任务完成之后

校对成功

小胖学Linux day39~41:rsync数据备份_配置文件_03

rsync结合inotify实时同步 [扩展]

如果只是做备份,不需要实时备份
定时任务最小单位是分钟级别 无法精确到秒
数据需要实时同步该如何解决?

inotify概述

inotify其实是一个监控命令,监控一个文件或目录的状态
作用:为了保证数据的一致性

# 1.安装inotify(客户端安装即可)
yum install -y inotify-tools

# 2.选项
-m 持续监控
-r 递归
-q 静默,仅打印时间信息

--timefmt 指定输出时间格式

--format 指定事件输出格式 # 格式内容如下
%Xe 事件
%w 目录
%f 文件

-e 指定监控的事件 # 事件类型如下
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载

# 3.案例:监控测试 监控该目录里被指定的事件
[root@web01 <sub>]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /client_backup
CREATE /client_backup/ 1.txt
ATTRIB /client_backup/ 1.txt
CLOSE_WRITEXCLOSE /client_backup/ 1.txt
## 往这个文件例创建了一个1.txt文件时触发了三个指定的动作 创建 属性修改 修改真实文件内容

# 4.编写脚本
#!/bin/bash
dir=/client_backup/
export RSYNC_PASSWORD=123
inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir|while read line;do
rsync -az --delete $dir rsync_backup@172.16.1.41::backup
done &
## | 左边的内容每输出一次内容就交给while循环一次 最后的 & 是将脚本放在后台执行

# 5.测试同步
## 客户端
[root@web01 </sub>]# sh rsync_inotify.sh
[root@web01 <sub>]# touch /client_backup/3.xtxt

## 服务端 # watch ls -l :实时监控
[root@backup </sub>]# watch ls -l /backup/
-rw-r--r-- 1 rsync rsync 0 May 17 15:04 3.txt


举报

相关推荐

0 条评论