dinghailong128

企业级实时复制备份应用实践

4.1 实时复制服务介绍

4.1.1 企业数据备份方案介绍

  在网站集群架构中,数据永远是网站最重要的,一旦数据造成丢失,将会给企业造成巨大损失,因此,企业网站和应用需要有完善的数据备份方案确保数据安全。在真实企业中,数据备份方案通常有以下几种情况:

  利用定时方式,实现周期备份重要数据信息。

  需要周期性备份的数据可分为两类:一是程序员发布的程序代码以及运维人员对服务器等的配置变更文件,一般会使用定时任务执行脚本对该类文件进行备份,然后再配合 rsync 工具推送到远端服务器备份;二是对于数据库等的数据会用定时执行脚本(通过数据库自带(或第三方)的备份工具定时备份成文件)备份,然后再配合 rsync 工具推送到远端服务器备份,下图4-1为普通数据文件周期性数据备份示意图。

 

  利用实时复制方式,实现实时备份重要数据信息。

  实时复制是企业数据备份最重要的方式,主要用于用户提交的数据的备份,对应用户提交到服务器上的普通文件(图片、压缩包、视频、文档等),可采用 inotify/sersync+rsync 实时备份方式;对于数据文件还有较复杂的分布式存储工具自身可以实现将数据同时备份成多份,例如:FastDFS、GlusterFS 等;对于提交到数据库中的数据,可使用数据库的主从复制(例如:MySOL、Oracle)方式备份,这是软件自带的实时复制备份方式。有的企业会采用更多思路实现数据同时变为多份,例如:程序业务逻辑在数据提交时,同时提交到两个服务器。下图4-2为普通数据文件实时数据备份示意图。

  提示信息:由于前面课程已经进行了集群架构规划,因此还是以原有的规划为主进行部署,以nfs 作为实时复制服务器源,rsync 备份服务器作为实时复制备份目的服务器。

4.1.2 实时复制细节实现说明

  实时复制软件会监控磁盘文件系统的变化,比如:指定一个/data 目录,实时复制软件服务进程会实时监控这个/data 目录中数据的变化,即文件系统 block 与 inode 信息的变化。

  一旦/data 目录文件发生变化,就会执行 rsync 命令,将变化的数据信息推送到备份服务器相应的备份目录中,从而完成数据的实际备份。

  提示:根据实时复制原理描述,可发现 rsync 备份服务器是需要先行搭建的;搭建完成 rsync 备份服务器后,在进行实时复制软件服务的部署。

4.1.3 实时复制软件介绍

  随着互联网技术的不断发展,数据复制软件服务也层出不穷,目前企业中较为常用的实时复制软件有如下两种列表显示:

 

4.2 实时复制 inotify 机制介绍

4.2.1 inotify 机制简介

  Inotify 是一种异步文件系统事件监控机制,Linux 内核从 2.6.13 起,加入了 Inotify 支持,通过 Inotify 可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。实际上 inotify-tools 是一个监控指定目录数据实时变化的软件程序。

  Inotify 程序原理是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,可以做到对事件处理的实时响应。

  inotify 的实现有几款软件:inotify-tools、sersync。

  提示:sersync 软件在 inotify 基础上进行开发的,功能要更加强大些,支持配置文件配置,多了定时重试复制机制,过滤机制,提供接口做 CDN 数据更新,支持多线程操作。

  inotify 机制优点

  监控文件文件系统事件变化,通过复制工具实现实时数据复制。

  支持多线程实时复制。

  inotify 机制缺点

  实测并发如果大于 200 个文件(10-100k),复制会有延迟。

4.2.2 inotify+rsync 实时复制项目实践

  不管是 inotify-tools 还是 sersync,本身的核心功能都只是,监控指定目录内的数据变化,具体的复制到远端服务器的功能,还是需要 Rsync 工具配合的,这些软件几乎都是在 inotify 机制接口之上的软件封装,软件具体工作机制流程为:

  备份源客户端开启运行 inotify 软件服务进程,监测指定目录的文件系统变化。

  一旦获取到指定监控目录的数据发生变化,即执行 rsync 命令复制数据。

  将变化的数据发送到 rsync 服务端(也可执行 scp,rsync 远程 Shell 模式)的备份目录中。

  特别说明:下面的 inotify 配置是建立在 rsync 服务搭建完成确认无误基础上的配置过程。

4.2.3 项目部署实施

4.2.3.1 部署环境准备

  1.确保远程数据传输服务部署完成

  大前提是 rsync daemon 服务配置成功,可以在 nfs01 上推送拉取数据到 backup 备份服务器,然后才能配置 inotify-tools 工具服务,有关 rsync 服务的部署请参考 2.3.2 Rsync 服务端(backup)部署章节,此处不再累述。

  nfs01 服务器作为 Rsync 服务的客户端需要做如下部署:

