1. inotify+sersync实时复制应用简介
1.1 实时复制介绍
利用实时复制方式,实现实时备份重要数据信息。实时复制是企业数据备份最重要的方式,主要用于对用户提交的数据的实时备份。对于用户提交到服务器上的普通文件(压缩包、视频、文档等),可采用inotify/sersync+rsync实时备份方式;对于数据文件还有较复杂的分布式存储工具自身可以实现将数据同时备份成多份,例如:FastDFS、GlusterFS等;对于提交到数据库中的数据,可使用数据库的主从复制(例如:MySQL、Oracle)方式备份,这是软件自带的实时复制备份方式。
1.2 实时复制细节实现说明
实时复制软件会监控磁盘文件系统的变化,比如:指定一个/data目录,实时复制软件服务进程会实时监控这个/data目录中数据的变化,即文件系统block与inode信息的变化。
一旦/data目录文件发生变化,就会执行sync命令,将变化的数据信息推送到备份服务器相应的备份目录中,从而完成数据的实时备份。
1.3 实时复制软件介绍
企业中较为常用的实时复制软件有如下两种:(推荐使用第二个)
| 软件服务 | 依赖程序 | 部署难点 | 说明
|inotify-tools| rsync守护进程务 | 复制脚本编写 | 监控目录数据变化,实时数据复制
| sersync | rsync守护进程务| 配置文件编写 | 监控目录数据变化,实时数据复制
1.4 实时复制inotify机制简介
Inotify是一种异步的系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件。实际上inotify-tools是一个监控指定目录数据实时变化的软件程序。
(sersync软件是在inotify基础上进行开发的,功能要更加强大些,支持配置文件配置,多了定时重试机制,过滤机制,提供接口做CDN数据更新,支持多线程操作)。
inotify机制优点:监控文件系统事件变化,通过复制工具实现实时数据复制,支持多线程实时复制。
inotify机制缺点:实测并发如果大于200个文件(10~100K),复制会有延迟。
1.5 inotify工具命令介绍
1.5.1 inotify-tools工具主要命令:
inotifywait:在被监控的目录等待特定文件系统事件发生,执行后处于阻塞状态,适合在shell脚本中使用。
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统时间发生的次数统计。
1.5.2 inotifywait命令参数详细说明
| 命令参数|参数说明|
| -m(--monitor)| 始终保持事件监听状态※|
| -d(--daemon) | 类似-m参数,只是将命令运行在后台记录触发的事件信息在指定文件中,利用—outfile参数定义程序日志使用—syslog参数 |
| -r| 递归监控目录数据信息变化※ |
| -o(--outfile<file>) | 打印事件到文件中,相当于标准正确输出 |
| -s(--syslog) | 发送错误到syslog相当于标准错误输出 |
| -q(--qulet) | 输出信息少(只打印事件信息) |
| --excludei<pattern> | 排除文件或目录时,不区分大小写|
| --timefmt<fmt> | 指定时间输出的格式|
| --fromat<fmt> | 打印使用指定的输出类似格式字符串;即实际监控输出的内容|
| -e | 指定监听指定的事件,如果省略,表示所有时间都进行监听※ |
| 时间名称| 事件说明|
| access| 文件或目录内容被读取|
| modify | 文件或目录内容被写入 |
| attrib | 文件或目录属性改变 |
| close_write | 文件或目录关闭,在写入模式打开之后关闭的※ |
| close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 |
| close | 文件或目录关闭,不管读或是写模式 |
| open | 文件或目录被打开 |
| moved_to | 文件或目录被移动到监控的目录中 |
| moved_from| 文件或目录被移动从监控的目录中 |
| move| 文件或目录不管移动到或是移动出监控目录都吃触发事件|
| create| 文件或目录创建在监控的目录中※|
| delete | 文件或目录被删除在监控的目录中※ |
| delete_self| 文件或目录被删除|
| unmount| 文件系统包含的文件或目录不能卸载 |
2. inotify+rsync实时复制项目实践
## 2.1 前提:backup rsync服务端部署完成然后在nfs01中定义密码认证变量,并测试数据推送和拉取:
[root@nfs01 ~]# echo 'export RSYNC_PASSWORD=oldboy' >>/etc/bashrc #<==定义密码环境变量
[root@nfs01 ~]# source /etc/bashrc #<==使配置生效
[root@nfs01 ~]# echo $RSYNC_PASSWORD #<==检查,确保生效
oldboy
[root@nfs01 /]# rsync -avz /data rsync_backup@172.16.1.41::backup
sending incremental file list #<==出现以下几行提示,说明rsync服务环境是正常的
data/
sent 72 bytes received 28 bytes 200.00 bytes/sec
total size is 0 speedup is 0.00
2.2 检查Linux系统是否支持inotify实时监控
[root@nfs01 /]# uname -r #<==内核是3.10,支持inotify机制
3.10.0-957.5.1.el7.x86_64
[root@nfs01 /]# ls -l /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 4月 19 12:27 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 12:27 max_user_watches #<==设置可以监视的文件数量
显示以上三个文件证明系统支持inotfiy程序功能
2.3 inptify-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
/usr/bin/inotifywatch
2.4 测试实践
xshell中打开两个nsf01窗口,第一个窗口输入如下命令,第二个窗口进入/data目录下创建文件。
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /data
![M1GXVTFBZL5LGIA@V$D]L~S.png](https://upload-images.jianshu.io/upload_images/16833174-0c668bd3bc1fabea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.5 编写实时监控和复制脚本
执行的命令和编写的脚本如下:
[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上让脚本在后台运行,并放入/etc/rc.local中
[root@nfs01 /]# /bin/sh /server/scripts/monitor.sh & #<==&表示让脚本在后台运行
[1] 45998
[root@nfs01 /]# tail -2 /etc/rc.local
/bin/sh /server/scripts/monitor.sh &
2.6 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
#以上两个参数重启可能会失效,所以放在/etc/rc.local中
[root@nfs01 /]# tail -2 /etc/rc.local
echo "50000000" >/proc/sys/fs/inotify/max_user_watches
echo "50000000" >/proc/sys/fs/inotify/max_queued_events
3. sersync项目实践
3.1 先测试客户端能否推送成功(nfs01上)
[root@nfs01 /]# rsync -az /data/ [rsync_backup@172.16.1.41::backup]
3.2 部署sersync服务(nfs01上)
#sersync_oldboy_64bit_20160928.tar.gz #<==配置文件压缩包
#链接: https://pan.baidu.com/s/1ZGz9tQYKHYqolnjZ9WL7Cw 提取码: u82f
[root@nfs01 /]# mkdir -p /server/tools/
[root@nfs01 /]# cd /server/tools/
[root@nfs01 /server/tools]# tar xf sersync_oldboy_64bit_20160928.tar.gz
[root@nfs01 /server/tools]# mkdir /application/ -p
[root@nfs01 /server/tools]# mv application/sersync /application/
3.3 sersync配置文件(nfs01中)
[root@nfs01 /server/tools]# cd /application/sersync/
[root@nfs01 /application/sersync]# ls
bin conf logs readme.txt
[root@nfs01 /application/sersync]# cd conf/
[root@nfs01 /application/sersync/conf]# ls
confxml.xml confxml.xml.ori
[root@nfs01 /application/sersync/conf]# cat -n confxml.xml
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <head version="2.5">
3 <host hostip="localhost" port="8008"></host>
4 <debug start="false"/>
5 <fileSystem xfs="false"/>
6 <filter start="false">
7 <exclude expression="(.*)\.svn"></exclude>
8 <exclude expression="(.*)\.gz"></exclude>
9 <exclude expression="^info/*"></exclude>
10 <exclude expression="^static/*"></exclude>
11 </filter>
12 <inotify>
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="false"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>
22
23 <sersync>
24 <localpath watch="/data">
25 <remote ip="172.16.1.41" name="backup"/>
26 <remote ip="172.16.1.41" name="oldboy"/>
27 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
28 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
29 </localpath>
30 <rsync>
31 <commonParams params="-artuz"/>
32 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
33 <userDefinedPort start="false" port="874"/><!-- port=874 -->
34 <timeout start="true" time="100"/><!-- timeout=100 -->
35 <ssh start="false"/>
36 </rsync>
37 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
38 <crontab start="false" schedule="600"><!--600mins-->
39 <crontabfilter start="false">
40 <exclude expression="*.php"></exclude>
41 <exclude expression="info/*"></exclude>
42 </crontabfilter>
43 </crontab>
44 <plugin start="false" name="command"/>
45 </sersync>
46
47 <plugin name="command">
48 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
49 <filter start="false">
50 <include expression="(.*)\.php"/>
51 <include expression="(.*)\.sh"/>
52 </filter>
53 </plugin>
54
55 <plugin name="socket">
56 <localpath watch="/opt/tongbu">
57 <deshost ip="192.168.138.20" port="8009"/>
58 </localpath>
59 </plugin>
60 <plugin name="refreshCDN">
61 <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
62 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
63 <sendurl base="http://pic.xoyo.com/cms"/>
64 <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
65 </localpath>
66 </plugin>
67 </head>
3.4 启动服务并添加到/etc/rc.local中
[root@nfs01 /application/sersync/conf]# /application/sersync/bin/sersync -d -n 10 -o /application/sersync/conf/confxml.xml #<==开启服务
[root@nfs01 /application/sersync/conf]# tail -3 /etc/rc.local
/application/sersync/bin/sersync -d -n 10 -o /application/sersync/conf/confxml.xml &>/dev/null
4. 拓展知识
#配置:systemctl start sersync启动方案
#参考网址:https://blog.51cto.com/oldboy/2155931
[root@nfs01 /data]# cat /etc/rc.d/init.d/sersync
#!/bin/bash
# chkconfig: 2345 21 81
# description: rsync service start and stop scripts
# Author: oldboy
# Organization: www.oldboyedu.com
start(){
/application/sersync/bin/sersync -d -o /application/sersync/conf/confxml.xml &>/dev/null
}
stop(){
killall sersync 2>/dev/null
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 1
esac
[root@nfs01 /data]# chmod +x /etc/rc.d/init.d/sersync
[root@nfs01 /data]# cat /usr/lib/systemd/system/sersync.service
[Unit]
Description=sersyncd service
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/sersync start
ExecReload=/etc/rc.d/init.d/sersync restart
ExecStop=/etc/rc.d/init.d/sersync stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/sersync.service
[root@nfs01 /data]# systemctl enable sersync.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sersync.service to /usr/lib/systemd/system/sersync.service.
[root@nfs01 /data]# systemctl status sersync.service
● sersync.service - sersyncd service
Loaded: loaded (/usr/lib/systemd/system/sersync.service; enabled; vendor preset: disabled)
Active: inactive (dead)
[root@nfs01 /data]# systemctl stop sersync
[root@nfs01 /data]# ps -ef|grep sersync|grep -v grep
[root@nfs01 /data]# systemctl start sersync