第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. 利用产品业务逻辑解决(读写分离,备读不到,读主)。
原文地址:http://blog.51cto.com/12805107/2066044