Rsync 备份服务:基本概述、应用场景、传输模式、注意事项、密码解决方案、服务实践、备份案例、结合inotify

Rsync 备份服务

Rsync基本概述

rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。

Rsync简介
rsync英文称为remote synchronization,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。

rsync官方地址:TP
rsync监听端口:873
rsync运行模式:C/S

小提示:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。

Rsync的特性
支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用scp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

生产场景架构集群备份方案
1.借助cron+rsync把所有客户服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。

备份类型介绍
完全备份
增量备份
假设客户端上有file1 file2 file3文件,服务端上有file1文件,现要将客户端上的数据备份至服务端
在这里插入图片描述
全量备份,将客户端所有的数据内容file1 file2 file3全部备份至服务端 (效率低下, 占用空间)
在这里插入图片描述
增量备份,将客户端的file2 file3增量备份至服务端 (提高备份效率,节省空间, 适合异地备份 )

Rsync的应用场景

Rync的数据同步模式
1.推: 所有主机推送本地数据至Rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
在这里插入图片描述
2.拉: rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大
在这里插入图片描述
3.大量服务器备份场景
在这里插入图片描述
4.异地备份实现思路
在这里插入图片描述

Rsync传输模式

Rsync使用三种主要的数据传输方式
本地方式
远程方式
守护进程

本地传输方式

单个主机本地之间的数据传输(此时类似于cp命令)
本地拷贝数据命令

Local:  rsync [OPTION...] SRC... [DEST]

本地拷贝数据示例

[root@backup ~]# rsync  -avz  /etc/passwd  /tmp/
rsync       #备份命令(cp)
[options]   #选项
SRC...      #本地源文件
[DEST]      #本地目标文件

使用rsync进行复制文件

注意事项: rsync在操作目录的过程中 如果目录后面加/ 则操作的是目录下面的文件 如果目录后面不加/ 则是操作的目录本身 其他命令目录后面加/和不加/意义相同

[root@backup ~]# rsync -avz ahui /opt/
sending incremental file list
ahui/
ahui/1.txt