[root@nfs01 ~]# echo \'export RSYNC_PASSWORD=oldboy\' >>/etc/bashrc  #<==本章采用密码环境变量的方式,配置永久生效。
[root@nfs01 ~]# source /etc/bashrc                                 #<==加载配置使其生效。
[root@nfs01 ~]# echo $RSYNC_PASSWORD                               #<==检查密码环境变量,确保生效。
oldboy
[root@nfs01 ~]# tail -1 /etc/bashrc                                #<==查看配置是否正确。
export RSYNC_PASSWORD=oldboy

  作为 Rsync 服务的客户端 nfs01 服务器配置好后,测试推送和拉取数据信息,下面是检查过程。

[root@nfs01 ~]# rsync -avz /data rsync_backup@172.16.1.41::backup/#<==执行推送数据,/data为nfs01的共享目录。
sending incremental file list#<==出现以下几行提示表示,从nfs01到backup服务器的rsync服务环境是正常的。

sent 178 bytes  received 25 bytes  135.33 bytes/sec
total size is 0  speedup is 0.00

  2. 检查 Linux 系统支持 inotify 实时监控

  根据官方说明,只有内核从2.6.13 起,才支持inotify 功能,因此需要在部署实时复制服务之前,查看系统版本以及具体的查看是否支持。

  通过检查/proc/sys/fs/inotify 中是否存在以下三个文件,可以确认系统是否支持实时监控程序。

[root@nfs01 ~]# uname -r
3.10.0-1062.12.1.el7.x86_64             #<==内核是3.10,支持 inotify 机制。 
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 2月 29 12:51 max_queued_events
-rw-r--r-- 1 root root 0 2月 29 12:51 max_user_instances
-rw-r--r-- 1 root root 0 2月 29 12:51 max_user_watches
# 说明:显示这三个文件则证明系统支持 inotify 程序功能。

  利用 man proc 方式可以获取到以上 inotify 目录以及下面三个文件的说明信息,根据说明信息,我们可以得知三个文件作用的详细说明:通过 man proc 获取内核中 inotify 信息说明:

  /proc/sys/fs/inotify/目录包含了三个文件 man_queued_events,max_user_instances,and max_user_watches,可以用来限制通过 inotify 接口消耗内核内存的数量;更详细信息参见 man 手册7级别 inotify 说明。

  上述三个文件的说明如下:

  max_user_watches:设置 inotifywait 或 inotifywatch 命令可以监视的文件数量(单进程)

  max_user_instances:设置每个用户可以运行的 inotifywait 或 inotifywatch 命令的进程数

  man_queued_events:设置 inotify 实例事件(event)队列可容纳的事件数量

  说明:实例概念就是,多个相同服务,启动运行多个进程

# 默认配置信息
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_user_watches 
50000000
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_queued_events 
327679

4.2.3.2 inotify-tools 工具安装过程

  安装 inotify-tools 工具比较简单,执行的命令过程如下:

[root@nfs01 ~]# yum install epel-release -y #<==安装 epel 源,默认的官方源没有 inotify-tools 工具包
[root@nfs01 ~]# yum install inotify-tools -y#<==下载 inotify 软件工具

[root@nfs01 ~]# rpm -ql inotify-tools|head -2
/usr/bin/inotifywait#<==inotifywait 软件命令(重要)
/usr/bin/inotifywatch#<==inotifywait 软件命令(重要)
[root@nfs01 ~]# rpm -qa inotify-tools
inotify-tools-3.14-9.el7.x86_64

4.2.3.3  inotify 工具命令介绍

  1. inotify-tools 工具主要命令

  在 inotify-tools 软件部署完毕后,主要应用两个命令实现数据信息的监控,一个利用 inotifywait 命令实现数据变化事件的监控,另一个利用 inotifywatch 命令实现对数据事件信息统计。这个两个命令是能够应用好 inotify-tools 软件的关键,下面对这两个软件说明如下:

  inotifywait:在被监控的文件或或目录上等待特定文件系统事件(open、close、delete等)发生,执行处于阻塞状态,适合在 Shell 脚本中使用。

  inotifywatch: 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。

  2. inotifywait 命令参数详细说明

通过 inotifywait --help 命令获取软件命令参数说明,但为了提高初学者对 inotify 软件的快速掌握效率,下面以表格方式对 inotifywait 命令常用参数进行了总结。

 

  以上参数主要为命令相关参数,利用 inotify 软件主要对数据产生的事件进行实时监控,下面表格列出了,常用监控事件信息:

  根据以上参数信息说明,通过实时数据监控练习来熟悉命令参数用法。

  测试 create 事件

