inotify+rsync实现实时同步

一、Inotify介绍

Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。国人周洋在金山公司也开发了类似的实时同步软件sersync,克服了inotify的缺陷,并且提供了几个插件作为可选工具。

inotify的实现工具有几款软件:

inotify-tools,sersync,lrsyncd

二、安装inotify-tools

inotify由inotify-tools包提供。在安装inotify-tools之前,请确保内核版本高于2.6.13,且在/proc/sys/fs/inotify目录下有以下三项,这表示系统支持inotify监控。

[root@web01 ~]# ll /proc/sys/fs/inotify/

total 0

-rw-r--r-- 1 root root 0 Nov 10 09:44 max_queued_events

-rw-r--r-- 1 root root 0 Nov 10 09:44 max_user_instances

-rw-r--r-- 1 root root 0 Nov 10 09:44 max_user_watches

inotify-tools工具只提供了两个命令:

[root@web01 ~]# rpm -ql inotify-tools | grep bin/

/usr/bin/inotifywait

/usr/bin/inotifywatch

其中inotifywait命令用于等待文件发生变化,所以可以实现监控(watch)的功能,该命令是inotify的核心命令。inotifywatch用于收集文件系统的统计数据,例如发生了多少次inotify事件,某文件被访问了多少次等等,一般用不上。

三、inotify相关内核参数

文件

默认值

作用说明

max_user_watches

8192

设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)

max_user_instances

128

设置每个用户可以运行的inotifywait或inotifywatch命令的进程数

max_queued_events

16384

设置inotify实例事件(event)队列可容纳的事件数量

可以调大三个文件的数值,使监听范围更大

如:

[root@web01~]#echo 30000 >/proc/sys/fs/inotify/max_user_watches

四、inotifywait命令参数说明

参数

含义

-m, --monitor

(重要参数)

始终保持事件监听。

-d, --daemon

111

-r, --recursive

(重要参数)

递归监控目录数据信息变化

-o, --outfile <file>

打印事件到文件中,相当于标准正确输出

-s, --syslog

发送错误到syslog相当于标准错误输出

-q, --quiet

(重要参数)

输出信息少(只打印事件信息)

--exclude <pattern>

排除文件或目录

--excludei <pattern>

排除文件或目录时,不区分大小写

--timefmt <fmt>

(重要参数)

指定时间输出格式

--format <fmt>

(重要参数)

打印使用指定的输出类似格式字符串;即实际监控输出内容

-e

(重要参数)

指定监听指定的事件,如果省略,表示所有事件都进行监听

 

4.1 inotifywait 参数 --format <fmt>格式定义参数

命令参数

参数说明

%w

事件出现时,监控文件或目录的名称信息

%f

事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空

%e

显示发生的事件信息,不同的事件信息用逗号进行分隔

%Xe

显示发生的事件名称,不同的事件信息有X进行分隔,可以修改X为指定分隔符

%T

"--timefmt"定义的时间格式输出当前时间,要求同时定义"--timefmt"

 

4.2 inotifywait 参数--timefmt <fmt>时间格式参数

命令参数

参数说明

%d(重要参数)

每月的第几天,显示倍息为十进制数(范围是 01-31 )

%m(重要参数)

显示月份,显示信息为十进制(范围 01-12 )

%M

显示分钟,显示信息为十进制(范围 00-59 )

%y(重要参数)

年份信息,显示信息为十进制,并且没有世纪信息

%Y

年份信息,显示信息为十进制,并且包含世纪信息

%H

小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )

4.3 -e[参数]  可以指定的事件类型

事件名称

事件说明

access

文件或目录内容被读取

modify

文件或目录内容被写入

attrib

文件或目录属性改变

close_write

(重要参数)

文件或目录关闭,在写入模式打开之后关闭的。

close_nowrite

文件或目录关闭,在只读模式打开之后关闭的

close

文件或目录关闭,不管读或是写模式

open

文件或目录被打开

moved_to

文件或目录被移动到监控的目录中

moved_from

文件或目录被移出从监控的目录中

move

(重要参数)

文件或目录不管移动到或是移出监控目录都触发事件

create

(重要参数)

文件或目录创建在监控目录中

delete

(重要参数)

文件或目录被删除在监控目录中

delete_self

文件或目录被删除,目录本身被删除

unmount

挂载在被监控目录上的文件系统被umount,umount后不再监控此目录

isdir

监控目录先关操作

五、示例

inotifywait监控中的事件测试:

首先创建一个目录:

[root@web01 ~]# mkdir /data

在xshell中再打开一个会话进行创建文件操作,一个会话进行前台监控,一个会话进行文件操作

