实时备份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时备份相关的知识,希望对你有一定的参考价值。

第1章 实时备份介绍

1.1 定时备份缺点

1. 浪费系统性能(数据没发生变化,但到时间也会备份)

2. 数据安全性不高(定时任务最短备份周期1分钟同步一次,如果1分钟内数据变化后,服务器宕机了, 数据就会丢失)

1.2 实时备份过程

1. 划分存储与备份服务器

2. 在存储服务器上部署监控服务,监控相应文件或目录中数据信息的变化

3. 将监控文件或目录,变化的数据信息进行推送,实现实时备份到rsync服务器中

第2章 实时备份部署原理(Inotify+rsync实现实时备份部署)

2.1 实时备份原理

技术分享图片 

2.2 Inotify软件服务介绍

   Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制

   Linux内核从2.6.13起,加入了Inotify支持

   通过Inotify可以监控文件系统中添加、删除、修改、移动等各种事件

  Inotify软件应用前提:
linux内核从2.6.13起,加入了Inotify支持,所以要求Linux内核2.6.13及以上方可使用

[[email protected] ~]# cd /proc/sys/fs/inotify/

[[email protected] inotify]# ll

total 0

-rw-r--r-- 1 root root 0 Jan 26 09:20 max_queued_events

-rw-r--r-- 1 root root 0 Jan 26 09:20 max_user_instances

-rw-r--r-- 1 root root 0 Jan 26 09:20 max_user_watches

说明:显示这三个文件则证明系统支持Inotify程序功能

[[email protected] inotify]# cat max_queued_events 

16384

[[email protected] inotify]# cat max_user_instances 

128

[[email protected] inotify]# cat max_user_watches 

8192

 

通过man proc 获取内核中Inotify信息说明:

/proc/sys/fs/epoll (since Linux 2.6.28)

 This  directory contains the file max_user_watches, which can be used to limit the amount of ker-nel memory consumed by the epoll interface.  For further details, see inotify(7).

[[email protected] ~]# man man 7

MANUAL SECTIONS

       The standard sections of the manual include:

       1      User Commands

       2      System Calls

       3      C Library Functions

       4      Devices and Special Files

       5      File Formats and Conventions

       6      Games et. Al.

       7      Miscellanea

       8      System Administration tools and Daemons

2.3  rsync守护进程模式要部署

    参考以前的文档

2.4 inotify实时监控数据变化服务部署

2.4.1 第一个里程:确认inotify软件是否安装

扩展yum源(扩展的仓库):epel(企业级linux的yum源的扩展仓库)

ü 阿里云epel源:通过访问阿里yum源镜像地址获取

ü 直接安装epel源方式:yum install epel-release

安装Inotify:   yum install inotify-tools -y

[[email protected] ~]# yum install inotify-tools -y

[[email protected] ~]# rpm -qa inotify-tools

inotify-tools-3.14-1.el6.x86_64

[[email protected] inotify]# rpm -ql inotify-tools

/usr/bin/inotifywait

/usr/bin/inotifywatch

 inotify-tools包括2个工具

1.  /usr/bin/inotifywait   --- 开启实时监控服务,监控目录或文件的数据变化

2.  /usr/bin/inotifywatch  --- 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。

说明:yum安装后可以直接使用,如果编译安装需要进入到相应的软件目录的bin目录下使用

2.4.2 第二个里程:事件目录监控命令总结(后续有参数的详解)

inotifywait -mrq /data

    inotifywait -mrq --timefmt "%y/%m/%d %H:%M" --format "%T %w%f" /data

    inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data

inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%:e" -e create /data

    脚本需要编写监控命令:

inotifywait -mrq  --format "%w%f" -e create,close_write,delete,moved_to /data

技术分享图片 

2.4.3 第三个里程碑:利用脚本的方式,将以上两个服务串联在一起

[[email protected] scripts]# vim inotify.sh

[[email protected] scripts]# cat inotify.sh

#!/bin/bash

    

inotifywait -mrq  --format "%w%f" -e create,close_write,delete,moved_to /data|\

while read line

do

rsync -az /data/ --delete [email protected]::backup --password-file=/etc/rsync.password

done

 

扩展:shell脚本循环方式

1. for循环:指定循环条件,循环条件不满足会停止循环

2. while循环:指定循环条件,循环条件满足时,会无限循环(实现死循环)

3. until循环:指定循环条件,循环体检不满足时,会无限循环

注意:脚本在无限循环执行时的中断操作

1. 利用ctrl+z,只是暂停脚本运行(暂停的进程),killall -f inotify,再切换到前台时,已被杀死

注:

    ctrl+z       ---------将当前进程挂起,即调入后台并停止执行

    jobs          -------查看后台停止的进程和对应的进程号(PID)

    fg + 进程序号      ------将后台的命令放前台继续执行

    bg                  ------将前台运行的命令放入后台继续执行