# 在NFS 服务器上开启 inotify 相应监控功能
[root@nfs01 ~]# inotifywait -mrq --timefmt \'%d%m%y %H:%M\' --format \'%T %w%f\' -e create /data  #<==监控/data 目录创建事件显示信息
290220 13:16 /data/ding                                           #<==目录随着下面的操作,文件实时出现

# 再开启一个NFS 服务器连接窗口进行测试验证相应事件
[root@nfs01 /data]# touch ding.txt
说明:只监控 create 创建事件,其它事件并没有进行监控,其它事件产生,监控服务没有信息输出

  上述 inotifywait 命令语法格式说明详细解释如下图4-3:

  简化监控输出信息:

  测试 delete 事件

# 在NFS 服务器上开启 inotify 相应监控功能
[root@nfs01 ~]# inotifywait -mrq --timefmt \'%d%m%y %H:%M\' --format \'%T %w%f\' -e delete /data  #<==监控/data 目录删除事件,简化监控输出信息
290220 16:11 /data/new.txt

# 再开启一个NFS 服务器连接窗口进行测试验证相应事件
[root@nfs01 /data]# ls /data
new.txt
[root@nfs01 /data]# rm -f new.txt
说明:只监控 delete 删除事件,其它事件并没有进行监控,其它事件产生,监控服务没有信息输出

 

  测试 close_write 事件(实际就是监控修改的文件)

# 在NFS 服务器上开启 inotify 相应监控功能
[root@nfs01 ~]# inotifywait -mrq --timefmt \'%d%m%y %H:%M\' --format \'%T %w%f\' -e close_write /data  #<==监控/data 目录关闭写事件,简化监控输出信息
290220 16:11 /data/new.txt
290220 16:11 /data/new.txt
290220 16:11 /data/new.txt

# 再开启一个NFS 服务器连接窗口进行测试验证相应事件
[root@nfs01 /data]# touch new.txt
[root@nfs01 /data]# echo new > new.txt
[root@nfs01 /data]# rm -f new.txt
说明:只监控 close_write 修改事件,其它事件并没有进行监控,其它事件产生,监控服务没有信息输出,因此利用监控修改事件,可对目录中文件的创建和修改事件都监控,即关闭写事件包含了创建事件。

 

  知识点结论:

  通过上面的测试实验可以发现,有些监控事件已经包含了其它相应事件的监控功能,因此进行监控时可以根据需求精简相应的监控事件,后面知识点也会进行说明,更多的架空事件,读者可自行测试看看,下面重要监控事件参数汇总如下表4-5:

扩展教学知识:测试三剑客 sed 替换文件信息操作事件变化情况

首先,创建一个要用sed 命令修改的文件

 


利用 sed 命令进行文件内容替换

 


结论:sed 替换文件内容事件变换说明

1)创建临时文件。

2)把源文件内容放入到临时文件中。

3)修改临时文件的内容。

4)对源文件进行备份 -i.ori oldboyedu.txt.ori。

5)临时文件 重命名为 oldboyedu.txt

3. inotifywatch 命令说明

通过 inotifywatch --help 命令获取软件命令参数说明,这个命令参数和 inotifywait 大多雷同,且实际运用的不多,这里给出简单的例子说明如下。

测试 create 事件

 

 

4.2.4 inotify-tools 软件部署项目实践

4.2.4.1 手工测试监控目录增删改查的命令

# 在NFS 服务器上开启 inotify 相应监控功能
[root@nfs01 ~]# inotifywait -mrq --timefmt \'%d%m%y %H:%M\' --format \'%T %w%f\' -e delete,close_write /data#<==同时监控/data 目录增删改事件显示信息
290220 16:11 /data/new.txt#<==touch new.txt 增加文件带来的事件变化
290220 16:11 /data/new.txt#<==echo new > new.txt 修改文件带来的事件变化
290220 16:11 /data/new.txt#<==rm -f new.txt 删除文件带来的事件变
# 再开启一个NFS 服务器连接窗口进行测试验证相应事件
[root@nfs01 /data]# touch new.txt
[root@nfs01 /data]# echo new > new.txt
[root@nfs01 /data]# rm -f new.txt

4.2.4.2 编写实时监控和复制脚本

  执行的命令和编写的脚本如下:

[root@nfs01 ~]# mkdir /server/scripts -p
[root@nfs01 ~]# cd /server/scripts
[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

  在 nfs01 上执行脚本

  # 监控脚本执行效果演示:

  说明:监控rsync 服务器备份目录信息变化

  测试没有问题后,在 nfs01 上让脚本在后台运行,并放入/etc/rc.local里。

[root@nfs01 /server/scripts]# /bin/sh /server/scripts/monitor.sh &>/dev/null & #<==&表示让脚本在后台运行
[root@nfs01 /server/scripts]# vim /etc/rc.local
[root@nfs01 /server/scripts]# tail -2 /etc/rc.local
########开机自启动########
/bin/sh /server/scripts/monitor.sh &>/dev/null & #<==放到开机自启动文件里。

  说明:让脚本在后台运行。

  至此,使用 rsync+inotify 来实现实时远程复制完成

4.2.5 inotify-tools 软件优化企业案例

  利用 inotify 目录中的三个文件说明信息,可以适当对 inotify 软件进行相应优化:

  企业实战调整:

[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_user_watches 
50000000
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_queued_events 
327679
[root@nfs01 ~]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches #<==单进程可以监控的文件数量。
[root@nfs01 ~]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events #<==队列容纳事件的数量。

# 说明:以上配置重启可能重启可能会失效,需要放置在rc.local 文件中。
# 设置开机自动进行实时监控优化。
[root@nfs01 ~]# tail -2 /etc/rc.local
[root@nfs01 ~]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches 
[root@nfs01 ~]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events

 

4.3 sersync实时复制工具介绍

4.3.1 sersync 工具简介

  Sersync 项目利用inotify与rsync技术实现对服务器数据实时复制的解决方案,其中 inotify 用于监控sersync 所在服务器上文件系统的事件变化,rsync 是目前广泛使用的本地及异地数据复制工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行复制,所以其优势大大超过使用挂接文件系统或 scp 等方式进行镜像复制。

  目前使用的比较多的复制程序版本是 inotify-tools,另外一个是 google 开源项目 Openduckbill(依赖于 inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用 inotify 与 rsync 命令。

  相比上面两个项目,sersync 项目的优点是:

  使用c++编写,对Linux系统文件产生的临时文件和重复的文件操作会进行过滤(后面会提到),在结合 rsync 复制的时候,会减少运行时消耗的本地及网络资源。因此速度更快。

  相比较上面两个项目,sersync 配置起来很简单:

  在 http://code.gooogle.com/p/sersync/downloads/list处下载源码(分为32位版本,与64位版本),其中bin目录下是已经编译好的二进制文件,配合bin目录下的xml文件直接使用即可。

  使用多线程进行复制(即可以并发复制多个不同文件),尤其在复制较大文件时,能够保证多个服务器实时保持复制状态。

  sersync自带crontab 功能,只需在 xml 配置文件中开启,即可按预先的配置,隔一段时间整体复制一次。

  sersync自带socket 与http 的协议扩展,可以满足有特殊需求的公司二次开发。

  参考资料:https://github.com/wsgzao/sersync

4.3.2 sersync 软件架构及工作原理

  下图为 sersync 软件架构及工作原理图,通过此图可以更直观的了解 sersync 的工作情况。

  4、除了线程组线程外,sersync 还有服务线程,主要作用有三个:

  a)首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。

  b) 每隔 10个小时执行脚本一次,同时清空脚本。

  c)第三个作用是 crontab 功能,可以每隔一定时间,将所有路径整体同步一次。

4.3.3 sersync+rsync 实时复制方案项目实践

  提到数据复制就必然会谈到rsync,一般简单的服务器数据传输会使用 ftp/sftp 等方式,但是这样的方式效率不高,不支持差异化增量复制也不支持实时传输。针对数据实时复制需求大多数人会选择 rsync+inotify-tools 的解决方案,但是这样的方案也存在一些缺陷(文章中会具体指出),sersync 是国人基于两者开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。

4.3.4 sersync 软件程序部署

4.3.4.1 sersync 部署环境准备

  1.确保远程数据传输服务部署完成

  大前提 rsync daemon 服务配置成功,可以在 rsync 客户端推送拉取数据,然后才能配置 inotify 服务。

  确保已经配置好 rsync 服务,并且能在客户端推送和拉取数据信息:

[root@nfs01 ~]# rsync -avz --delete /data rsync_backup@172.16.1.41::backup/  --password-file=/etc/rsync.password
sending incremental file list

sent 178 bytes  received 25 bytes  135.33 bytes/sec
total size is 0  speedup is 0.00

 

 

 

 

 

 

 

 

 

 4.

 

分类:

技术点:

相关文章:

  • 2022-01-08
  • 2021-12-18
  • 2021-12-28
  • 2021-10-22
  • 2021-07-24
  • 2022-12-23
  • 2021-10-09
  • 2021-10-15
猜你喜欢
  • 2021-12-04
  • 2022-12-23
  • 2021-04-23
  • 2021-07-10
  • 2021-12-23
  • 2021-11-09
  • 2021-11-27
相关资源
相似解决方案