1.创建事件

[root@web01 data]# touch 1.txt

[root@web01 data]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e create

10-11-18 12:31 /data/1.txt 事件信息: CREATE

2.删除事件

[root@web01 data]# rm -rf 1.txt

[root@web01 data]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e delete

10-11-18 12:42 /data/1.txt 事件信息: DELETE

3.修改事件

[root@web01 data]# echo "123" > 1.txt

[root@web01 data]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e close_write

10-11-18 12:44 /data/1.txt 事件信息: CLOSE_WRITE,CLOSE

4.移动事件

[root@web01 data]# mv /etc/hosts ./

[root@web01 data]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_to

10-11-18 12:47 /data/hosts 事件信息: MOVED_TO

[root@web01 data]# mv 2.txt /tmp/

[root@web01 data]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_from

10-11-18 12:49 /data/2.txt 事件信息: MOVED_FROM

六、inotify+rsync实时同步服务部署

 rsync服务端部署

1.查看软件是否存在

[root@web02 ~]# rpm -qa | grep rsync

rsync-3.0.6-12.el6.x86_64

2.进行rsync服务配置

[root@web02 ~]# vim /etc/rsyncd.conf

uid = rsync

gid = rsync

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

ignore errors

read only = false

list = false

hosts allow = 192.168.231.142

auth users = rsync_backup

secrets file = /etc/rsync.password

[backup1]

comment = "test"

path = /backup/test1

[backup2]

comment = "test2"

path = /backup/test2

3.创建rsync管理用户

[root@web02 ~]# useradd -s /sbin/nologin -M rsync

4.创建认证用户密码文件并授权

[root@web02 ~]# echo "reync_backup:123456" > /etc/rsync.password

[root@web02 ~]# chmod 600 /etc/rsync.password

5.创建备份目录,修改属主属组

[root@web02 ~]# mkdir -p /backup/{test1,test2}

chmod -R rsync.rsync /backup/

6.启动rsync服务

[root@web02 ~]# rsync --daemon

[root@web02 ~]# netstat -lntup | grep rsync

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      11759/rsync         

tcp        0      0 :::873                      :::*                        LISTEN      11759/rsync        

 

rsync客户端配置

1.检查软件是否存在

[root@web01 ~]# rpm -qa |grep rsync

rsync-3.0.6-12.el6.x86_64

2.创建安全认证文件,并修改权限

[root@web01 ~]# echo "123456" > /etc/rsync.password

[root@web01 ~]# chmod 600 /etc/rsync.password

3.传输测试

[root@web01 zhang]# ls

1.txt  2.txt  3.txt  4.txt  5.txt

[root@web01 ~]# rsync -avz /zhang rsync_backup@192.168.231.143::backup1 --password-file=/etc/rsync.password

sending incremental file list

zhang/

zhang/1.txt

zhang/2.txt

zhang/3.txt

zhang/4.txt

zhang/5.txt


sent 277 bytes  received 107 bytes  768.00 bytes/sec

total size is 0  speedup is 0.00

部署inotify服务

1.安装inotify-tools软件

[root@web02 ~]# yum install inotify-tools

2.在rsync客户端编写脚本,实现rsync+inotify软件功能结合

#!/bin/bash

Path=/zhang

backup_Server=192.168.231.143

/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /zhang  | while read line  

do

    if [ -f $line ];then

        rsync -az $line --delete rsync_backup@$backup_Server::backup1 --password-file=/etc/rsync.password

    else

        cd $Path &&\

        rsync -az ./ --delete rsync_backup@$backup_Server::backup1 --password-file=/etc/rsync.password

    fi  

done

 

测试

1.让脚本在后台运行

[root@web01 zhang]# sh /root/scripts/inotify.sh &

[1] 11788

[root@web01 zhang]# touch {1..5}.txt

[root@web01 zhang]# ls

1.txt  2.txt  3.txt  4.txt  5.txt

2.当创建文件后,就会把文件同步到web02,rsync服务端
 

[root@web02 ~]# ll /backup/test1/

total 0

-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 1.txt

-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 2.txt

-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 3.txt

-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 4.txt

-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 5.txt

脚本停止方法

1.先查看后台都有哪些程序在运行

[root@web01 ~]# jobs

[1]+  Running                 sh scripts/inotify.sh &

2.在把程序调到前台按[Ctrl] + z挂起当前任务

[root@web01 ~]# jobs

[1]+  Running                 sh scripts/inotify.sh &

想要结束任务时,把[Ctrl] + z替换成[Ctrl]+c

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

real向往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值