课堂笔记day36——inotify以及sersync实时备份服务器搭建

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容