sent 118 bytes  received 39 bytes  314.00 bytes/sec
total size is 0  speedup is 0.00
[root@backup ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 19 Jun  7 09:39 ahui

默认rsync使用增量的拷贝方式

[root@backup ~]# touch ahui/2.txt
[root@backup ~]# rsync -avz ahui /opt/
sending incremental file list
ahui/
ahui/2.txt

sent 143 bytes  received 39 bytes  364.00 bytes/sec
total size is 0  speedup is 0.00

远程传输方式

通过ssh通道传输数据,类似scp命令

pull拉取数据命令

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

下载: rsync -avz 远程用户@IP:源文件/源目录 目标位置
将远程服务器上的文件 下载到本地的某个目录下
pull拉取数据示例

[root@backup ~]# rsync -avz root@172.16.1.41:/etc/hostname ./   #拉取远程文件
[root@backup ~]# rsync -avz root@172.16.1.41:/root/ /backup/   #拉取远程目录下的所有文件
[root@backup ~]# rsync -avz root@172.16.1.41:/root /backup/    #拉取远程目录以及目录下的所有文件
Pull        #拉取, 下载,更新
rsync       #备份命令
[options]   #选项
[USER@]     #真实的系统用户 管理员 普通用户
			#表示远程拷贝数据时需要验证的用户身份
			#如果为root 那拥有拷贝所有文件的权限
			#如果为ahui普通用户  只能下载ahui有权限的文件
			#默认以当前登陆的系统用户为远程验证的用户
			#如果当前登陆系统用户为ahui 在下载时使用 rsync -avz 10.0.0.31:/etc/hosts /opt/
			#默认验证方式就是ahui用户    rsync -avz ahui@10.0.0.31:/etc/hosts /opt/  
			#以ahui用户进行身份验证 下载31的hosts文件到本地/opt目录下
			
HOST        #目主机IP地址或域名
SRC...      #目标主机源文件
[DEST]      #下载至本地哪个位置

在41服务器下载31下的/etc/hosts文件到当前目录

[root@backup ~]# rsync -avz 172.16.1.31:/etc/hosts .
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:aue4n851RYpyNcK5oViChFpxT/NJSzzMxlINWQt+HVs.
ECDSA key fingerprint is MD5:73:86:d2:db:73:80:93:1f:62:b9:53:98:85:63:d0:04.
Are you sure you want to continue connecting (yes/no)? yes   #输入yes
Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.
root@172.16.1.31's password:  		# 需要验证31root的密码 而非41的root密码
receiving incremental file list
hosts

sent 43 bytes  received 136 bytes  12.34 bytes/sec
total size is 158  speedup is 0.88
[root@backup ~]# ll
total 4
-rw-r--r-- 1 root root 158 Jun  7  2013 hosts

在31创建odboy用户

[root@nfs ~]# useradd ahui
[root@nfs ~]# 
[root@nfs ~]# echo 1|passwd --stdin ahui
Changing password for user ahui.
passwd: all authentication tokens updated successfully.

在41通过ahui用户下载/root/test.txt

[root@backup ~]# rsync -avz ahui@172.16.1.31:/root/test.txt .
ahui@172.16.1.31's password: 
receiving incremental file list
rsync: change_dir "/root" failed: Permission denied (13)		#权限拒绝

普通用户下载31的/etc/hosts文件

[root@backup ~]# rsync -avz ahui@172.16.1.31:/etc/hosts .
ahui@172.16.1.31's password: 
receiving incremental file list
hosts

使用域名方式下载: 先配置hosts解析 然后使用nfs为主机进行远程下载

[root@backup ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.31   nfs
[root@backup ~]# rsync -avz root@nfs:/etc/passwd .

注意目录:
31上下载41/root下的ahui目录到当前目录

[root@nfs ~]# rsync -avz 172.16.1.41:/root/ahui .
The authenticity of host '172.16.1.41 (172.16.1.41)' can't be established.
ECDSA key fingerprint is SHA256:aue4n851RYpyNcK5oViChFpxT/NJSzzMxlINWQt+HVs.
ECDSA key fingerprint is MD5:73:86:d2:db:73:80:93:1f:62:b9:53:98:85:63:d0:04.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.41' (ECDSA) to the list of known hosts.
root@172.16.1.41's password: 
receiving incremental file list
ahui/
ahui/1.txt
ahui/2.txt

sent 66 bytes  received 179 bytes  98.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs ~]# ll
total 0
drwxr-xr-x 2 root root 32 Jun  7 09:53 ahui

如果后面加/ 拷贝是目录下的文件 不包含目录

[root@nfs ~]# ll
total 0
drwxr-xr-x 2 root root 32 Jun  7 09:53 ahui
-rw-r--r-- 1 root root  0 Jun  7 10:24 test.txt
[root@nfs ~]# rm -rf ahui/

[root@nfs ~]# rsync -avz 172.16.1.41:/root/ahui/ .
root@172.16.1.41's password: 
receiving incremental file list
./
1.txt
2.txt

sent 65 bytes  received 163 bytes  91.20 bytes/sec
total size is 0  speedup is 0.00
[root@nfs ~]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  7 09:39 1.txt
-rw-r--r-- 1 root root 0 Jun  7 09:53 2.txt

push推送数据命令

Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

推送: rsync -avz 本地的文件 远程用户名@远程IP地址:远程目录位置
将本地的数据上传到远程服务器的某个目录下
push推送数据示例

rsync -avz /backup/2018-10-01 root@172.16.1.41:/tmp/
Push        #推送, 上传
rsync       #备份命令
[options]   #选项
SRC...      #本地源文件
[USER@]     #目标主机的系统用户
HOST        #目主机IP地址或域名
[DEST]      #目标对应位置

在41上将/etc/hosts文件上传到 31的/opt目录下

[root@backup ~]# rsync -avz /etc/hosts root@172.16.1.31:/opt
root@172.16.1.31's password: 
sending incremental file list
hosts

sent 153 bytes  received 35 bytes  125.33 bytes/sec
total size is 174  speedup is 0.93

Rsync借助SSH协议同步数据存在的缺陷
1.使用系统用户(不安全)
2.使用普通用户(会导致权限不足情况)


守护进程传输方式

rsync自身非常重要的功能(不使用系统用户,更加安全)
守护进程: 服务时时的在后台运行称为守护进程模式
pull拉取数据命令

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

1.拉取rsync备份服务的"backup模块"数据至本地/mnt目录

[root@nfs01 ~]# rsync -avz rsync_backup@192.172.16.1.41::backup/ /mnt/ --password-file=/etc/rsync.password
rsync           #命令
[OPTION...]     #选项
[USER@]         #远程主机用户(虚拟用户)
HOST::          #远程主机地址  
SRC...          #远程主机模块(不是目录)
[DEST]          #将远程主机数据备份至本地什么位置     

push推送数据命令

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

2.将本地/mnt目录推送至rsync备份服务器的backup模块

[root@nfs01 ~]# rsync -avz /mnt/ rsync_backup@192.172.16.1.41::backup/ --password-file=/etc/rsync.password
rsync           #命令
[OPTION...]     #选项
SRC...          #远程主机模块(不是目录)
[USER@]         #远程主机用户(虚拟用户)
HOST::          #远程主机地址
[DEST]          #将远程主机模块备份至本地什么位置

守护进程传输方式流程
服务端: 10.0.0.41 hostname=backup
第一个流程: 下载安装服务 默认已经安装

[root@backup ~]# yum -y install rsync

第二个流程: 配置服务

[root@backup ~]# cat /etc/rsyncd.conf # rsync服务默认的配置文件
[root@backup ~]# cat /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		# 密码文件

[backup]								# 模块名称 执行命令需要用模块名称  可以自定义修改任意名称
path = /backup				            # 存储文件的目录

第三个流程: 根据配置文件创建必要的信息
1)确认rsync虚拟用户是否存在 如果没有则创建