2.  pkill -f inotify                          -f:带inotify字符的进程都杀死

3.  kill -9 9857 9859        ----------kill后面接进程对应的PID号(-9 选项用于强制终止)

2.4.4 第四个里程碑:开机自动运行

给脚本赋予x执行权限,将执行命令放入/etc/rc.local中

第3章 重要参数说明

3.1 inotifywait常用参数

-m   #保持实时监控,前台监控

-d   #类似-m,在后台监控

-r   #递归监控

-q   #输出信息少,安静模式

--timefmt #指定时间输出的格式

--format #指定指定的输出类型格式(%w:监控目录)

-e   #指定事件类型(如:modify、create、close_write、move、delete、attrib)

注:-e指定的事件类型,下面有详详解

技术分享图片技术分享图片 

技术分享图片 

3.1.1 inotifywait中- -format的常用参数

%f              ----------监控目录中哪个文件触发了这个事件

%w             ----------监控的目录

%T             ----------timefmt定义的时间格式

%e             -----------产生事件的信息,多个事件默认以逗号分割

%Xe            -----------输出连续事件信息时,X表示以什么符号分割

技术分享图片 

3.1.2 inotifywait中 -e参数的常用事件类型

close_write             -----------文件或目录在写入模式打开之后关闭

close_nowrite           -----------文件或目录在只读模式打开之后关闭

moved_to              ------------将文件或目录移动(拉)到监控目录中

moved_from           ------------将文件或目录从监控目录中移动(推)出去

create                  ------------在监控目录中创建文件或目录

delete                  ------------在监控目录中删除文件或目录

 

技术分享图片 

技术分享图片 

3.2 测试在监控目录中对文件的各种操作所触发的监控事件类型

3.2.1 创建文件逻辑过程

[[email protected] data]# touch wuhuang.txt

[[email protected] data]# inotifywait -m /data/

/data/ CREATE wuhuang.txt

/data/ OPEN wuhuang.txt

/data/ ATTRIB wuhuang.txt

/data/ CLOSE_WRITE,CLOSE wuhuang.txt

3.2.2 删除文件逻辑过程

[[email protected] data]# rm wuhuang.txt -f

[[email protected] data]# inotifywait -m /data/

/data/ DELETE wuhuang.txt

3.2.3 修改文件逻辑过程

[[email protected] data]# echo 123>wuhuang.txt

[[email protected] data]# inotifywait -m /data/

/data/ OPEN wuhuang.txt

/data/ MODIFY wuhuang.txt

/data/ CLOSE_WRITE,CLOSE wuhuang.txt

3.2.4 移动文件逻辑过程

  /data/目录下的wuhuang.txt移动到/tmp

[[email protected] data]#mv wuhuang.txt /tmp/

[[email protected] data]# inotifywait -m /data/

/data/ MOVED_FROM wuhuang.txt

  /tmp/wuhuang.txt移动到/data/目录下

[[email protected] data]#mv /tmp/wuhuang.txt ./

[[email protected] data]# inotifywait -m /data/

/data/ MOVED_TO wuhuang.txt

  /etc/hosts复制到/data

[[email protected] data]#cp /etc/hosts ./

[[email protected] data]# inotifywait -m /data/

/data/ CREATE hosts

/data/ OPEN hosts

/data/ MODIFY hosts

/data/ CLOSE_WRITE,CLOSE hosts

  /data/wuhuang.txt复制到/tmp

[[email protected] data]# cp wuhuang.txt /tmp/

[[email protected] data]# inotifywait -m /data/

/data/ OPEN wuhuang.txt

/data/ CLOSE_NOWRITE,CLOSE wuhuang.txt

3.2.5 修改文件属性信息

[[email protected] data]# chmod 600 wuhuang.txt

[[email protected] data]# inotifywait -m /data/

/data/ ATTRIB wuhuang.txt

3.2.6 对文件进行重命名

[[email protected] data]# mv wuhuang.txt wh.txt

[[email protected] data]# inotifywait -m /data/

/data/ MOVED_FROM wuhuang.txt

/data/ MOVED_TO wh.txt

 

 注意:Tab键也会触发监控,测试时为了更好的看到效果,尽量少用Tab键

3.3 Inotify服务优化

3.3.1 /proc/sys/fs/inotify/目录下有三个文件,对inotify机制有一定的限制

(1) max_user_watches: 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认监控文件数量:8192
2)max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认监控进程数:128
一个服务识别不同的配置文件,启动多个进程,开启多不同的socket条目,生成多个不同端口信息
以上操作就实现了一个服务的多实例创建
3) max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量
   默认队列中事件数量:16384

监控目录中文件变化越频繁,这个值就越大,超过设置的最大值就会被丢弃

针对以上三个文件可做优化:

建议设置为最大值:50000000,并设置开机自启(有时候重启可能会恢复,需要放在/etc/rc.local)

echo “50000000” >/proc/sys/fs/inotify/max_user_watches

