集群架构 - Rsync数据同步备份

1. Rsync基本概述

1.1 Rsync简介

Rsync是开源多功能同步工具,支持多种操作系统。

Rsync特点:

  • 支持本地复制(优于scp、cp)与远程同步
  • 支持全量备份、增量备份
  • 基于C/S架构,默认监听tcp 873端口

Rsync官网: https://rsync.samba.org/

1.2 Rsync优点

  1. 支持增量备份: 第一次全量备份,第二次增量备份,边复制、边比较、边统计,传输效率很高
  2. 数据集中备份: 客户端可以推送数据至服务端,也可以从服务端获取数据,以客户端为参照物
  3. 保持文件属性: 符号链接、硬链接、权限、时间等
  4. 安全方式传输: rsync本身不对数据加密,使用ssh作为传输端口
  5. 指定排除文件: 排除无需同步的文件或目录
  6. 进程方式同步: rsync运行在C/S架构,通过进程方式传输文件或数据

1.3 Rsync缺点

  1. 大量小文件同步会比较慢: 需要比对较长时间,有可能会造成Rsync进程停止

    解决思路: 将小文件进行打包,然后再同步,减少比对时间,传输效率更高

  2. 同步大文件会出现中断情况: 而且长时间同步会造成网络资源被耗尽

    解决思路: 配置限速同步,未同步完之前修改为隐藏文件,同步完成后修改为正常文件


2. Rsync命令详解

2.1 Rsync命令格式

1
2
3
4
5
6
# 守护进程方式
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

# SSH方式
rsync [OPTION...] SRC... [USER@]HOST:DEST

2.2 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 让目标目录和源目录数据保持一致

2.3 Rsync传输模式

Rsync大致使用三种主要的传输数据的方式:

传输模式 说明 特点
本地传输(local) 单个主机本地之间的数据传输 此时类似于cp命令
远程通道传输(remote shell) 通过ssh通道传输数据 类似scp命令
守护进程传输(daemon) rsync自身非常重要的功能 使用rsync协议

2.4 本地传输方式

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

1
2
3
4
5
6
# 同步hosts文件至tmp目录,相当于cp命令
[root@nfs01 ~]# rsync -avz /etc/hosts /tmp/

# 利用Rsync实现删除文件和目录的功能,相当于rm命令
[root@nfs01 ~]# mkdir /null
[root@nfs01 ~]# rsync -avz --delete /null/ /tmp/

2.5 远程通道传输方式

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

Push:推送本地数据至远端(上传)

1
2
# 推送本地数据至远端
[root@rsync-clientA ~]# rsync -avz -e 'ssh -p22' /etc/hosts root@192.168.56.11:/etc/hosts

Pull:拉取远端数据至本地(下载)

1
2
# 拉取远端数据至本地
[root@rsync-clientB ~]# rsync -avz -e 'ssh -p22' root@192.168.56.11:/etc/hosts /etc/hosts

2.6 守护进程传输方式

rsync自身非常重要的功能。

推送数据到备份服务器

1
2
# 将本地数据推送至backup服务器
rsync -avz /mnt/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

拉取备份服务器数据

1
2
# 将backup服务器数据拉至本地服务器
rsync -avz rsync_backup@172.16.56.11::backup/ /mnt/ --password-file=/etc/rsync.password

3. Rsync同步实践

3.1 Rsync服务端配置

步骤1: 安装rsync软件

1
2
3
4
5
6
# yum安装rsync
[root@backup ~]# yum -y install rsync