[root@backup ~]# id rsync
id: rsync: no such user  #找不到rsync用户

创建虚拟用户 不允许登陆 不创建家目录

[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# id rsync
uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)

2)认证用户不需要创建
3)密码文件 手动可以修改密码的名称和位置
创建密码文件: 密码文件名称和配置文件中的密码文件名称必须相同

[root@backup ~]# vim /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
rsync_backup:123456

4)给密码文件授权为600权限

[root@backup ~]# chmod 600 /etc/rsync.passwd 
[root@backup ~]# ll /etc/rsync.passwd
-rw------- 1 root root 20 Jun  7 11:13 /etc/rsync.passwd

5)创建backup目录

[root@backup ~]# mkdir /backup
[root@backup ~]# ll -d /backup
drwxr-xr-x 2 root root 6 Jun  7 11:18 /backup

[root@backup ~]# chown rsync.rsync /backup/
[root@backup ~]# ll -d /backup/
drwxr-xr-x 2 rsync rsync 6 Jun  7 11:18 /backup/

第三个流程: 启动服务

[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

查看服务是否启动成功:

[root@backup ~]# netstat -tnulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      17365/rsync  

第四个流程: 测试服务
客户端: 10.0.0.200
上传/etc/hosts 到服务器的backup模块----> /backup目录

使用rsync_backup用户推送 出现权限拒绝

[root@ahui ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password: 
sending incremental file list
hosts
rsync: mkstemp ".hosts.H9BOgG" (in backup) failed: Permission denied (13)

修改目录权限为 rsync.rsync 正常写入到目录

[root@ahui ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password: 
sending incremental file list
hosts

sent 140 bytes  received 43 bytes  52.29 bytes/sec
total size is 158  speedup is 0.86

Rsync注意事项:

   远程访问模式:
      不区分客户端和服务端 在任意的服务器上都可以进行下载和上传数据
      在200执行
      rsync -avz root@172.16.1.41:/etc/hosts .
      rsync -avz /etc/hosts root@172.16.1.41
      在41执行
      rsync -avz /etc/hosts root@172.16.1.200:/root/
      rsync -avz root@172.16.1.200:/etc/hosts .

  守护进程模式:
      服务端 启动服务
      有自己创建的验证用户 提高安全性 rsync_backup
      以模块的方式进行发送数据
      在客户端可以将数据上传到模块对应的目录
      在客户端将模块对应的目录下数据下载到客户端
      守护进程模式 服务端不能主动下载客户端的数据(可以使用远程访问模式)
Rsync命令对应选项
-a         #归档模式传输, 等于-tropgDl
-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         #使用密码文件

Rsync每次都输入密码解决方案:

[root@ahui ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password: 			# 默认手动交互

第一种方式: 在客户端创建一个密码文件 密码文件内容: 123456
           在执行命令 指定密码文件 不需要和我们进行手动交互

[root@ahui ~]# echo 123456 > /etc/rsync.passwd
[root@ahui ~]# cat /etc/rsync.passwd
123456

授权密码文件600

[root@ahui ~]# chmod 600 /etc/rsync.passwd 

推送使用指定密码文件的方式

[root@ahui ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd

第二种方式: 通过rsync的内置变量 RSYNC_PASSWORD 给内置变量赋值
            在执行rsync的验证密码过程中 rsync会先读取内置变量RSYNC_PASSWORD里面是否有密码 如果有则验证 如果没有 则提示让用户输入密码
           如果指定了密码文件 则会读取密码文件中的密码
           给内置变量授权密码 命令是临时赋值 重启失效 永久生效 写入文件中 /etc/profile 开机自动生效

#export:临时变量,退出登录失效
[root@ahui ~]# export RSYNC_PASSWORD=123456

执行rsync过程会验证RSYNC_PASSWORD内置变量中的密码

[root@ahui ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
sending incremental file list

sent 42 bytes  received 20 bytes  41.33 bytes/sec
total size is 158  speedup is 2.55

案例: 打包hosts 和passwd 然后以时间命名 上传到41的bakcup模块

[root@ahui ~]# cat backup.sh
cd /etc/
tar zcf `date +%F-%H-%M-%S`.tar.gz hosts passwd
#rsync -avz `date +%F-%H-%M-%S`.tar.gz rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
export RSYNC_PASSWORD=123456
rsync -avz `date +%F-%H-%M-%S`.tar.gz rsync_backup@172.16.1.41::backup
[root@ahui ~]# sh backup.sh
sending incremental file list
2022-06-07-12-12-49.tar.gz

Rsync服务实践

准备

主机角色外网IP(WAN)内网IP(LAN)主机名称
Rsync服务端10.0.0.41172.16.1.41backup
Rsync客户端10.0.0.31172.16.1.31nfs

安装Rsync

[root@backup ~]# yum -y install rsync

配置Rsync

[root@backup ~]# cat /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 ahui backup!
path = /backup

— 配置详解

[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync                      # 运行进程的用户
gid = rsync                      # 运行进程的用户组
port = 873                       # 监听端口
fake super = yes                 # 无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no                  # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 200            # 最大连接数
timeout = 600                    # 超时时间
ignore errors                    # 忽略错误信息
read only = false                # 对备份数据可读写
list = false                     # 不允许查看模块信息
auth users = rsync_backup        # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径

[backup]                # 定义模块信息
comment = commit        # 模块注释信息
path = /backup          # 定义接收备份数据目录

创建用户
创建一个用来运行rsync服务的用户身份

#1) 创建rsync账户,不允许登录不创建家目录
[root@backup ~]# useradd -M -s /sbin/nologin rsync

#2) 创建备份目录(尽可能磁盘空间足够大),授权rsync用户为属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/

虚拟用户配置
创建虚拟用户密码文件, 授权600安全权限(用于客户端连接时使用的用户)

[root@backup ~]# echo "rsync_backup:zls" >/etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd

进程管理
启动rsync服务,并将rsync加入开机自启动

[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd


检查端口

[root@backup ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      4758/rsync 

客户端配置
Rsync客户端仅需配置虚拟用户的密码,并授权为600安全权限

#方式一:适合终端执行指定用户密码文件
[root@nfs01 ~]# yum install rsync -y
[root@nfs01 ~]# echo "zls" > /etc/rsync.pass
[root@nfs01 ~]# chmod 600 /etc/rsync.pass

#方式二:脚本中使用,强烈推荐方式
[root@nfs01 ~]# export RSYNC_PASSWORD=zls

案例一:客户端推送backup目录下所有内容至Rsync服务端

[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup/

案例二:客户端拉取Rsync服务端 backup模块数据至本地客户端的 /backup目录

[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]#rsync -avz rsync_backup@172.16.1.41::backup /backup/

案例三:Rsync实现数据无差异同步

#拉取远端数据:远端与本地保持一致,远端没有本地有会被删除, 造成客户端数据丢失
[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup/ /data/

#推送数据至远端:本地与远端保持一致, 本地没有远端会被删除, 造成服务器端数据丢失
[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]# rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup/

案例四:Rsync的Limit限速

#企业案例: 某DBA使用rsync拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应

[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/

案例五:

打包hosts 和passwd 然后以时间命名 上传到41的bakcup模块
在200 上传以主机名称和IP地址命名的目录到41服务器的backup模块
第一步: 创建目录

[root@ahui ~]# hostname
ahui
[root@ahui ~]# echo `hostname`_`ifconfig eth0|awk 'NR==2{print $2}'`
ahui_10.0.0.200
[root@ahui ~]# mkdir `hostname`_`ifconfig eth0|awk 'NR==2{print $2}'`
[root@ahui ~]# ll
total 0
drwxr-xr-x 2 root root 6 Jun  7 11:34 ahui_10.0.0.200

第二步: 使用rsync上传

[root@ahui ~]# rsync -avz `hostname`_`ifconfig eth0|awk 'NR==2{print $2}'` rsync_backup@172.16.1.41::backup
Password: 
sending incremental file list
ahui_10.0.0.200/

Rsync备份案例

使用3台服务器主机名分别为web01、backup 、nfs主机信息见下表:

角色外网IP(WAN)内网IP(LAN)主机名
WEBeth0:10.0.0.7eth1:172.16.1.7web01
Rsynceth0:10.0.0.41eth1:172.16.1.41backup

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

注意:所有服务器的备份目录必须都为/backup

建议备份的数据内容如下:

1.开机自启动配置文件 设备挂载配置文件 本地内网配置文件 (系统配置文件)
/etc/rc.local /etc/fstab /etc/hosts
2.cron定时任务 firewalld防火墙 脚本目录 (重要目录)
/var/spool/cron/ /etc/firewalld /server/scripts
3.系统日志文件
/var/log/ //系统安全日志、sudo日志、内核日志、rsyslog日志
4.应用程序服务配置文件 nginx、PHP、mysql、redis…

客户端提前
1.准备存放的备份的目录,目录规则如下:/backup/web1_172.16.1.7_2018-08-08 当前时间
1)创建/backup目录

[root@web1 ~]# mkdir /backup

2)在/backup目录下创建以主机名称+ip地址+时间命名目录

[root@web1 ~]# hostname
web1
[root@web1 ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.7
[root@web1 ~]# echo `date +%F`
2022-06-08
[root@web1 ~]# echo `date +%F-%H-%M-%S`
2022-06-08-11-33-07
[root@web1 ~]# echo /backup/`hostname`
/backup/web1
[root@web1 ~]# echo /backup/`hostname`_`ifconfig eth0|awk 'NR==2{print $2}'`
/backup/web1_10.0.0.7
[root@web1 ~]# echo /backup/`hostname`_`ifconfig eth0|awk 'NR==2{print $2}'`_`date +%F-%H-%M-%S`
/backup/web1_10.0.0.7_2022-06-08-11-35-09

通过变量赋值的方式进行拼接为目录名称

[root@web1 ~]# HOST=`hostname`
[root@web1 ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.7
[root@web1 ~]# IP=`ifconfig eth0|awk 'NR==2{print $2}'`
[root@web1 ~]# echo $IP
10.0.0.7
[root@web1 ~]# echo `date +%F-%H-%M-%S`
2022-06-08-11-37-00
[root@web1 ~]# TIME=`date +%F-%H-%M-%S`		# 赋值一次 后面调用多次TIME值 不会发生变化
[root@web1 ~]# echo $TIME
2022-06-08-11-37-08
[root@web1 ~]# echo $HOST
web1
[root@web1 ~]# echo $HOST_$IP_$TIME
2022-06-08-11-37-08
[root@web1 ~]# echo ${HOST}_${IP}_$TIME
web1_10.0.0.7_2022-06-08-11-37-08

在当前创建

[root@web1 ~]# mkdir ${HOST}_${IP}_$TIME
[root@web1 ~]# ll
total 0
drwxr-xr-x 2 root root 6 Jun  8 11:43 web1_10.0.0.7_2022-06-08-11-41-13

/backup目录下创建

[root@web1 ~]# mkdir /backup/${HOST}_${IP}_$TIME
[root@web1 ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 6 Jun  8 11:43 web1_10.0.0.7_2022-06-08-11-41-13

2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/web1_10.0.0.7_2022-06-08-11-41-13

[root@web1 ~]# tar zcvf /backup/${HOST}_${IP}_$TIME/etc.tar.gz  /etc/hosts /etc/passwd 
tar: Removing leading `/' from member names
/etc/hosts
/etc/passwd
[root@web1 ~]# ll /backup/web1_10.0.0.7_2022-06-08-11-41-13/
total 4
-rw-r--r-- 1 root root 747 Jun  8 11:47 etc.tar.gz

[root@web1 ~]# tar zcvf /backup/${HOST}_${IP}_$TIME/etc.tar.gz  /etc/hosts /etc/passwd 
tar: Removing leading `/' from member names
/etc/hosts
/etc/passwd
[root@web1 ~]# ll /backup/web1_10.0.0.7_2022-06-08-11-41-13/
total 4
-rw-r--r-- 1 root root 747 Jun  8 11:47 etc.tar.gz
[root@web1 ~]# ll /backup/${HOST}_${IP}_$TIME/
total 4
-rw-r--r-- 1 root root 747 Jun  8 11:47 etc.tar.gz

3.客户端最后将备份的数据进行推送至备份服务器

[root@web1 ~]# rsync -avz /backup/${HOST}_${IP}_$TIME rsync_backup@172.16.1.41::backup
sending incremental file list
web1_10.0.0.7_2022-06-08-11-41-13/
web1_10.0.0.7_2022-06-08-11-41-13/etc.tar.gz

4.客户端每天凌晨1点定时执行该脚本
将命令写入到文本中
以正常命令执行:

[root@web1 ~]# mkdir /server/scripts -p
[root@web1 ~]# cd /server/scripts/
[root@web1 scripts]# cat backup.sh
#客户端提前准备存放的备份的目录,目录规则如下:/backup/web1_172.16.1.7_2018-08-08 当前时间
mkdir -p /backup/web1_172.16.1.7_2022-06-08

#2.客户端在本地打包备份放入上面创建好的目录下
cd /etc/
tar zcf /backup/web1_172.16.1.7_2022-06-08/etc.tar.gz hosts passwd

#3.客户端最后将备份的数据进行推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz /backup/web1_172.16.1.7_2022-06-08 rsync_backup@172.16.1.41::backup

-------------------基于上面的命令进行脚本优化----------------------------------------------

[root@web1 scripts]# cat backup.sh 
#定义变量
HOST=`hostname`
IP=`ifconfig eth0|awk 'NR==2{print $2}'`
TIME=`date +%F-%H-%M-%S`
DIR=/backup/${HOST}_${IP}_$TIME

#客户端创建以主机名称+IP地址+时间命名
mkdir -p  $DIR

#2.客户端在本地打包备份放入上面创建好的目录下
cd /etc/
tar zcf $DIR/etc.tar.gz hosts passwd

#3.客户端最后将备份的数据进行推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $DIR  rsync_backup@172.16.1.41::backup

写入定时任务每天凌晨1点执行备份任务(写前先按照每分钟进行测试 没问题后修改成正常的时间)

[root@web1 ~]# crontab -l
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
00 01 * * * sh /server/scripts/backup.sh &>/dev/null   

5.避免浪费磁盘空间 客户端查找7天前的文件然后删除

[root@web1 scripts]# cat backup.sh 
#定义变量
HOST=`hostname`
IP=`ifconfig eth0|awk 'NR==2{print $2}'`
TIME=`date +%F-%H-%M-%S`
DIR=/backup/${HOST}_${IP}_$TIME

#客户端创建以主机名称+IP地址+时间命名
mkdir -p  $DIR

#2.客户端在本地打包备份放入上面创建好的目录下
cd /etc/
tar zcf $DIR/etc.tar.gz hosts passwd

#3.客户端最后将备份的数据进行推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $DIR  rsync_backup@172.16.1.41::backup

#4.查找7天前的文件并且删除
find /backup/ -mtime +7|xargs rm &>/dev/null

服务端
1.服务端部署rsync,用于接收客户端推送过来的备份数据

[root@backup ~]# yum -y install rsync
[root@backup ~]# cat /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

[backup]
path = /backup

根据配置文件创建必要的信息:
1)创建用户rsync

[root@web1 ~]useradd -s /sbin/nologin -M rsync

2)创建密码文件

[root@web1 ~]echo rsync_backup:123456 > /etc/rsync.passwd
[root@web1 ~]chmod 600 /etc/rsync.passwd

3)创建共享目录

[root@web1 ~]mkdir /backup
[root@web1 ~]chown rsync.rsync /backup```

最后启动并加入开机自动运行:

[root@web1 ~]systemctl start rsyncd
[root@web1 ~]systemctl enable rsyncd

2.服务端需要每天校验客户端推送过来的数据是否完整
通过MD5校验的方式 检测在传输过程中没有被人篡改!
1)推送前对当前的文件提前做指纹

[root@web1 ~]# cat test.txt
1111
[root@web1 ~]# md5sum test.txt
1f18348f32c9a4694f16426798937ae2  test.txt

2)将指纹写入到一个文件中

[root@web1 ~]# md5sum test.txt > md5.txt
[root@web1 ~]# cat md5.txt 
1f18348f32c9a4694f16426798937ae2  test.txt
[root@web1 ~]# ll
total 8
-rw-r--r-- 1 root root 43 Jun  8 15:29 md5.txt
-rw-r--r-- 1 root root  5 Jun  8 15:28 test.txt

3)将文件和校验文件 一起发给服务端

[root@web1 ~]# rsync -avz md5.txt test.txt rsync_backup@172.16.1.41::backup
sending incremental file list
md5.txt
test.txt

4)在服务端进行校验数据的完整性
md5sum -c md5.txt

修改客户端脚本增加MD5校验结果

[root@web1 scripts]# cat backup.sh
#定义变量
HOST=`hostname`
IP=`ifconfig eth0|awk 'NR==2{print $2}'`
TIME=`date +%F-%H-%M-%S`
DIR=/backup/${HOST}_${IP}_$TIME

#客户端创建以主机名称+IP地址+时间命名
mkdir -p  $DIR

#2.客户端在本地打包备份放入上面创建好的目录下
cd /etc/
tar zcf $DIR/etc.tar.gz hosts passwd

#3.对打包后的文件做MD5校验值 存入md5.txt文件中
md5sum $DIR/etc.tar.gz > $DIR/md5.txt

#3.客户端最后将备份的数据进行推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $DIR  rsync_backup@172.16.1.41::backup


#4.查找7天前的文件并且删除
find /backup/ -mtime +7|xargs rm &>/dev/null

服务端检测校验结果:

[root@backup ~]# md5sum -c /backup/web1_10.0.0.7_2022-06-08-16-25-09/md5.txt 
/backup/web1_10.0.0.7_2022-06-08-16-25-09/etc.tar.gz: OK

3.服务端需要每天校验的结果通知给管理员 需要用到邮件配置

[root@backup /]# vim /etc/mail.rc
set from=xxxxxxxxx@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=xxxxxxxxx@qq.com
set smtp-auth-password=#客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

命令行测试邮件是否可以正常发送:

[root@backup ~]# mail -s '测试结果' xxxxxxxxx@qq.com,xxxxxxxxx@qq.com < /backup/md5.txt

4.服务端仅保留6个月的备份数据,其余的全部删除180天前的删除
find /backup/ -mtime +180|xargs rm &>/dev/null

最终客户端脚本:

[root@web1 scripts]# cat backup.sh 
#定义变量
HOST=`hostname`
IP=`ifconfig eth0|awk 'NR==2{print $2}'`
TIME=`date +%F`
DIR=/backup/${HOST}_${IP}_$TIME

#客户端创建以主机名称+IP地址+时间命名
mkdir -p  $DIR

#2.客户端在本地打包备份放入上面创建好的目录下
cd /etc/
tar zcf $DIR/etc.tar.gz hosts passwd

#3.对打包后的文件做MD5校验值 存入md5.txt文件中
md5sum $DIR/etc.tar.gz > $DIR/md5.txt

#3.客户端最后将备份的数据进行推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $DIR  rsync_backup@172.16.1.41::backup

#4.查找7天前的文件并且删除
find /backup/ -mtime +7|xargs rm &>/dev/null

最终的服务端脚本:

[root@backup scripts]# cat backup.sh 
# 校验数据的完整性
TIME=`date +%F`
md5sum -c /backup/*$TIME/md5.txt > /backup/${TIME}.log

#2.将校验结果发送给管理员
mail -s "数据备份通知" 593528156@qq.com < /backup/${TIME}.log &>/dev/null

#3.服务器数据保留180天
find /backup/ -mtime +180|xargs rm &>/dev/null

服务端写入定时任务:

crontab -e
00 07 * * * sh /server/scripts/backup.sh

Rsync结合inotify

1.安装inotify

yum -y install inotify-tools

2.inotify参数说明

-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.脚本编写

[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  &
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值