echo “50000000” >/proc/sys/fs/inotify/max_queued_events

echo "50000000"   >/proc/sys/fs/inotiofy/max_user_istances

 将这三条命令追加到/etc/rc.local中。

 参考man帮助:

 man inotify   ---------有显示inotify(7),7表示第七个级别

  man man    ----------可能查看man的七个级别的含义

  man 7 inotify    ----------即可查看inotify中max_queque_event等三个文件的使用帮助

第4章 Inotify软件的优缺点

4.1 优点

监控文件系统事件变化,通过同步工具(rsync)实时同步数据

4.2 缺点

1. 并发如果大于200个文件(大小4-100k),同步时就会有延时

2. 前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化文件,不 变化的可以不理。

3. 监控到事件后,rsync同步是单线程的(效率低),serync同步是多线程(效率高)                                

      注:一个进程可管理多个线程

 4.  inotify实现实时同步需要编写shell脚本

第5章 sersync软件

5.1 sersync功能信息

1. 支持配置文件管理

2. 真正的守护进程是socket

3. 可以对失败文件定时重传(定时任务的功能)

4. 第三方的HTTP接口(例如CDN缓存)

5. 默认多线程同步,效率高(inotify是单线程)

5.2 sersync软件服务部署流程

5.2.1 部署rsync守护进程服务

5.2.2 第一个里程碑:确认软件是否安装(sersync)

绿色软件包的安装方式(二进制包安装方式)

sersync软件官方地址:https://github.com/wsgzao/sersync

 进行软件下载

 将下载好的软件程序上传到服务器中(nfs服务器)

 解压缩软件程序包: unzip sersync_installdir_64bit.zip

 将软件程序目录移动到指定目录中: mv sersync/  /usr/local/    

技术分享图片  

5.2.3 第二个里程碑:编写sersync配置文件(修改前先备份源文件)

vim  /usr/local/sersync/conf/confxml.xml

注:此处只列出主要修改项

 <sersync>
 <localpath watch="/home/"> <!-- 这里填写被监控服务器(NFS)要同步的文件夹路径-->
 <remote ip="8.8.8.8" name="rsync"/> <!-- 这里填写rsync服务器的IP地址和模块名-->
 <!--<remote ip="192.168.28.39" name="tongbu"/>-->
 <!--<remote ip="192.168.28.40" name="tongbu"/>-->
 </localpath>
 <rsync>
 <commonParams params="-artuz"/>  <!-- 这里填写rsync命令的参数的认证信息-->
 <auth start="true" users="rsync" passwordfile="/app/local/sersync/user.pass"/> <!-- rsync+密码文件 这里填写rsync服务器的认证信息-->
 <userDefinedPort start="false" port="874"/><!-- port=874 -->
 <timeout start="false" time="100"/><!-- timeout=100 -->
 <ssh start="false"/>
 </rsync>

一些标签了解(详细内容参见官网)

<filter start="false">

          <exclude expression="(.*)\.svn"></exclude>

          <exclude expression="(.*)\.gz"></exclude>

          <exclude expression="^info/*"></exclude>

          <exclude expression="^static/*"></exclude>

        </filter>

说明:filter实时同步的排除功能  

<inotify>

           <delete start="true"/>

           <createFolder start="true"/>

           <createFile start="false"/>

           <closeWrite start="true"/>

           <moveFrom start="true"/>

           <moveTo start="true"/>

           <attrib start="false"/>

           <modify start="false"/>

        </inotify>

说明:inotify指定监控文件或目录变化的事件信息

5.2.4 第三个里程碑:启动sersync服务

1. chmod +x sersync #先授予sersync命令执行权限

2. /bin/sersync -h      #查看帮助(都是中文的)

3)/bin/sersync  -dro  /usr/local/sersync/conf/confxml.xml

注:不要用xinetd管理rsync服务(sersync会调用inotify+rsync服务,如果rsync是由xinetd启动的会不识别)

[[email protected] bin]# pwd

/usr/local/sersync/bin

[[email protected] bin]# chmod +x sersync

[[email protected] 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参数,则默认执行同步程序

5.2.5 第四个里程碑:查看服务是否启动

  ps -ef |grep sersync

5.3 高并发数据实时同步方案小结

1. inotify(sersync)+rsync ,是文件级别的。

2. drbd文件系统级别,基于block块同步,缺点:备节点数据不可用

3. 第三方软件的同步功能:mysql同步(主从复制),oracle,mongodb。

4. 程序双写,直接写两台服务器

5. 利用产品业务逻辑解决(读写分离,备读不到,读主)。


以上是关于实时备份的主要内容,如果未能解决你的问题,请参考以下文章

Rsync+sersync实现文件实时备份

SVN版本库实时备份整理

实时数据中的 Observables 更新在片段中不起作用

rsync+inotify实现实时备份

检索数据未出现在 ListView 的片段中

备份你自己的snipplr.com网站片段