第1章 数据实时备份应用与实践
1.1 企业数据备份方案
在网站集群架构中,数据永远是网站最重要的,一旦数据造成丢失,将会给企业造成巨大损失,因此,企业网站和应用需要有完善的数据备份方案确保数据安全。在企业中,数据备份方案有以下几种:
- 利用定时方式,实现周期备份重要数据信息。
需要周期性备份的数据可分为两类:一是程序员发布的程序代码以及运维人员对服务器等的配置变更文件,一般会使用定时任务执行脚本对该文件进行备份,然后配合rsync工具推送到远端服务器备份;二是对于数据库等的数据会用定时执行脚本的备份,然后再配合rsync工具推送到远端服务器备份。 - 利用实时复制方式,实现实时备份重要数据信息。
实时复制是企业数据备份最重要的方式,主要用于用户提交的数据的备份,对于用户提交到服务器上的普通文件(压缩包、视频、图片等),可采用inotify/sersync+rsync实时备份方式:对于数据文件还有较复杂的分布式存储工具自身可以实现将数据同时备份成多份,如FastDFS、GlusterFS等:对于提交到数据库中的数据,可使用数据库的主从复制(例如MySQL、Oracle)方式备份。
1.2 实时复制软件介绍
软件服务 | 依赖程序 | 部署难点 | 说明 |
---|---|---|---|
inotify-tools | rsync守护进程服务 | 复制脚本编写 | 监控目录数据变化,实时数据复制 |
sersync | rsync守护进程服务 | 配置文件编写 | 监控目录数据变化,实时数据复制 |
1.3 inotify+rsync实时复制实践
前提条件:backup服务端rsync守护进程部署好。
1.3.1 部署NFS客户端
1、设置密码认证文件:
[root@nfs01 ~]$ echo 'export RSYNC_PASSWORD=oldboy' >>/etc/bashrc <===采用密码环境变量的方式,配置永久生效
[root@nfs01 ~]$ source /etc/bashrc <===加载配置使其生效
[root@nfs01 ~]$ echo $RSYNC_PASSWORD <===检查密码环境变量,确保生效
oldboy
2、测试推送
[root@nfs01 ~]$ rsync -avz /data rsync_backup@172.16.1.41::backup/
sending incremental file list
sent 164 bytes received 25 bytes 126.00 bytes/sec
total size is 0 speedup is 0.00
1.3.2 查看inotify支持情况
[root@nfs01 ~]$ uname -r <===内核版本需在2.6.13以上
3.10.0-957.5.1.el7.x86_64
[root@nfs01 ~]$ ls -l /proc/sys/fs/inotify/ <===inotify所需的三个配置文件
总用量 0
-rw-r--r-- 1 root root 0 4月 19 09:45 max_queued_events
-rw-r--r-- 1 root root 0 4月 19 09:45 max_user_instances
-rw-r--r-- 1 root root 0 4月 19 09:45 max_user_watches
1.3.3 安装inotify-tools
[root@nfs01 ~]$ yum install epel-release -y <===安装epel源
[root@nfs01 ~]$ yum install inotify-tools -y <===安装inotify-tools包
[root@nfs01 ~]$ rpm -ql inotify-tools|head -2 <===查看包内容
/usr/bin/inotifywait
/usr/bin/inotifywatch
[root@nfs01 ~]$ rpm -qa inotify-tools <===查看版本号
inotify-tools-3.14-8.el7.x86_64
1.3.4 命令参数及事件说明
参数说明:
参数 | 说明 |
---|---|
-m|--monitor | 始终保持事件监听状态 |
-d|--daemon | 类似于-m参数,只是将命令运行在后台 |
-r | 递归监控目录数据信息变化 |
-q|--quite | 只打印事件信息 |
--excludei<pattern> | 排除文件或目录时,不区分大小写 |
--timefmt<fmt> | 指定时间输出的格式 |
--format<fmt | 打印使用指定的输出类似格式字符串;即实际监控输出的内容 |
-e | 指定监听指定的事件,如果省略,表示所有事件都进行监听。 |
事件说明:
事件名称 | 说明 |
---|---|
modify | 文件或目录内容被写入 |
attrib | 文件或目录属性改变 |
close_write | 文件或目录关闭,在写入模式打开之后关闭的。 |
moved_to | 文件或目录被移动到监控目录中 |
moved_from | 文件或目录从监控目录中被移动 |
create | 文件或目录创建在监控的目录中 |
delete | 文件或目录在监控的目录中被删除 |
delete_self | 文件或目录被删除 |
unmount | 文件系统包含的文件或目录不能卸载 |
1.3.5 测试实践
在NFS服务器上开启inotify相应监控功能
[root@nfs01 ~]$ inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /data <===监控/data目录创建事件显示信息
19/04/19 19:26 /data/a.txt <===目录随着下面的操作,文件实时出现
19/04/19 19:26 /data/b.txt
再开启一个NFS服务器连接窗口进行测试验证相应事件
[root@nfs01 ~]$ touch /data/a.txt
[root@nfs01 ~]$ touch /data/b.txt
说明:只监控create创建事件,其他事件并没有进行监控,其他事件产生,监控服务并没有信息输出。
1.3.6 编写脚本
1、创建放置脚本目录和共享目录,并测试推送
[root@nfs01 ~]$ mkdir –p /server/scripts /data
[root@nfs01 ~]$ rsync -az --delete /data/ rsync_backup@172.16.1.41::backup
2、编辑脚本文件,内容如下:
[root@nfs01 /server/scripts]$ cat monitor.sh
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
cd /data&&\
rsync -az --delete ./ rsync_backup@172.16.1.41::backup
done
或者
[root@nfs01 /server/scripts]$ cat monitor.sh
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
#删除事件发生
[ ! -e "$line" ] && cd /data &&\
rsync -az --delete ./ rsync_backup@172.16.1.41::backup && continue
#处理增改事件
rsync -az --delete $line rsync_backup@172.16.1.41::backup
done
3、后台运行脚本
[root@nfs01 /server/scripts]$ /bin/sh /server/scripts/monitor1.sh &
[2] 9199
1.3.7 sersync实践
1.3.7.1 客户端推送成功
[root@nfs01 ~]$ rsync -az /data rsync_backup@172.16.1.41::backup
1.3.7.2 部署sersync服务(NFS)
[root@nfs01 /server/tools]$ tar xf sersync_oldboy_64bit_20160928.tar.gz <===解压压缩包
[root@nfs01 /server/tools]$ mkdir /application -p <===创建/application目录
[root@nfs01 /server/tools]$ mv application/sersync /application/ <===将sersync里的文件移动到/application/里
[root@nfs01 /server/tools]$ tree /application/ <===查看/application/里的内容
/application/
└── sersync
├── bin
│ └── sersync
├── conf
│ ├── confxml.xml
│ └── confxml.xml.ori
├── logs
│ └── rsync_fail_log.sh
└── readme.txt
4 directories, 5 files
[root@nfs01 /server/tools]$ cd /application/sersync/conf/
[root@nfs01 /application/sersync/conf]$ ls
confxml.xml confxml.xml.ori
1.3.7.3 启动服务
[root@nfs01 /application/sersync/conf]$ ../bin/sersync -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
[root@nfs01 /application/sersync/conf]$ /application/sersync/bin/sersync -d <===启动sersync服务
关闭sersync进程的方法:
[root@nfs01 ~]$ pkill sersync