# 检查是否安装成功
[root@backup ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

步骤2: 配置rsyncd.conf

1
2
# 编辑rsync配置文件
[root@backup ~]# vim /etc/rsyncd.conf

完整配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
##rsyncd.conf start##
uid = rsync
gid = rsync
port = 873
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
address = 172.16.56.11
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password

#####################################
[backup]
path = /backup

配置文件详解:

参数 说明
uid = rsync 以rsync用户身份来传输数据
gid = rsync 以rsync用户组身份来传输数据
port = 873 监听端口默认为873
use chroot = no 程序出现问题就会开启,开启给个空目录就行
max connections = 2000 指定最大可连接的客户端数
timeout = 600 超时时间
pid file = /var/run/rsyncd.pid 进程pid存放
lock file = /var/run/rsync.lock 锁文件
log file = /var/log/rsyncd.log 日志文件
ignore errors 忽略错误
read only = false 可读写
list = false 不允许列出模块名
address = 172.16.56.11 监听内网服务端地址,同步安全优化操作
hosts allow = 172.16.56.0/24 允许那个地址段访问
hosts deny = 0.0.0.0/32 拒绝,一般不使用
auth users = rsync_backup 验证时的虚拟用户,与系统用户无关
secrets file = /etc/rsync.password 指定密码文件
[backup] 模块名称,自定义
path = /backup 指定该模块对应哪个目录

多模块配置示例:

1
2
3
4
5
[backup]
path = /backup

[data]
path = /data

步骤3: 建立虚拟用户并授权

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

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

步骤4: 创建密码文件

1
2
3
# 创建虚拟用户和密码,并赋予600权限
[root@backup ~]# echo "rsync_backup:xuliangwei" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password

密码文件格式: 用户名:密码

步骤5: 启动Rsync服务

1
2
3
4
5
6
7
8
# 启动命令
[root@backup ~]# rsync --daemon

# 检查进程
[root@backup ~]# ps aux | grep rsync

# 检查端口
[root@backup ~]# ss -lntup | grep 873

步骤6: 编写启动脚本

1
2
# 创建启动脚本
[root@backup ~]# vim /etc/init.d/rsyncd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
source /etc/init.d/functions

function start() {
rsync_pid_dir=/var/run/rsyncd.pid
if [ ! -f /var/run/rsyncd.pid ];then
/usr/bin/rsync --daemon
action "rsync is daemon" /bin/true
else
action "rsync is start" /bin/false
exit 1
fi
}

function stop (){
kill_pid=$(ps aux|grep rsync|grep -v grep|awk '{print $2}')
proce_pid=$(ps aux|grep rsync|grep -v grep|wc -l)
if [ "$proce_pid" -eq 0 ];then
action "rsync is no start" /bin/false
else
/bin/kill -9 $kill_pid &>/dev/null
rm -f /var/run/rsyncd.pid &>/dev/null
action "rsync is off" /bin/true
fi
}

case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "USAGE: start|stop|restart"
esac
1
2
3
4
5
# 设置执行权限
chmod +x /etc/init.d/rsyncd

# 加入Rsync开机启动
[root@backup ~]# echo "rsync --daemon" >> /etc/rc.local

注意: 启动后需要检查对应进程和端口。

3.2 Rsync客户端配置

步骤1: 安装rsync

1
2
# 安装rsync
[root@nfs01 ~]# yum install rsync -y

步骤2: 配置密码文件

1
2
3
4
# 创建虚拟用户对应密码,并赋予600安全权限
# 注意:只需要密码,并且和服务端的密码一致
[root@nfs01 ~]# echo "xuliangwei" > /etc/rsync.password
[root@nfs01 ~]# chmod 600 /etc/rsync.password

步骤3: 推送数据给rsync服务端

1
2
# 推送数据给rsync服务端
[root@nfs01 ~]# rsync -avz /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

步骤4: 拉取rsync服务端数据至本地

1
2
# 拉取rsync服务端数据至本地
[root@nfs01 ~]# rsync -avz rsync_backup@172.16.56.11::backup/ /backup/ --password-file=/etc/rsync.password

3.3 无差异备份数据

拉取远端数据

远端与本地保持一致,远端没有本地有会被删除,造成客户端数据丢失。

1
2
# 拉取远端数据:远端与本地保持一致
[root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.56.12::backup/ /data/ --password-file=/etc/rsync.password

推送数据至远端

本地与远端保持一致,本地没有远端会被删除,造成服务器端数据丢失。

1
2
# 推送数据至远端:本地与远端保持一致
[root@nfs01 ~]# rsync -avz --delete /data/ rsync_backup@172.16.56.12::backup/ --password-file=/etc/rsync.password

警告: 使用--delete参数要谨慎,确保数据安全。

3.4 定时备份数据

Rsync配合crond定时推送数据。

1
2
# 创建定时备份脚本
[root@nfs-server scripts]# vim rsync_crond_backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
### Client
Client_BackupDIR=/backup-A
Client_Host=$(hostname)
Client_IP=$(/sbin/ifconfig eth1|awk 'NR==2'|awk '{print $2}'|awk -F ':' '{print $2}')
Client_Date=$(date +%F)
Client_Date_file=$(date +%H_%M)
Client_Desc_DIR="$Client_BackupDIR"/"$Client_Host"_"$Client_IP"_"$Client_Date"

###Server
Server_User=rsync_backup
Server_IP=172.16.56.11
Server_mode=backup/
Server_pass=/etc/rsync.password

###command
mkdir -p $Client_Desc_DIR
/bin/cp /var/spool/cron/root $Client_Desc_DIR/cron_root_$Client_Date_file
/bin/cp /etc/fstab $Client_Desc_DIR/etc_fstab_$Client_Date_file
/bin/cp /etc/rc.d/rc.local $Client_Desc_DIR/etc_rc.local_$Client_Date_file

##rsync
rsync -avz $Client_BackupDIR/ $Server_User@$Server_IP::$Server_mode/ --password-file=$Server_pass
1
2
3
4
5
6
7
# 设置执行权限
chmod +x rsync_crond_backup.sh

# 添加到计划任务
crontab -e
# 每天凌晨2点执行
0 2 * * * /path/to/rsync_crond_backup.sh

3.5 排除文件备份数据

排除单个文件

1
rsync -avz --exclude=a /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

排除多个文件

1
2
3
4
5
6
7
8
# 方法1: 使用大括号
rsync -avz --exclude={a,b} /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

# 方法2: 多个--exclude参数
rsync -avz --exclude=a --exclude=b /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

# 方法3: 使用范围
rsync -avz --exclude={a..g} /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

使用排除文件列表

1
2
3
4
5
6
7
8
9
10
# 创建排除文件列表
cat > /etc/rsync_exclude.txt <<EOF
*.log
*.tmp
cache/
temp/
EOF

# 使用排除文件
rsync -avz --exclude-from=/etc/rsync_exclude.txt /backup/ rsync_backup@172.16.56.12::backup --password-file=/etc/rsync.password

4. Rsync故障处理

4.1 Rsync服务端排错思路

  1. 关闭防火墙以及selinux
  2. 确认配置文件 /etc/rsyncd.conf
  3. 配置允许网段以及对应的模块
  4. 创建对应的备份目录,并设定rsync用户权限
  5. 启动rsync服务以后台运行,检查进程和端口tcp/873
  6. 建立虚拟账户和密码,权限600

4.2 Rsync客户端排错思路

  1. 网络是否能通,telnet端口是否正常
  2. 配置文件密码是否正确,权限设定600,注意:只需要密码,并且和服务端的密码一致
  3. 推送和拉取数据时,模块前加双冒号

4.3 常见错误及解决方法

错误1: Connection refused

1
2
3
4
5
6
# 检查rsync服务是否启动
ps aux | grep rsync
ss -lntup | grep 873

# 检查防火墙
firewall-cmd --list-all

错误2: auth failed

1
2
3
4
5
6
# 检查密码文件权限
ls -l /etc/rsync.password
chmod 600 /etc/rsync.password

# 检查密码是否正确
cat /etc/rsync.password

错误3: Unknown module

1
2
3
4
5
# 检查模块名称是否正确
rsync rsync_backup@172.16.56.11::

# 检查服务端配置
cat /etc/rsyncd.conf | grep "^\["

5. Rsync+Inotify实践

5.1 Inotify概述

Rsync实现对远程服务器数据的增量备份,但Rsync自身也有瓶颈,rsync同步数据时采用核心算法对远程服务器的目标文件进行比对,只同步差异文件。如果服务器的文件数量达到百万或千万级别,文件对比将会非常消耗时间,而且往往只是其中很少一部分数据发生变化,这样同步就显得非常低效,Inotify的出现,刚好可以缓解Rsync的不足。

Inotify简介:

  • Inotify是异步的文件系统事件监控机制
  • Linux从2.6.13内核起,加入了Inotify的支持
  • Inotify可以监控文件系统中添加、删除、修改、移动等事件
  • 利用这个内核接口,第三方软件就可以监控文件系统中发生变化的文件
  • inotify-tools正是实施这样监控的软件
  • (国人周洋在金山公司开发sersync)

Inotify特点:

  • Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件
  • crond机制无法做到实时性,同时也消耗大量系统资源
  • 相比之下,inotify基于事件驱动,可以做到对事件实时处理及响应,也没有轮询造成的系统资源消耗

特别说明: 下面的inotify配置是建立在rsync服务基础上的配置过程。

5.2 环境准备

Rsync配置参考Rsync实战,通过客户端验证rsync推送数据,然后配置inotify服务。

1
2
# 验证客户端与服务端正常同步
rsync -avz /backup rsync_backup@172.16.56.12::backup/ --password-file=/etc/rsync.password

5.3 客户端配置Inotify

步骤1: 安装inotify

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看当前系统是否支持inotify
[root@lamp1 ~]# uname -r
2.6.32-504.el6.x86_64

[root@lamp1 ~]# ls -l /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_queued_events
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_user_instances
-rw-r--r-- 1 root root 0 Aug 27 07:23 max_user_watches

# 配置epel源,安装inotify
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

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

步骤2: 配置并优化inotify

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 修改inotify内核参数(inotify默认内核参数值太小)
# 默认值:
# fs.inotify.max_queued_events = 16384
# fs.inotify.max_user_watches = 8192
# fs.inotify.max_user_instances = 128

# 修改参数为:
cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
EOF

# 使配置生效
sysctl -p

参数说明:

  • max_queued_events: inotify队列最大长度,如果值太小,会出现”** Event Queue Overflow **”错误,导致监控文件不准确
  • max_user_watches: 要同步的文件包含多少目录,可以用find /home/xuliangwei.com -type d | wc -l统计,必须保证max_user_watches值大于统计结果(这里/home/xuliangwei.com为同步文件目录)
  • max_user_instances: 每个用户创建inotify实例最大值

注意: inotify在实际生产环境中,对于50-200KB的文件,inotify的最发并发量为200-300,如果客户端写入速度大于这个量,将会造成短暂的延迟。

步骤3: Inotify工具集介绍

1
2
3
4
# 查看inotify工具
[root@xuliangwei ~]# rpm -ql inotify-tools
/usr/bin/inotifywait //监控文件或目录的变化
/usr/bin/inotifywatch //统计文件系统访问次数

inotifywait命令常用参数:

参数 说明
-m 持续监视变化
-r 递归形式监视目录
-q 打印需要的信息
-e 指定监视事件
--timefmt 自定义时间格式,常用参数’%y/%m/%d %H:%M’
--format 自定义输出格式信息

常用格式符:

  • %e: 使用了什么事件
  • %T: 时间
  • %w: 显示被监控文件的文件名
  • %f: 如果发生某事件的对象是目录,则显示被监控

监听事件列表:

事件 说明
open 打开,文件或目录被打开
access 访问,读取文件
modify 修改,文件内容被修改
attrib 属性,文件元数据被修改
create 创建,创建文件或目录
close 关闭,对文件进行关闭操作
delete 删除,文件或目录被删除
move 移动,对文件进行移动操作
moved_to 移动,文件或目录移动到当前目录
moved_from 移动,文件或目录从当前目录移动至其他目录

步骤4: 使用inotify实时监控文件或目录变化

1
2
# 监听文件变化
inotifywait -mrq --format '%e %T %w%f' --timefmt '%y/%m/%d %H:%M' -e close_write,modify,delete,create,attrib,move /backup/

步骤5: 建立inotify实时同步脚本

1
2
# 实时触发inotify进行同步(sh inotify.sh &  //后台执行)
[root@lamp1 ~]# vim /soft/scripts/inotify.sh
1
2
3
4
5
6
7
8
#!/bin/bash
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e create,close_wait,delete /backup\
|while read line
do
[ ! -e "$line" ]&& continue
rsync -az --delete $line rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password
done

优化版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 定义变量
SRC_DIR="/backup"
DEST_USER="rsync_backup"
DEST_HOST="172.16.56.11"
DEST_MODULE="backup"
PASS_FILE="/etc/rsync.password"

# 监控目录变化并同步
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete,moved_to,moved_from ${SRC_DIR} | while read line
do
# 如果文件不存在则跳过
[ ! -e "$line" ] && continue

# 同步文件或目录
if [ -d "$line" ]; then
rsync -az --delete "$line" ${DEST_USER}@${DEST_HOST}::${DEST_MODULE}/ --password-file=${PASS_FILE}
else
rsync -az "$line" ${DEST_USER}@${DEST_HOST}::${DEST_MODULE}/ --password-file=${PASS_FILE}
fi
done
1
2
3
4
5
# 设置执行权限
chmod +x /soft/scripts/inotify.sh

# 后台运行
nohup /soft/scripts/inotify.sh > /var/log/inotify.log 2>&1 &

步骤6: 配置inotify开机自动运行

1
2
3
4
5
6
# 配置inotify开机自动运行
[root@lamp1 ~]# echo "/bin/sh /soft/scripts/inotify.sh &" >> /etc/rc.d/rc.local

# 验证配置
[root@lamp1 ~]# tail -1 /etc/rc.d/rc.local
/bin/sh /server/scripts/inotify.sh

5.4 源码安装inotify(可选)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载源码
[root@lamp1 tools]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

# 解压
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14

# 编译安装
[root@lamp1 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.1.4
[root@lamp1 inotify-tools-3.14]# make && make install

# 创建软链接
[root@lamp1 ~]# ln -s /usr/local/inotify-tools-3.1.4/ /usr/local/inotify-tools

6. Rsync数据备份案例

6.1 项目需求

已知3台服务器主机名分别为web01、backup、nfs,主机信息见下表。

要求:
每天晚上01点整在Web服务器上打包备份系统配置文件、日志文件、其他目录,并通过rsync命令推送备份服务器backup上备份保留。

备份思路: 所有服务器在本地按日期打包,然后再推到备份服务器backup上。

6.2 具体要求

  1. 所有服务器的备份目录必须都为/backup
  2. 备份的系统配置文件包括但不限于:
    • 配置文件:/etc/rc.local/etc/fstab/etc/hosts
    • 重要目录:/var/spool/cron//etc/firewalld/soft/scripts
    • 系统日志文件:/var/log/
    • 应用程序日志:/soft/log/nginx/soft/log/mysql/soft/log/php/soft/log/tomcat
  3. Web服务器本地保留最近7天的数据,避免浪费磁盘空间
  4. Rsync备份服务器上,其它要保留6个月的数据副本
  5. 客户端服务器推送数据,以主机名IP地址当前时间作为目录,所有的备份数据存放至该目录下 nfs-server_192.168.69.112_2018-03-28/
  6. 确保备份的数据完整,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中
  7. 真实工作中除了服务器之间备份,可能还会需要异地备份,这个地方请大家思考如何异地备份

6.3 搭建rsync服务端

创建rsync服务端脚本

1
2
3
# backup服务器创建rsync服务端
mkdir -p /soft/scripts
vim /soft/scripts/create-rsync-server.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
useradd rsync
mkdir -p /backup
chown rsync.rsync /backup

cat >> /etc/rsyncd.conf <<EOF
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password

[backup]
path = /backup
EOF

cat >> /etc/rsync.password <<EOF
rsync_backup:xuliangwei
EOF

chmod 600 /etc/rsync.password

####rsync server start###
rsync --daemon
echo "rsync --daemon" >> /etc/rc.local
1
2
3
4
5
# 设置执行权限
chmod +x /soft/scripts/create-rsync-server.sh

# 执行脚本
/soft/scripts/create-rsync-server.sh

客户端配置

1
2
3
4
5
6
# 客户端配置密码文件
cat >> /etc/rsync.password <<EOF
xuliangwei
EOF

chmod 600 /etc/rsync.password

6.4 客户端备份脚本

1
2
# 创建客户端备份脚本
vim /soft/scripts/backup_client.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
Hostname=$(hostname)
if [ $(date +%w) -eq 0 ]
then
Date="week$(date +%F-%w -d "-1day")"
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir -p $Path/${Hostname}_${IP}_${Date}
cd / &&\
/bin/tar czf $Path/${Hostname}_${IP}_${Date}/backup_${Date}.tar.gz \
var/spool/cron/root \
etc/rc.local \
etc/sysconfig/iptables \
var/www/html \
app/logs \
etc/fstab \
etc/hosts \
etc/firewalld \
soft/scripts \
var/log \
soft/log/nginx \
soft/log/mysql \
soft/log/php \
soft/log/tomcat &&\
md5sum $Path/${Hostname}_${IP}_${Date}/backup_${Date}.tar.gz > $Path/${Hostname}_${IP}_${Date}/flag_${Date} &&\
rsync -az /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password &&\
# 删除本地7天前的备份
find $Path/ -type f -mtime +7 \( -name "*.log" -o -name "*.tar.gz" \) | xargs rm -f
1
2
3
4
5
6
7
# 设置执行权限
chmod +x /soft/scripts/backup_client.sh

# 配置定时任务
crontab -e
# 每天凌晨1点执行
0 1 * * * /soft/scripts/backup_client.sh

6.5 服务端备份验证脚本

1
2
# 创建服务端验证脚本
vim /soft/scripts/backup_server_check.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
if [ $(date +%w) -eq 0 ]
then
Date="week$(date +%F-%w -d "-1day")"
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir -p $Path/${IP}
LANG=en
find /backup/ -type f -name "*${Date}*.log" | xargs md5sum -c >> $Path/${Date}_result.log 2>&1 &&\
mail -s "$Date bak result" xxx@163.com < $Path/${Date}_result.log
find $Path/ -type f -mtime +180 ! -name "*_week*_6*" | xargs rm -f

优化版本check.sh:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 查找当天的flag文件并验证MD5
find /backup -type f -name "flag_$(date +%F)" | xargs md5sum -c | grep FAILED &> /tmp/mail_body_$(date +%F).txt

# 发送邮件
if [ -s /tmp/mail_body_$(date +%F).txt ]; then
mail -s "$(date +%U%T) back" 552408925@qq.com < /tmp/mail_body_$(date +%F).txt
else
echo "All backup files are OK" | mail -s "$(date +%U%T) back success" 552408925@qq.com
fi

6.6 配置邮箱

1
2
# 配置邮件发送
[root@backup /]# vim /etc/mail.rc
1
2
3
4
5
6
7
8
# 在末行加入如下命令
set from=552408925@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=552408925@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

注意: QQ邮箱需要使用授权码,不是登录密码。

6.7 备份思考

思考1: 要备份什么?

WEB APP部署程序配置文件:

  • /usr/local/nginx/soft/webapp/nginx
  • /opt/mysql/soft/webapp/mysql
  • /etc/php/soft/webapp/php

MYSQL数据库部署程序及其配置文件:

  • /data/mysql/mysql3306/{data,logs,conf,tmp}
  • /data/mysql/mysql3307/{data,logs,conf,tmp}

MySQL数据文件:

  • 数据库数据文件
  • 配置文件

MySQL的binlog日志、慢查询日志、错误日志

系统的安全日志、内核的日志、sudo日志、rsyslog日志

应用程序日志:

  • access.log
  • error.log

静态数据文件

思考2: 如何备份?

根据时间维护划分:

  • 实时备份(同步备份)
  • 非实时备份(异步备份)

根据地域划分:

  • 同IDC备份部署
  • 跨IDC备份部署
    • 本地->云主机->异地主机

思考3: 备份可恢复性?

  • 时间成本: 恢复需要多长时间
  • 维护成本: 维护备份系统的成本

思考4: 备份策略

备份保留时间: 1个月、1年或永久?

备份恢复校验:

  • 1个月模拟一次,半年演练一次?
  • 这里牵扯到备份有效性和备份时效性的一个校验

万一备份服务器挂了怎么办?

  • 备份之后是否还有备份
  • 异地备份的重要性

7. Rsync高级应用

7.1 限速传输

1
2
# 限速100KB/s
rsync -avz --bwlimit=100 /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

7.2 断点续传

1
2
# 支持断点续传
rsync -avz --partial /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

7.3 显示进度

1
2
# 显示传输进度
rsync -avzP /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

7.4 同步时排除多个模式

1
2
# 排除多个文件模式
rsync -avz --exclude='*.log' --exclude='*.tmp' --exclude='cache/' /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

8. Rsync性能优化

8.1 网络优化

1
2
3
4
5
# 使用压缩传输
rsync -avz /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

# 调整块大小
rsync -avz --block-size=2048 /backup/ rsync_backup@172.16.56.11::backup/ --password-file=/etc/rsync.password

8.2 服务端优化

1
2
3
4
5
# 调整服务端配置
vim /etc/rsyncd.conf

max connections = 2000
timeout = 600

8.3 客户端优化

1
2
# 使用SSH压缩
rsync -avz -e 'ssh -C' /backup/ user@host:/backup/

实战优化