Rsync备份服务实战

Rsync基本概述

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

  • Rsync官方地址:[TP](rsync (samba.org))

  • Rsync监听端口:873

  • Rsync运行模式:C/S Client/Server

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

Rsync的特性

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

生产场景架构集群备份方案

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

备份类型介绍

  • 完全备份

全量备份,将客户端所有的数据内容file1、file2、file3全部备份至服务端(效率低下,占用空间)

  • 增量备份

增量备份,将客户端的file2、file3增量备份至服务端(提高备份效率,节省空间,适合异地备份)

Rsync的应用场景

Rsync的数据同步模式

  • 1、推送:所有主机推送本地数据至rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)

  • 2、拉取:rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大!

  • 3、大量服务器备份场景

  • 4、异地备份实现思路

远程传输方式

常用端口

协议 端口
rsync 873
http 80
https 443
ssh 22
telnet 23
rdp 3389
ftp 21
mariadb 3306
dns 53

SCP基于SSH协议远程复制文件

### 将本地文件复制到指定的远程主机的指定目录
scp 源文件路径 用户名@IP:目标路径
[root@localhost ~]# scp file1.txt root@172.16.1.31:/tmp/file2.txt
### 将指定远程主机中的某个文件复制到本地指定目录中
scp 用户名@IP:目标路径/源文件 本地路径
[root@localhost ~]# scp root@172.16.1.31:/tmp/file1.txt /tmp
### 常用参数
-r 递归复制
-p 保留文件的修改时间,访问时间和权限模式

Rsync远程数据同步工具

三种主要的数据传输方式

  • 本地方式
  • 远程方式
  • 守护进程
### 常用参数
a 归档模式传输 a=rtpoglD
-----------------------------
r 递归传输
t 保持文件时间属性
p 保持文件权限
o 保持文件的属主信息
g 保持文件属组信息
l 保留软链接
D 保持设备文件信息
-----------------------------
v 详细信息输出,打印速度,文件数量
z 过程中打包压缩,速度块
e 使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN    指定排除不需要传输的文件模式
--exclude-from=file  文件名所在的目录文件
--bwlimit=100        限速传输
--partial            断点续传
--delete             让目标目录和源目录数据保持一致
--password-file=xxx  使用密码文件
--port               指定端口号
本地传输方式
### 单个主机本地之间的数据传输
### 本地数据拷贝命令
rsync    [OPTION...] SRC...      [DEST]
备份命令  参数         本地源文件    本地目标文件
[root@localhost ~]# rsync -avz /etc/passwd /tmp/
远程传输方式
### 通过ssh通道传输数据,类似于scp命令
### push推送数据命令
rsync    [OPTION...] SRC...    [USER@]           HOST:           DEST
备份命令  参数         本地源文件  目标主机的系统用户   目标主机IP或域名  目标路径
[root@localhost ~]# rsync -avz ./* root@172.16.1.7:/opt
### pull拉取数据命令
rsync    [OPTION...] [USER@]            HOST:          SRC...         [DEST]
备份命令  参数         目标主机的系统用户    目标主机IP或域名 目标主机源文件    本地路径
[root@localhost ~]# rsync -avz root@172.16.1.7:/opt/file1.txt  /opt/

Rsync借助SSH协议同步数据存在的缺陷

  • 使用系统用户(不安全)
  • 使用普通用户(会导致权限不足情况)
