实时复制说明
1.实时复制软件会监控磁盘文件系统的变化,比如指定的/data目录,实时复制软件进程会实时监控这个/data
目录中对应文件系统数据的变化。
2. 一旦/data目录文件发生变法,就会执行rsync命令,将变化的数据推送到备份服务器对应的备份目录中。
实时复制软件介绍
企业常用实时复制软件有如下两款
软件 | 依赖程序 | 部署难点 | 说明 |
Inotify-tools | Rsync守护进程 | 复制脚本 | 监控目录数据变化 |
Sersync* | Rsync守护进程 | 配置文件 | 监控目录数据变化 |
Inotify机制
Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加,删除,修改等事件,利用这个
内核接口,第三方软件可以监控文件系统下的情况变化。
那么Inotify-tools就是该类技术的实现,是一个监控指定目录数据实时变化的软件。
实现了Inotify的软件还有Sersync,Inotify-tools
【Inotify机制的优点】、
1. 监控文件系统的事件变化,通过复制工具实现实时数据复制
2. 支持多线程实时复制
【Inotify的缺点】
1. 实测当文件数量大于200(10-100kb),复制存在延迟
Inotify+Rsync实施复制实战
无论是Inotify-tools还是Sersync,本身的核心功能都是监控指定目录内的数据变化,具体的复制当远程
服务器的功能还是借助Rsync工具配合,Inotify机制软件工作流程如下。
1. 备份源客户端开机运行Inotify软件,检测指定目录的文件系统变化。
2. 一旦获取到指定监控目录的数据发生变化,即刻执行Rsync命令复制数据。
3. 将变化的数据发送到Rsync服务端的备份目录。
项目部署实施
【1.确保远程数据传输服务部署完成】
前提配置好Rsync Daemon模式
也就是可以在客户端机器,推送、拉取数据到BACKUP服务器,才能配置Inofity-tools 将rsync守护进程模式部署完毕 rsync服务端部署 a 检查rsync软件是否已经安装 b 编写rsync软件主配置文件 c 创建备份目录管理用户 d 创建备份目录,并进行授权 e 创建认证文件,编写认证用户和密码信息,设置文件权限为600 f 启动rsync守护进程服务
【在NFS01机器配置】
rsync客户端部署 a 检查rsync软件是否已经安装 b 创建认证文件,编写认证用户密码信息即可,设置文件权限为600 c 利用客户端进行数据同步测试 当前也就是rsync客户端机器,配置如下部署 1.设置密码环境变量,方便的使用rsync命令 [root@nfs01 ~]# echo "export RSYNC_PASSWORD=chaoge" >> /etc/bashrc 2.加载配置文件 source /etc/bashrc 3.检查环境变量 [root@nfs01 ~]# echo $RSYNC_PASSWORD chaoge 4.作为Rsync客户端,测试推送和拉取数据是否正常 #推送本地数据给Rsync服务端 [root@nfs01 ~]# rsync -avz /data/ rsync_backup@192.168.178.110::backup 5.拉取服务端资料 [root@nfs01 ~]# rsync -avz rsync_backup@192.168.178.110::backup /tmp
【检查Linux版本是否支持Inotify机制】
只有Linux内核版本在2.6.13起才支持,以及是否存在三个系统文件,存在则支持
1.检查linux内核版本 [root@nfs01 ~]# uname -r 3.10.0-1062.9.1.el7.x86_64 2.检查Inotify相关文件 [root@nfs01 ~]# ls -l /proc/sys/fs/inotify/ 总用量 0 [root@nfs01 ~]# cd /proc/sys/fs/inotify/ [root@nfs01 inotify]# ll 总用量 0 -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_queued_events -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_instances -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_watches max_user_watches: 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程) 默认只能监控8192个文件 max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数 默认每个用户可以开启inotify服务128个进程 max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量 默认监控事件队列长度为16384
【Inotify-tools工具安装】
1.yum安装,需配置epel源 [root@nfs01 ~]# yum install inotify-tools -y 2.检查软件 [root@nfs01 ~]# rpm -ql inotify-tools|head -2 /usr/bin/inotifywait # 重要软件命令 /usr/bin/inotifywatch # 重用软件命令
【Inotify命令工具】
上述操作我们安装好了Inotify-tools软件,生成2个重要的命令
1. inotifywait:在被监控的目录等待特定文件系统事件(open,close,delete等事件),执行后处于
阻塞状态,适合在shell脚本中使用,是实现监控的关键。
2. inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)
【inotifywait命令解释】
inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树; inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息 从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数: 语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…] -m: 即“–monitor” 表示始终保持事件监听状态。 -d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数 -r: 即“–recursive” 表示递归查询目录 -q: 即“–quiet” 表示打印出监控事件 -o: 即“–outfile” 输出事情到一个文件而不是标准输出 -s: 即“–syslog” 输入错误信息到系统日志 -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等 -format: 指定输出格式;常用的格式符如: %w:表示发生事件的目录 %f:表示发生事件的文件 %e:表示发生的事件 %Xe:事件以“X”分隔 %T:使用由-timefmt定义的时间格式 -timefmt:指定时间格式,用于-format选项中的%T格式
利用 inotify 软件监控的事件主要是如下
Events 含义 access 文件或目录被读取 modify 文件或目录内容被修改 attrib 文件或目录属性被改变 close 文件或目录封闭,无论读/写模式 open 文件或目录被打开 moved_to 文件或目录被移动至另外一个目录 move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录 create 文件或目录被创建在当前目录 delete 文件或目录被删除 umount 文件系统被卸载
Inotify 可监控的事件
可监控的事件 有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。 IN_ACCESS 被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。 IN_MODIFY 被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。 IN_ATTRIB 被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。 IN_CLOSE_WRITE 一个打开的,等待写入的文件或目录被关闭。 IN_CLOSE_NOWRITE 一个以只读方式打开的文件或目录被关闭。 IN_CLOSE 一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。 IN_OPEN 文件或目录被打开。 IN_MOVED_FROM 被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。 IN_MOVED_TO 文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。 IN_MOVE 可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。 IN_CREATE 在被监控目录中创建了子目录或文件。 IN_DELETE 被监控目录中有子目录或文件被删除。 IN_DELETE_SELF 被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。 IN_MOVE_SELF 监控项目本身被移动。
测试create事件
# 语法 inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data <-- 相对完整的命令应用 # 指定事件监控 inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data # 实际案例,监控/data目录的创建 [root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T%w%f' -e create /data # 参数解释 -m: 即“–monitor” 表示始终保持事件监听状态。 -r: 即“–recursive” 表示递归查询目录 -q: 即“–quiet” 表示打印出监控事件 --timefmt:指定时间格式 %m 月份(以01-12来表示)。 %d 日期(以01-31来表示)。 %y 年份(以00-99来表示)。 %w:表示发生事件的目录 %f:表示发生事件的文件 %T:使用由-timefmt定义的时间格式 %e:表示发生的事件 #日志检测 16/03/20 09:26/data/超哥带你学inotify.txt 16/03/20 09:26/data/嗨起来 16/03/20 09:27/data/今天是个好日子.txt -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等
测试delete事件
1.在NFS01客户端机器上检测inotify功能,检测delete事件,只有在该目录下的删除动作,才会触发监控 [root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e delete /data 2.再开一个终端,进行删除动作 [root@nfs01 data]# rm -rf 爱的魔力转圈圈.txt
close_write事件
检测不同的时间,其实就是-e参数指定的不同,其实很简单 [root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e close_write /data
Inotify增删改事件
重要事件 | 包含事件 | 说明 |
close | close_write,close_nowrite | 文件或目录关闭,不管是读还是写都包含关闭操作 |
close_write | create | 含创建文件事件,不含创建目录事件,自身有修改事件 |
move | moved_to,moved_from | 文件或目录无论是移动,移除监控目录,都被监控 |
扩展:sed命令触发器
在NFS01上开启Inotify监控功能
1.监控所有事件,且格式化输出 [root@nfs01 ~]# inotifywait -mrq /data --format "%w%f 事件:%e"
利用sed修改文件内容
# 替换chaoge.txt的内容,且进行备份,旧内容在chaoge.txt.bak ,替换后内容在chaoge.txt [root@nfs01 data]# sed -i.bak 's/默认监控所有事件/超哥带你学inotify事件/g' /data/chaoge.txt # sed修改文件事件如下 1. 创建临时文件 2. 把源文件内容放入临时文件中 3. 修改临时文件内容 4. 对源文件进行备份 -i.bak ---- chaoge.txt.bak 5. 对临时文件重命名为chaoge.txt
Inotify-tools软件部署实战
手工配置inotify的监控事件,增删改查
# 检测目录的增删改事件 [root@nfs01 ~]# inotifywait -mrq --timefmt "%y-%m-%d %T" --format "%T %w%f 当前事件有:%e" -e close_write,delete /data/
再开一个终端,修改数据
[root@nfs01 data]# touch /data/超哥带你学inotify.txt [root@nfs01 data]# echo "超哥带你飞" >> /data/超哥带你学inotify.txt.bak [root@nfs01 data]# [root@nfs01 data]# rm -rf /data/* #Inotify能够检测到如下信息 /data/超哥带你学inotify.txt /data/超哥带你学inotify.txt.bak /data/chaoge.txt /data/chaoge.txt.bak /data/超哥带你学inotify.txt.bak /data/嗨起来
编写实时监控和复制脚本
1.生成一个数字1,2,3的文件 seq 3 > /tmp/chaoge.txt 2.编写一个脚本,能够循环读取文件内容 [root@nfs01 tmp]# cat test.sh cat ./chaoge.txt | while read line do echo $line done 3.检查文件 [root@nfs01 tmp]# ls chaoge.txt test.sh 4.执行该脚本,-x参数执行脚本,输出执行过程,调试利器,也可以不加 [root@nfs01 tmp]# sh -x test.sh + read line #按行读取 + cat ./chaoge.txt #读取文件 + echo 1 #输出1 1 + read line #按行读取 + echo 2 #输出2 2 + read line + echo 3 3 + read line
【操作实时同步的脚本】
1.创建统一管理脚本的文件夹 [root@nfs01 tmp]# mkdir -p /MyInotify/scripts 2.创建针对事件变化完整复制的脚本 monitor.sh [root@nfs01 scripts]# cat monitor.sh #!/bin/bash cmd="/usr/bin/inotifywait" $cmd -mrq --timefmt "%y-%m-%d %T" --format "%T %w%f 当前事件有:%e" -e close_write,delete /data | while read line do cd /data && rsync -az --delete ./ rsync_backup@192.168.178.139::backup done --------------------------------------------------------------------------------------------
【在nfs01机器上执行脚本】
[root@nfs01 scripts]# sh -x monitor.sh
测试脚本没问题后,可以将脚本运行在后台,实时监听文件变化,进行同步,保证数据备份安全 1.脚本放置后台运行,在前台运行会占用终端,且终端关了,任务会断 [root@nfs01 scripts]# /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null & [1] 3004 [root@nfs01 scripts]# jobs [1]+ 运行中 /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null & [root@nfs01 scripts]# 2.该任务添加至开机启动文件 [root@nfs01 scripts]# tail -2 /etc/rc.local # inotify + rsync script by chaoge /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
Inotify优化参数
有关inotify的内核参数文件,可以针对企业需求进行优化,修改如下 [root@nfs01 scripts]# cat /proc/sys/fs/inotify/max_* 16384 128 8192 [root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches [root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_queued_events