实时同步服务介绍
为什么要采用实时同步服务
1.用户上传的数据需要实时备份
2.采用定时备份的方式会丢失一分钟的数据
实时同步服务的原理
1.创建要存储数据的目录
2.利用实时同步的软件监控我们进行备份的数据目录
3.利用rsync服务进行数据的推送传输备份
inotify软件
Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件
软件参考链接:https://github.com/rvoicilas/inotify-tools/wiki
inotify条件参数说明
[root@nfs01 inotify]# pwd
/proc/sys/fs/inotify
[root@nfs01 inotify]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 15 09:37 max_queued_events
-rw-r--r-- 1 root root 0 Feb 15 09:37 max_user_instances
-rw-r--r-- 1 root root 0 Feb 15 09:37 max_user_watches
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量,默认监控事件队列长度为16384
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数,默认每个用户可以开启inotify服务128个进程
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程),默认只能监控8192个文件
[root@nfs01 inotify]# rpm -ql inotify-tools
/usr/bin/inotifywait -->实现对数据目录信息变化监控
/usr/bin/inotifywatch -->监控数据信息变化,对变化的数据进行统计
inotify软件应用命令
#语法:
命令 命令相应的参数信息 监控事件 监控目录
inotifywait -mrq --timefmt "%F-%X" --format "%T%w%f" -e create /data
#示例:
[root@nfs01 inotify]# inotifywait -mrq --timefmt "%F-%X" --format "%T%w%f" -e creat
e /data
输出监控事件信息:2019-02-15-11:50:31/data/db
2019-02-15-11:50:31:表示%T,输出定义的时间信息
/data:表示%w,监控文件或目录的名称信息
/db:表示%f,将显示监控目录下触发事件的文件或目录信息
inotifywait参数说明
命令参数 | 参数说明 |
---|
-m(--monitor重要参数) | 始终保持事件监听状态 |
-r(重要参数) | 进行递归监控 |
-d(--deamon) | 类似于-m,只是将命令在后台运行 |
-o(--outfile) | 打印事件到文件中,相当于标准输出 |
--excludei(重要参数) | 排除文件或目录 |
-s(--syslog) | 发送错误到syslog相当于错误输出 |
-q(quiet重要参数) | 将无用的输出信息,不进行显示 |
--timefmt(重要参数) | 设定日期的格式 |
--format(重要参数) | 命令的执行过程中,输出的信息格式 |
-e(重要参数) | 指定的监控事件 |
--timefmt参数(通过man strftime获取更多参数)
命令参数 | 参数说明 |
---|
%d (重要参数) | 每月的第几天,显示信息为十进制数(范围是01-31) |
%m (重要参数) | 显示月份,显示信息为十进制数(范围是01-12) |
%M | 显示分钟,显示信息为十进制数(范围是00-59) |
%y (重要参数) | 年份信息,显示信息为十进制数,并且没有世纪信息 |
%Y | 年份信息,显示信息为十进制数,并且包含世纪信息 |
%H | 小时信息,显示信息为十进制数,使用24小时制(范围是00-23) |
命令参数 | 参数说明 |
---|
%w (重要参数) | 事件出现时,监控文件或目录的名称信息 |
%f (重要参数) | 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空。 |
%e (重要参数) | 显示发生的事件信息,不同的事件信息用逗号进行分隔 |
%Xe | 显示发生的事件信息,不同的事件信息用X进行分隔,可以修改X为指定分隔符 |
%T (重要参数) | 这个格式是通过strftime函数进行匹配时间格式信息的 |
监控事情说明(-e)
事件名称 | 事件说明 |
---|
access | 文件或目录内容被读取 |
modify | 文件或目录内容被写入 |
attrib | 文件或目录属性改变 |
close_write(重要参数) | 文件或目录关闭,在写入模式打开之后关闭的。 |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 |
close | 文件或目录关闭,不管读或是写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动到监控的目录中 |
moved_from | 文件或目录被移动出监控的目录中 |
move(重要参数) | 文件或目录不管移动到或是移动出监控目录都触发事件 |
create(重要参数) | 文件或目录创建在监控的目录中 |
delete(重要参数) | 文件或目录被删除在监控的目录中 |
delete_self | 文件或目录被删除 |
unmount | 文件系统包含的文件或目录不能卸载 |
重要监控事件说明
重要事件 | 包含事件 | 备注说明 |
---|
close | close_write与close_nowrite | 文件或目录关闭,不管读或是写模式即包含写关闭与读关闭 |
close_write | create | 包含文件创建事件,但不包含目录创建事件 |
move | moved_to与moved_from | 文件或目录不管移动到或是移动出监控目录都触发事件即包含信息移入或移出监控目录事件 |
重要参数汇总:根据以上说明,在实际使用时,只要监控以下事件即可。create创建、 delete删除、 moved_to移入、 close_write修改
示例:监控data目录的数据变化
[root@nfs01 inotify]# inotifywait -mqr --timefmt "日期:%F时间:%X" --format "%T%w%f" -
e create,delete,moved_to,close_write /data/ -->相对完整的命令应用
sersync软件
Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目前广泛使用的本地及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,所以其优势大大超过使用挂接文件系统或scp等方式进行镜像同步。
软件参考链接:https://github.com/wsgzao/sersync
serync软件配置文件说明
[root@nfs01 sersync-master]# vim /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="true"/>
<fileSystem xfs="false"/>
<!-- 说明:实现同步数据过滤排除功能 -->
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<!-- 说明:类似于inotify的-e参数功能,指定监控的事件信息 -->
<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>
<sersync>
<localpath watch="/data"> <!-- 这里填写服务器A要同步的文件夹路径-->
<remote ip="172.16.1.41" name="backup"/> <!-- 这里填写备份服务器的IP地址和模块名-->
<!--<remote ip="192.168.28.39" name="tongbu"/>-->
<!--<remote ip="192.168.28.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/>
<auth start="true" users="rsync_backup" passwordfile="/app/local/sersync/user.password"/> <!-- rsync+密码文件 这里填写备份服务器的认证信息-->
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><!-- 修改失败日志记录(可选)-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
<!-- 下面这些有关于插件你可以忽略了 -->
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
<plugin name="socket">
<localpath watch="/home/demo">
<deshost ip="210.36.158.xxx" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cdn.markdream.com/site/">
<cdninfo domainname="cdn.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://cdn.markdream.com/cms"/>
<regexurl regex="false" match="cdn.markdream.com/site([/a-zA-Z0-9]*).cdn.markdream.com/images"/>
</localpath>
</plugin>
</head>
sersync启动参数说明
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍(测试)
参数-n:指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件