守护进程传输方式
### push推送数据命令
rsync   [OPTION...] SRC...      [USER@]      HOST::      DEST
备份命令  参数        远程主机模块  远程主机用户   远程主机地址  将本地文件备份至远程主机
[root@localhost ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup
### pull拉取数据命令
rsync   [OPTION...] [USER@]      HOST::    SRC...       [DEST]
备份命令 参数         远程主机用户   远程主机IP 远程主机模块    将远程主机数据备份至本地路径
[root@localhost ~]# rsync -avz rsync_backup@172.16.1.41::backup/file1.txt  /tmp/
环境准备
外网IP 内网IP 主机 角色
10.0.0.31 172.16.1.31 nfs rsync客户端
10.0.0.41 172.16.1.41 backup rsync服务端
配置backup服务端
### 安装rsync
[root@backup ~]# yum -y install rsync
### 编辑配置文件
[root@backup ~]# 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                               # 服务启动的端口号873(0~65535)
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服务用户链接认证密码和文件路径
log file = /var/log/rsyncd.log           # rsync日志路径
#####################################
[backup]                                 # 定义模块信息
comment = welcome to oldboyedu backup!   # 模块注释信息
path = /backup                           # 定义接收备份数据目录
##### 注意:#会出现因注释不兼容的问题而导致推数据时出现报错,配置文件需取消注释或者注释进行换行处理!!!

### 创建用户
# 创建rsync用户,指定登录shell同时不创建家目录
[root@backup ~]# useradd rsync -s /sbin/nologin -M
### 创建备份目录
[root@backup ~]# mkdir /backup
### 授权备份目录的属主和属组为服务的启动用户
[root@backup ~]# chown -R rsync.rsync /backup
### 创建密码文件
[root@backup ~]# echo 'rsync_backup:123' > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
rsync_backup:123
### 授权rsync的密码文件权限为600
[root@backup ~]# chmod 600 /etc/rsync.passwd
### 启动服务
[root@backup ~]# systemctl start rsyncd
### 加入开机自启
[root@backup ~]# systemctl enable rsyncd
### 检查进程
[root@backup ~]# ps -ef | grep rsync
root       6125      1  0 16:43 ?     00:00:00 /usr/bin/rsync --daemon --no-detach
root       7211   6962  0 16:47 pts/0 00:00:00 grep --color=auto rsync
[root@backup ~]# netstat -lnupt | grep 873
tcp        0      0 0.0.0.0:873      0.0.0.0:*       LISTEN      6125/rsync       
配置nfs客户端
### 安装rsync
[root@nfs ~]# yum -y install rsync
### 创建密码文件
[root@nfs ~]# echo '123' > /etc/rsyncd.pass
[root@nfs ~]# cat /etc/rsyncd.pass
123
### 授权rsync的密码文件权限为600
[root@nfs ~]# chmod 600 /etc/rsyncd.pass
守护进程模式的推送和拉取
### push推送数据命令
[root@nfs ~]# rsync -avz --password-file=/etc/rsyncd.pass ./* rsync_backup@172.16.1.41::backup
# 或者 将环境变量 RSYNC_PASSWORD 的值设置为 123。在使用rsync命令与rsync服务器进行同步时,可以使用该环境变量作为密码参数,以免在命令行中明文传输密码。
[root@nfs ~]# export RSYNC_PASSWORD=123
[root@nfs ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup
	### 以上两种方法都可以不需要输入密码
# 当端口号不是873时,--port指定其他端口号
[root@nfs ~]# rsync -avz --port 端口 ./* rsync_backup@172.16.1.41::backup
### pull拉取数据命令
[root@nfs ~]# rsync -avz --password-file=/etc/rsyncd.pass  rsync_backup@172.16.1.41::backup/file1.txt /tmp/
# 或者 将环境变量 RSYNC_PASSWORD 的值设置为 123。在使用rsync命令与rsync服务器进行同步时,可以使用该环境变量作为密码参数,以免在命令行中明文传输密码。
[root@nfs ~]# export RSYNC_PASSWORD=123
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup/file1.txt /tmp/
	### 以上两种方法都可以不需要输入密码
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup/file1.txt /tmp/

Rsync的Limit限速

### 企业案例: 某DBA使用rsync拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应
# 将环境变量 RSYNC_PASSWORD 的值设置为 123。在使用rsync命令与rsync服务器进行同步时,可以使用该环境变量作为密码参数,以免在命令行中明文传输密码。
[root@nfs01 ~]# export RSYNC_PASSWORD=123
[root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/

Rsync备份案例

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

主机名 外网IP 内网IP 角色
Web01 10.0.0.7 172.16.1.7 Nfs客户端
NFS 10.0.0.31 172.16.1.31 Nfs服务端、Rsync客户端
Backup 10.0.0.41 172.16.1.41 Rsync服务端

客户端需求

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

配置nfs服务器

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

### 客户端每天凌晨01点定时执行一次脚本(打包->标记->推送->保留最近7天的文件)
[root@nfs ~]# vim /server/scripts/client_rsync_backup.sh 
#!/usr/bin/bash
# 定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Host=$(hostname)
Addr=$(ifconfig eth1|awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}
Path=/backup
# 创建备份目录
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
# 备份对应的文件
cd / && \
[ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \
[ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz  var/log/messages var/log/secure && \
# 携带md5验证信息
[ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date
# 推送本地数据至备份服务器
export RSYNC_PASSWORD=zls
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
# 本地保留最近7天的数据
find $Path/ -type d -mtime +7|xargs rm -rf

### 客户端编写定时任务,让备份每天凌晨1点执行
[root@nfs ~]# crontab -l
00 01 * * * /bin/bash /server/scripts/backup_rsync.sh &>/dev/null

配置backup服务器

### 服务端校验客户端推送数据的完整性, (校验->存储校验结果->将保存的结果通过邮件发送给管理员->保留最近180天的数据)
### 服务端配置邮件功能
[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-auth-password=#客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
### 服务端校验、以及邮件通知脚本
[root@backup ~]# mkdir /server/scripts -p
[root@backup ~]# vim /server/scripts/check_backup.sh
#!/usr/bin/bash
# 定义全局的变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 定义局部变量
Path=/backup
Date=$(date +%F)
# 查看flag文件,并对该文件进行校验, 然后将校验的结果保存至result_时间
find $Path/ -type f -name "flag_$Date"|xargs md5sum -c >$Path/result_${Date}
# 将校验的结果发送邮件给管理员
mail -s "Rsync Backup $Date" 123@qq.com <$Path/result_${Date}
# 删除超过7天的校验结果文件, 删除超过180天的备份数据文件
find $Path/ -type f -name "result*" -mtime +7|xargs rm -f
find $Path/ -type d -mtime +180|xargs rm -rf

### 服务端编写定时任务脚本
[root@backup backup]# crontab -l
00 05 * * * /bin/bash /server/scripts/check_backup.sh &>/dev/null

扩展多台服务器的备份

[root@nfs ~]# rsync -avz /server 172.16.1.7:/

Rsync结合inotify[扩展]

### 安装inotify
[root@backup ~]# yum -y install inotify-tools
### inotify参数说明
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载

### 命令测试
/usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /backup
### 脚本编写
[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  &
posted @ 2023-05-12 09:13  KKKDexter  阅读(95)  评论(0)    收藏  举报